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

 
 
> AT89S8253 & Keil (C51) & EEPROM, проблема с размещением float в EEPROM
SSB777
сообщение Nov 13 2006, 07:19
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 16-10-06
Пользователь №: 21 343



Господа, помогите советом
Суть проблемы:
устройство на контроллере AT89S8253, программа на СИ пишется в Keil`e

во внутренней EEPROM необходимо хранить информацию - при размещении в EEPROM (xdata) переменных типа char или int все ОК! а вот при попытке разместить переменную типа float полная засада sad.gif

обявления
Код
sfr WMCON = 0x96;   /* Watchdog and Memory Control Register */

#define EEMEN  0x08  /* Internal EEPROM Access Enable: 1=Enabled */
#define EEMWE  0x10  /* Internal EEPROM Write Enable: 1=Enabled */
#define EEMds  0xE7  /* 11100111b Internal EEPROM Access&Write Disable */

float xdata Test;


запись (тупо, для примера)

Код
void WriteTest(void)
{
WMCON=WMCON|EEMEN;
WMCON=WMCON|EEMWE;  
Test=1.1; //0.028941;
WMCON=WMCON&EEMds;  
while (1) { if ((WMCON&0x2)==0x2) break; }
}


чтение

Код
float ReadTest(void)
{
float TempVariable;
WMCON=WMCON|EEMEN;
WMCON=WMCON|EEMWE;  
TempVariable=Test;
WMCON=WMCON&EEMds;  
while (1) { if ((WMCON&0x2)==0x2) break; }
return TempVariable;
}


в результате читаеся что угодно но только не то что записывалось

Сообщение отредактировал SSB777 - Nov 13 2006, 07:25


--------------------
Самое страшное животное - ЖАБА. Это сколько же людей она задушила!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vmp
сообщение Nov 13 2006, 07:31
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(SSB777 @ Nov 13 2006, 10:19) *
во внутренней EEPROM необходимо хранить информацию - при размещении в EEPROM (xdata) переменных типа char или int все ОК! а вот при попытке разместить переменную типа float полная засада sad.gif

в результате читаеся что угодно но только не то что записывалось


Проблема не в том, что не читается, а в том, что не пишется. Вышеприведенный алгоритм работает только при побайтовой записи. Тебе нужно либо использовать страничную запись (см. бит 5 - EELD) и аккуратно размещать переменные внутри страниц либо писать побайтово (для доступа к различным байтам использовать например union).
Go to the top of the page
 
+Quote Post
SSB777
сообщение Nov 13 2006, 08:04
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 16-10-06
Пользователь №: 21 343



Цитата
Вышеприведенный алгоритм работает только при побайтовой записи.


Было такое подозрение sad.gif
Но была надежда, что Keil "умный" и сам все сделает, в начале я вообще просто писал
Код
float xdata Test;
...
Test=1.1;
...

- увы, Keil оказался не такой уж и "умный", сам не сделал sad.gif
а жаль...

еще вопрос:
в файле STARTUP.A51 есть секция
Код
;------------------------------------------------------------------------------
;
;  User-defined Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
;              ; the absolute start-address of IDATA memory is always 0
IDATALEN        EQU     80H    ; the length of IDATA memory in bytes.
;
XDATASTART      EQU     0H     ; the absolute start-address of XDATA memory
XDATALEN        EQU     0H     ; the length of XDATA memory in bytes.
;
PDATASTART      EQU     0H     ; the absolute start-address of PDATA memory
PDATALEN        EQU     0H     ; the length of PDATA memory in bytes.
;
;  Notes:  The IDATA space overlaps physically the DATA and BIT areas of the
;          8051 CPU. At minimum the memory space occupied from the C51
;          run-time routines must be set to zero.
;------------------------------------------------------------------------------

при пользовании только внутренней EEPROM нужно прописывать XDATASTART и XDATALEN ?
и если да, то какие для AT89S8253 - 0x3000 и 0х300 ?


--------------------
Самое страшное животное - ЖАБА. Это сколько же людей она задушила!
Go to the top of the page
 
+Quote Post
vmp
сообщение Nov 13 2006, 08:18
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(SSB777 @ Nov 13 2006, 11:04) *
при пользовании только внутренней EEPROM нужно прописывать XDATASTART и XDATALEN ?


Нет. Эти объявления используются только при очистке ОЗУ. А вот IDATALEN можно изменить на 100h.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:44
Рейтинг@Mail.ru


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