Кроме FLASH-памяти программ и оперативной памяти RAM в микроконтроллере есть другой вид памяти - EEPROM. В отличии от RAM-памяти данные в памяти EEPROM сохраняются даже после выключения питания. Аббревиатура EEPROM расшифровывается как Electrically Erasable Read-Only Memory (электрически стираемая память ПЗУ). В микроконтроллерах AVR серии Classic для работы с памятью EEPROM достаточно трёх управляющих регистров:
EEAR - регистр, содержащий адрес по которому будет чтение или запись в EEPROM
EEDR - регистр с данными, которые либо считываем из памяти EEPROM, либо записываем
EECR - регистр управления

Рассмотрим работу с памятью EEPROM на основе микроконтроллера AVR ATmega8. У данного микроконтроллера 512 байт энергонезависимой памяти. И что стоит отметить количество циклов запись/стирание ограничено 100.000 (это минимальное количество, гарантированное производителем - компанией ATMEL) для каждой ячейки памяти.

Для адресации используется два регистра EEARH и EEARL т.к. для адресации 512 байт памяти необходимо 9 бит. Младшие 8 бит адресуемой ячейки хранятся в регистре EEARL, а старший 9-й бит храниться во младшем бите регистра EEARH. На иллюстрации показано распределение бит:
регистр EEAR с адресом ячейки памяти EEPROM

Регистр EEDR - обычный восьмибитный в котором находится результат при чтении из памяти или в который заносится значение при записи в EEPROM.

Рассмотрим управляющий регистр EECR:

Управляющий регистр EECR

биты [7:4] - не используются

бит EERIE [3] - EEPROM Ready Interrupt Enable или разрешение прерывания при обнулении бита EEWE (что происходит после окончания записи).

бит EEMWE [2] - EEPROM Master Write Enable - необходимо установить этот бит в "1" и в течении 4х тактов дать команду на запись - установив бит EEWE в "1". Этот бит аппаратно сбрасывается в "0" после 4 тактов.

бит EEWE [1] - EEPROM Write Enable - бит, разрешающий запись в память (при условии, что бит EEMWE установлен).

бит EERE [0] - EEPROM Read Enable - при установке соответствующего адреса ячейки, которую будем считывать, данный бит запускает процесс чтения.

Что стоит помнить при работе с энергонезависимой памятью EEPROM:

1. Она довольно медленная, по даташиту на микроконтроллер AVR ATmega8 (читай все микроконтроллеры AVR серии classic) среднее время записи в память составляет порядка 8,5 мс.

2. Возможно повреждение данных в памяти при включении/выключении питания микроконтроллера. А именно при нарастании напряжения, ядро начинает работать и выполнять код, например запись в EEPROM. Если эта команда начнет выполняться при "недостаточном", для корректной работы памяти, напряжении, то данные будут утеряны. Для минимизации таких неприятных возможностей следует использовать BOD - Brown-Out Detection. Это аппаратный блок микроконтроллера, задающее минимальное рабочее напряжение питания при котором микроконтроллер начинает работать.

3. Отслеживать количество циклов запись/стирание для предотвращения выхода ячеек из строя т.к. есть теоретическое ограничение на 100.000 обращений к каждой ячейки памяти.
Рассмотрим простой пример программы на ассемблере AVR Studio:
.include "m8def.inc"

.def    wreg    =R16

ldi      wreg, 0b10100000
out    MCUCR, wreg

ldi wreg, 0x00

main:

out   EEARL, wreg        ; запись адреса, есть еще EEARH
out   EEDR, wreg          ; данные
sbi    EECR, EEMWE
sbi    EECR, EEWE

sbic  EECR, EEWE        ; проверка окончания записи
rjmp PC-1

inc    wreg                  ; инкрементируем регистр
cpi    wreg, 0x05        ; сравниваем значение с константой 0x05

breq PC+2                  ; перепрыгиваем через след. команду
; если равенство выполняется т.е. wreg = 0x05

rjmp    main
sleep
Просимулируйте работу программы в AVR Studio. Запуск симуляции - CTRL + F7. Для просмотра содержимого  памяти нажмите ALT + 4 и в выпадающем списке в левом верхнем углу выберите EEPROM.
В результате работы данной программы в памяти EEPROM будут следующие данные:

Симуляция работы с EEPROM в AVR Studio

Всё верно, так и должно быть - сначала данные в ячейке wreg являлись и адресом ячейки и значением, которое записывалось в ячейку. Ячейка инкрементировалась, и как только значение в этой ячейке стало равно 0x05, выполнилась команда PC+2 - "перескок" через следующую команду ("перескок" через команду rjmp main).

Скачать исходник данной программы для микроконтроллера AVR ATmega8

 

Добавить комментарий


Защитный код
Обновить