Кроме 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. На иллюстрации показано распределение бит:
Регистр EEDR — обычный восьмибитный в котором находится результат при чтении из памяти или в который заносится значение при записи в EEPROM.
Рассмотрим управляющий регистр 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:
{codecitation class=»brush: vb; gutter: true;» width=»700px» }
.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
{/codecitation}
Просимулируйте работу программы в AVR Studio. Запуск симуляции — CTRL + F7. Для просмотра содержимого памяти нажмите ALT + 4 и в выпадающем списке в левом верхнем углу выберите EEPROM.
В результате работы данной программы в памяти EEPROM будут следующие данные:
Всё верно, так и должно быть — сначала данные в ячейке wreg являлись и адресом ячейки и значением, которое записывалось в ячейку. Ячейка инкрементировалась, и как только значение в этой ячейке стало равно 0x05, выполнилась команда PC+2 — «перескок» через следующую команду («перескок» через команду rjmp main).
Скачать исходник данной программы для микроконтроллера AVR ATmega8
Просмотров всего: 2 083, сегодня: 1