Перейти к содержанию
    

переход с AT89S8252 на AT89S8253

Если кто сталкивался с такой проблемой, поделитесь пожалуйста опытом, касательно изменения существующих программ под новый чип, особенно в части взаимодействия с EEPROM. :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если кто сталкивался с такой проблемой, поделитесь пожалуйста опытом, касательно изменения существующих программ под новый чип, особенно в части взаимодействия с EEPROM. :help:

 

Посмотрите по ссылке в статье п. 17.2 отличия ЭСППЗУ

http://www.ineltek.ru/html.cgi/txt/publ/_ineltek/recom.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объясните непонятливому, как пользоваться этой "страничной" записью в EEPROM, если мне вовсе не требуется писать все 32 бита. Требуется только 1 или 2.

Просто пишем в буфер любое требуемое кол-во байт (не более 32) и разрешаем сброс буфера в EEPROM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если кто сталкивался с такой проблемой, поделитесь пожалуйста опытом, касательно изменения существующих программ под новый чип, особенно в части взаимодействия с EEPROM. :help:

 

Посмотрите по ссылке в статье п. 17.2 отличия ЭСППЗУ

http://www.ineltek.ru/html.cgi/txt/publ/_ineltek/recom.htm

 

Да, на эту ссылку я уже натыкался, но вот проблемы это не решило.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне в другом месте уже пояснили (не относительно этого чипа, а в общем) таким образом: Это только _возможность_ писать целую страницу целиком (т.е. НЕ 32 байта, а ДО 32 байт за раз). Косвенно это подтверждается тем, что в даташите написано, что при работе программы (изнутри чипа) обеспечивается автоматическое стирание при записи каждого байта EEPROM.

Я попробовал - побайтная запись изнутри программы в отдельные ячейки EEPROM заработала в старой программе (написанной для 89S8252)без дополнительных переделок программы. Все, что сделал - поправил символические имена регистров спецфункций (раньше регистр управления был общий для EEPROM и WDT, теерь - раздельный).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне в другом месте уже пояснили (не относительно этого чипа, а в общем) таким образом: Это только _возможность_ писать целую страницу целиком (т.е. НЕ 32 байта, а ДО 32 байт за раз). Косвенно это подтверждается тем, что в даташите написано, что при работе программы (изнутри чипа) обеспечивается автоматическое стирание при записи каждого байта EEPROM.

Я попробовал - побайтная запись изнутри программы в отдельные ячейки EEPROM заработала в старой программе (написанной для 89S8252)без дополнительных переделок программы. Все, что сделал - поправил символические имена регистров спецфункций (раньше регистр управления был общий для EEPROM и WDT, теерь - раздельный).

 

А как вы осуществляли проверку состояния (rdy/bsy)? И начало и окончание записи, или только окончание?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заработала побайтная запись. Действительно необходимо ожидать начала и окончания записи. А так, отличия от at 89S8252 только в регистрах настроек eeprom и сторожевого таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заработала побайтная запись. Действительно необходимо ожидать начала и окончания записи. А так, отличия от at 89S8252 только в регистрах настроек eeprom и сторожевого таймера.

 

Если быть точным, то надо сначала записать 1 байт, потом проверить RDY/BUSY == 1, потом RDY/BUSY == 0, а затем RDY/BUSY = 1, и только после этого что-то делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если быть точным, то надо сначала записать 1 байт, потом проверить RDY/BUSY == 1, потом RDY/BUSY == 0, а затем RDY/BUSY = 1, и только после этого что-то делать.

 

У жука 8253 почему-то медленно сбрасывается флаг RDY/BUSY.

Поэтому, после начала записи надо дождаться RDY=0, потом дождаться RDY=1.

Это будет означать, что байт записан и можно начинать следующую

операцию записи.

Например, приблизительно так (IAR C):

/*-------------------------------------*/
void eeprom_rdy (void)
{
for (;;) {if ((EECON & (1 << EERDY)) != 0) break;}
}
/*-------------------------------------*/
void eeprom_rdy0 (void)
{
for (;;) {if ((EECON & (1 << EERDY)) == 0) break;}
}
/*-------------------------------------*/
write_byte (word ad, byte dat)
{
data byte *pxdata;

pxdata = (byte *) (0x010000 | ad);

DI
EECON |= (1 << EEMEN) | (1 << EEMWE);
EI

*pxdata   = dat; 

eeprom_rdy0 ();
eeprom_rdy   ();

DI
EECON &= ~((1 << EEMEN) | (1 << EEMWE));
EI
}
/*-------------------------------------*/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...