Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT89S8253 & Keil (C51) & EEPROM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
SSB777
Господа, помогите советом
Суть проблемы:
устройство на контроллере 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;
}


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

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


Проблема не в том, что не читается, а в том, что не пишется. Вышеприведенный алгоритм работает только при побайтовой записи. Тебе нужно либо использовать страничную запись (см. бит 5 - EELD) и аккуратно размещать переменные внутри страниц либо писать побайтово (для доступа к различным байтам использовать например union).
SSB777
Цитата
Вышеприведенный алгоритм работает только при побайтовой записи.


Было такое подозрение 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 ?
vmp
Цитата(SSB777 @ Nov 13 2006, 11:04) *
при пользовании только внутренней EEPROM нужно прописывать XDATASTART и XDATALEN ?


Нет. Эти объявления используются только при очистке ОЗУ. А вот IDATALEN можно изменить на 100h.
SSB777
Спасибо.

Буду думать как выйти из положения.

Вообщето в xdata предполагалось разместить массив записей такого типа:

Код
// запись таблицы калибровки
typedef struct {
                       float Interval;
                       float Ki;
                       float Bi;
                     } TKalibrRecord;
...
xdata TKalibrRecord TKalibr[5];  
...


и по ходу программы к этим записям нужно обращаться, для вычислений значения линейной функции
( Y=Ki*x+Bi ) в зависимости от значения аргумента (в каком Intervale) нужно подставлять соотетсвующие Ki и Bi.
в общем кусочно-линейная апроксимация характеристики цепочки "датчик+АЦП"
vmp
Цитата(SSB777 @ Nov 13 2006, 12:05) *
Вообщето в xdata предполагалось разместить массив записей такого типа:
и по ходу программы к этим записям нужно обращаться, для вычислений значения линейной функции



По идее в режиме чтания все должно работать. А для записи - вызывать отдельную подпрограмму.
Или даже писать отдельной программой калибровки.
SSB777
Посмотрел, что Keil делает:
Код
; FUNCTION WriteTest (BEGIN)
0000 439608            ORL     WMCON,#08H
0003 439610            ORL     WMCON,#010H
0006 900000      E     MOV     DPTR,#TestVAR
0009 120000      E     LCALL   ?C?LSTKXDATA
000C 3F                DB      03FH
000D 8C                DB      08CH
000E CC                DB      0CCH
000F CD                DB      0CDH
0010 5396E7            ANL     WMCON,#0E7H
0013         ?C0045:
0013 E596              MOV     A,WMCON
0015 30E1FB            JNB     ACC.1,?C0045
0018         ?C0048:
0018 22                RET    
; FUNCTION WriteTest (END)


что за функция "?C?LSTKXDATA" ?
vmp
Цитата(SSB777 @ Nov 13 2006, 13:00) *
что за функция "?C?LSTKXDATA" ?


Загрузи код в симулятор и посмотри.

C51: ?C? LOAD AND STORE LIBRARY ROUTINES
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.