реклама на сайте
подробности

 
 
> запись в eeprom
sergey sva
сообщение Sep 21 2008, 08:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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
;------------------------------------------------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergey sva
сообщение Sep 22 2008, 12:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
;------------------------------------------------------------

Не пойму почему так получается, не записывается в еепром байт, ошибок не каких при компиляции
нет. Подскажите что можно сделать ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 22 2008, 14:02
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 23 2008, 10:24
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 же и работать.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 21:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016