Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: запись в eeprom
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
sergey sva
Помогите разобраться с проблемой. Компилятор 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
;------------------------------------------------------------
sergey sva
Цитата(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
;------------------------------------------------------------

Не пойму почему так получается, не записывается в еепром байт, ошибок не каких при компиляции
нет. Подскажите что можно сделать ?
Палыч
Вы подсчитайте количество команд movx между установкой и сбросом бита EEE. Очевидно, что "левый" movx и мешает нормальной записи в EEPROM.
Сергей Борщ
Цитата(sergey sva @ Sep 22 2008, 15:51) *
Подскажите что можно сделать ?
1) Отредактировать предыдущее сообщение, выкинув из него совершенно ненужное цитирование первого.
2) Взять даташит на контроллер. Найти описание процесса записи в eeprom. Внимательно его прочитать. Прикинуться контроллером и в уме или на бумаге пройти по шагам приведенный вами листинг и найти отличие от описанной в даташите процедуры. Вы думаете, кто-то из фуромчан должен это сделать за вас?
Палыч
Цитата(Сергей Борщ @ 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 же и работать.
Verifi
Пиши в Keil всё при симуляции и компилировании всё работает,а не проше запись в EEPROM написать на асме 5-8 команд и вставить в вашу си прогу
Сергей Борщ
Цитата(Палыч @ Sep 23 2008, 13:24) *
Да, зачем "прикидываться"?
Чтобы найти ошибку самостоятельно.
Цитата(Палыч @ Sep 23 2008, 13:24) *
По-моему - всё очевидно.
Это для вас очевидно. Потому что вы знаете, как происходит запись в eeprom, вы пробежали глазами листинг, подсознательно его выполнили в уме и нашли расхождение со своим эталоном. Я лишь пытался объяснить, как спрашивавший мог добиться таких же успехов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.