Многие микроконтроллеры AVR оборудованы встроенной памятью EEPROM – электрически перезаписываемой энергонезависимой памятью. Хотя эта память и допускает запись, она редко используется для хранения программных переменных, поскольку, во-первых, медленнодействующая, и, во-вторых, имеет ограниченный (хотя и довольно большой) цикл перезаписи.
Учитывая вышесказанное, память EEPROM используют, преимущественно, для хранения данных, которые не должны быть потеряны даже при потере питания. Это очень удобно, к примеру, при калибровке измерительных приборов, работающих под управлением микроконтроллеров, у которых в памяти EEPROM в процессе настройки сохраняются параметры корректировки. Благодаря этому, в большинстве случаев полностью отпадает необходимость в настроечных потенциометрах и триммерах.
В отличие от флэш-памяти, для записи/чтения памяти EEPROM нет необходимости в специальном программаторе – эти операции доступны программно и допускают побайтную передачу данных с помощью регистра управления EECR, регистра данных EEDR и регистровой пары EEARL, EEARH, определяющей адрес ячейки памяти (см. табл. 1.1).
Запись байта данных в память EEPROM осуществляется по следующей схеме:
удостовериться, что в разряде EEWE (разряд 1) регистра EECR находится лог. 0 (разрешение записи);
записать адрес ячейки EEPROM в регистр EEAR;
записать байт данных в регистр EEDR;
установить в лог. 1 разряд EEMWE (разряд 2) регистра EECR;
установить в лог. 1 разряд ЕЕWE (разряд 1) регистра EECR, чтобы активизировать процесс записи.
По окончанию цикла программирования разряд EEWE аппаратно автоматически сбрасывается в лог. 0. Программа пользователя должна непрерывно опрашивать этот разряд, ожидая появления лог. 0, прежде чем приступить к программированию следующего байта.
Чтение байта данных из памяти EEPROM осуществляется по такой схеме:
записать адрес ячейки EEPROM в регистр EEAR;
установить в лог. 1 разряд EERE (разряд 0) регистра EECR, чтобы активизировать процесс чтения;
по окончанию считывания разряда EERE аппаратное обеспечение считывает требуемый байт в регистр EEDR, после чего уже нет необходимости вновь опрашивать разряд EERE, поскольку считывание длится только один цикл такта системной синхронизации.
Перед началом операции чтения программа пользователя должна постоянно опрашивать разряд EEWE и ждать появления лог. 0. Если во время программирования памяти EEPROM в соответствующий регистр будет записан новый адрес или данные, то еще продолжающийся процесс программирования будет прерван, и результат будет неопределенным!