Кроме 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:
{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 будут следующие данные:
Симуляция работы с EEPROM в AVR Studio
Всё верно, так и должно быть — сначала данные в ячейке wreg являлись и адресом ячейки и значением, которое записывалось в ячейку. Ячейка инкрементировалась, и как только значение в этой ячейке стало равно 0x05, выполнилась команда PC+2 — «перескок» через следующую команду («перескок» через команду rjmp main).

Скачать исходник данной программы для микроконтроллера AVR ATmega8
 
Просмотров всего: 2 083, сегодня: 1

Напишите комментарий