|
запись в eeprom |
|
|
|
Sep 21 2008, 08:37
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Помогите разобраться с проблемой. Компилятор sdcc микроконтроллер at89c51ed2. для записи в епром использую такую функцию: Код //-------------------------------------------------------------------------------------------------- void EEPROM_WRITE(unsigned int adress, unsigned char dan) { bit EATEMP=0; while(EECON & 0x01){} EATEMP=EA; EA = 0;
EECON = 0x02;
*(( unsigned char __xdata*)adress) = dan;
EECON = 0x00;
EA = EATEMP; }// end void EEPROM_WRITE(unsigned char adress, unsigned char dan) //-------------------------------------------------------------------------------------------------- в кейле это работает в sdcc не хочет. Вот сгенерированный sdcc асм . Код ; ----------------------------------------- _EEPROM_WRITE: mov r2,dph mov a,dpl mov dptr,#_EEPROM_WRITE_adress_1_1 movx @dptr,a inc dptr mov a,r2 movx @dptr,a ; DOP_FUNC.C:170: while(EECON & 0x01){} 00101$: mov a,_EECON jb acc.0,00101$ ; DOP_FUNC.C:171: EATEMP=EA; mov c,_EA mov _EEPROM_WRITE_EATEMP_1_1,c ; DOP_FUNC.C:172: EA = 0; clr _EA ; DOP_FUNC.C:174: EECON = 0x02; mov _EECON,#0x02 ; DOP_FUNC.C:176: *(( unsigned char __xdata*)adress) = dan; mov dptr,#_EEPROM_WRITE_adress_1_1 movx a,@dptr mov r2,a inc dptr movx a,@dptr mov r3,a mov dptr,#_EEPROM_WRITE_PARM_2 movx a,@dptr mov dpl,r2 mov dph,r3 movx @dptr,a ; DOP_FUNC.C:178: EECON = 0x00; mov _EECON,#0x00 ; DOP_FUNC.C:180: EA = EATEMP; mov c,_EEPROM_WRITE_EATEMP_1_1 mov _EA,c ret ;------------------------------------------------------------
|
|
|
|
|
 |
Ответов
(1 - 6)
|
Sep 22 2008, 12:51
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(sergey sva @ Sep 21 2008, 12:37)  Помогите разобраться с проблемой. Компилятор sdcc микроконтроллер at89c51ed2. для записи в епром использую такую функцию: Код //-------------------------------------------------------------------------------------------------- void EEPROM_WRITE(unsigned int adress, unsigned char dan) { bit EATEMP=0; while(EECON & 0x01){} EATEMP=EA; EA = 0;
EECON = 0x02;
*(( unsigned char __xdata*)adress) = dan;
EECON = 0x00;
EA = EATEMP; }// end void EEPROM_WRITE(unsigned char adress, unsigned char dan) //-------------------------------------------------------------------------------------------------- в кейле это работает в sdcc не хочет. Вот сгенерированный sdcc асм . Код ; ----------------------------------------- _EEPROM_WRITE: mov r2,dph mov a,dpl mov dptr,#_EEPROM_WRITE_adress_1_1 movx @dptr,a inc dptr mov a,r2 movx @dptr,a ; DOP_FUNC.C:170: while(EECON & 0x01){} 00101$: mov a,_EECON jb acc.0,00101$ ; DOP_FUNC.C:171: EATEMP=EA; mov c,_EA mov _EEPROM_WRITE_EATEMP_1_1,c ; DOP_FUNC.C:172: EA = 0; clr _EA ; DOP_FUNC.C:174: EECON = 0x02; mov _EECON,#0x02 ; DOP_FUNC.C:176: *(( unsigned char __xdata*)adress) = dan; mov dptr,#_EEPROM_WRITE_adress_1_1 movx a,@dptr mov r2,a inc dptr movx a,@dptr mov r3,a mov dptr,#_EEPROM_WRITE_PARM_2 movx a,@dptr mov dpl,r2 mov dph,r3 movx @dptr,a ; DOP_FUNC.C:178: EECON = 0x00; mov _EECON,#0x00 ; DOP_FUNC.C:180: EA = EATEMP; mov c,_EEPROM_WRITE_EATEMP_1_1 mov _EA,c ret ;------------------------------------------------------------ Не пойму почему так получается, не записывается в еепром байт, ошибок не каких при компиляции нет. Подскажите что можно сделать ?
|
|
|
|
|
Sep 22 2008, 14:02
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergey sva @ Sep 22 2008, 15:51)  Подскажите что можно сделать ? 1) Отредактировать предыдущее сообщение, выкинув из него совершенно ненужное цитирование первого. 2) Взять даташит на контроллер. Найти описание процесса записи в eeprom. Внимательно его прочитать. Прикинуться контроллером и в уме или на бумаге пройти по шагам приведенный вами листинг и найти отличие от описанной в даташите процедуры. Вы думаете, кто-то из фуромчан должен это сделать за вас?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 23 2008, 10:24
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Сергей Борщ @ Sep 22 2008, 17:02)  Прикинуться контроллером и в уме или на бумаге пройти по шагам приведенный вами листинг и найти отличие от описанной в даташите процедуры. Вы думаете, кто-то из фуромчан должен это сделать за вас? Да, зачем "прикидываться"? По-моему - всё очевидно. Вот кусок сгенерированного кода между установкой и сбросом бита ЕЕЕ в регистре EECON с моими коментариями Код ; DOP_FUNC.C:174: EECON = 0x02; mov _EECON,#0x02 ; DOP_FUNC.C:176: *(( unsigned char __xdata*)adress) = dan; mov dptr,#_EEPROM_WRITE_adress_1_1 movx a,@dptr ;;; "левый" movx раз mov r2,a inc dptr movx a,@dptr ;;; "левый" movx два mov r3,a mov dptr,#_EEPROM_WRITE_PARM_2 movx a,@dptr ;;; "левый" movx три mov dpl,r2 mov dph,r3 movx @dptr,a ;;; нужный movx ; DOP_FUNC.C:178: EECON = 0x00; mov _EECON,#0x00 После установки бита ЕЕЕ команда movx начинает работать как обращение к EEPROM. Вопрос: "К какой памяти будет обращение по первым трём командам movx из приведенного куска кода?" Транслятор о таких особенностях организации памяти ничего не знает, за битом EEE не следит, ошибок не выдаёт. Что делать? Написать процедуру записи(чтения) в(из) EEPROM на ассемблере. Или, раз уж в Keil всё работает, на Keil'e же и работать.
|
|
|
|
|
Sep 23 2008, 12:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Палыч @ Sep 23 2008, 13:24)  Да, зачем "прикидываться"? Чтобы найти ошибку самостоятельно. Цитата(Палыч @ Sep 23 2008, 13:24)  По-моему - всё очевидно. Это для вас очевидно. Потому что вы знаете, как происходит запись в eeprom, вы пробежали глазами листинг, подсознательно его выполнили в уме и нашли расхождение со своим эталоном. Я лишь пытался объяснить, как спрашивавший мог добиться таких же успехов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|