Ответ: Про EEPROM
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено brake 25 декабря 2003 г. 08:53
В ответ на: Не поможет кто примерчиком, как в IAR AVR Internal EEPROM использовать. Типа функцию записать байт по адресу, прочитать байт по адресу. Как такие константы (переменные) объявляются и какие настройки необхрдимы? отправлено back 22 декабря 2003 г. 19:57

Теоретически компилятор работает с EEPROM как собычной памятью.
Например, если объявить структуры,

__no_init __eeprom TGrad IGrad; // EEPROM
TGrad Grad; // RAM

то можно выполнять присваивания

Grad=IGrad;
IGrad=Grad;

и компилятор сделает все сам.

ОДНАКО, ПРАКТИЧЕСКИ, в библиотеке для работы с EEPROM
есть ошибка в подпрограмме блочного копирования из
16-ти разрядной EEPROM (в смысле ширины адреса, а не данных, т. е.
если обьем EEPROM больше 256, но меньше 64К) в RAM.
В библиотекие три комплекта подпрограмм для работы
с EEPROM - для EEPROM с 8-ми, 16-ти и 24-х разрядным адресом.
Эту ошибка есть в версиях 2.26 и 2.27. Может быть в 2.28 уже
исправлено - не знаю.

Поэтому из EEPROM в RAM я копирую так (mega16 EEPROM 512 B):
объявляю

unsigned int i;
__near byte *p;
__no_init __eeprom char E[1] @0; // указатель на начало EEPROM

и

p=(byte*)&Grad;
for (i=(word)&IGrad; i<(word)&IGrad+sizeof(TGrad); i++) *p++=E[i];

Подпрограмма чтения БАЙТА из EEPROM работает нормально.
Если у Вас EEPROM с 8-ми или 24-х (!!!) разрядным адресным
пространством, то, вообще, никаких проблем.

Эту ошибку хорошо видно в исходном тексте библиотеки.
Там неправильно поставлена метка перехода.
Я пытался поправить, но, поскольку в течении 15 минут
не получилось откомпилировать библиотеку (в bat фале там какие то ошибки), то плюнул на это дело и пользуюсь выше приведенным способом.

Удачи.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru