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

 
 
> запись в 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
Ответов (1 - 6)
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, 13:57
Сообщение #3


Гуру
******

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



Вы подсчитайте количество команд movx между установкой и сбросом бита EEE. Очевидно, что "левый" movx и мешает нормальной записи в EEPROM.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 22 2008, 14:02
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Verifi
сообщение Sep 23 2008, 12:25
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 5-05-08
Из: Kursk
Пользователь №: 37 282



Пиши в Keil всё при симуляции и компилировании всё работает,а не проше запись в EEPROM написать на асме 5-8 команд и вставить в вашу си прогу


--------------------
"Если я в чем-то сомневаюсь, я возвращаюсь к началу"
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 23 2008, 12:34
Сообщение #7


Гуру
******

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

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 17:23
Рейтинг@Mail.ru


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