Микроконтроллеры AVR Atmega48/88/168/328 содержат память EEPROM объемом 256/512/512/1K байт соответственно. EEPROM в микроконтроллерах AVR поддерживает до 100 000 циклов перезаписи. Доступ к энергонезависимой памяти осуществляется посредством регистров трёх видов:
- EEARH, EEARL - регистры адресации ячеек памяти. В Atmega48 регистр EEARH отсутствует, поскольку в данном типе микроконтроллера присутствует всего 256 ячеек памяти. EEARH отвечает за старший байт адреса ячейки памяти, EEARL за младший байт;
- EEDR - регистр для записи и чтения данных;
- EECR - регистр контроля, в данном регистре производится настройка тех действий, которые должны быть выполнены с памятью.
Подробное описание регистров EEPROM
EEARH и EEARL - регистры адреса ячейки EEPROM
Биты с 9-го по 15 зарезервированы и всегда считываются со значением ноль.
Биты с 0-го по 8 используются для указания номера ячейки памяти EEPROM, к которой будет производиться обращение.
EEDR - регистр данных EEPROM
Биты с 2-го по 7 - биты в которых записывается информация, которая должна быть записана в EEPROM или прочитана из неё.
Биты с 6-го по 7 - биты являются зарезервированными
Биты с 4-го по 5 - EEPM1 и EEPM0 - используются для установки режима работы EEPROM.
- EEPM1 = 0, EEPM0 = 0 - Атомарная операция удаления и записи данных (длительность 3,4 мс)
- EEPM1 = 0, EEPM0 = 1 - Только удаление данных (длительность 1,8 мс)
- EEPM1 = 1, EEPM0 = 0 - Только запись данных (длительность 1,8 мс)
- EEPM1 = 1, EEPM0 = 1 - Зарезервировано для будущего использования
Бит 3 - EERIE - данный бит используется для включения прерывания, в том случае, если Вы разрешили прерывания в прошивке своего контроллера.
Бит 2 - EEMPE - бит защиты от записи. Откладывает процесс записи данных в EEPROM на четыре цикла, чтобы EEPROM успела подготовиться к записи данных.
Бит 1 - EEPE - бит старта записи, выставляется для запуска записи, очищается в ноль аппаратно, в тот момент когда запись завершена. Поэтому может использоваться для контроля процесса записи данных в EEPROM .
Бит 0 - EERE - бит старта чтения. выставляется для запуск чтения из EEPROM.
Операции чтения и записи
EEPROM в Atmega очень медлительный интерфейс, который требует до 4 мс для совершения операций записи. Поэтому очень важно проверять, что предыдущая операция записи завершена успешно.
;======= Процедура записи в EEPROM ====================================================== EEWrite: sbic EECR,EEPE ; Ожидаем, когда закончится предыдущая операция записи. rjmp EEWrite ; Не выходим из цикла до тех пор, пока не очистится флаг EEPE cli ; После чего выставляем запрет на прерывания. out EEARL,r16 ; Устанавливаем адрес ячейки, к которой будем обращаться out EEDR,r17 ; а также записываем в регистр данных информацию, ; которую будем сохранять sbi EECR,EEMPE ; устанавливаем защиту на запись sbi EECR,EEPE ; устанавливаем флаг записи sei ; после чего разрешаем прерывания ret ; и возвращаемся из подпрограммы. ;======= Процедура чтения из EEPROM ==================================================== EERead: sbic EECR,EEPE ; Ожидаем, когда закончится предыдущая операция записи. rjmp EERead out EEARL, r16 ; Устанавливаем адрес ячейки, к которой будем обращаться sbi EECR,EERE ; Запускаем чтение установкой флага на чтение in r17, EEDR ; Возвращаем результат чтения в нужный регистр ret ;=======================================================================================