Все микроконтроллеры семейства Mega имеют в своем составе энергонезависимую память (EEPROM-память). Объем этой памяти колеблется от 256 байт в моделях ATmega48x до 4 Кбайт в старших моделях. EEPROM-память расположена в своем адресном пространстве и так же, как и ОЗУ, организована линейно.
Для работы с EEPROM-памятью используются три регистра ввода/вывода: регистр адреса, регистр данных и регистр управления, адреса которых для разных моделей микроконтроллеров приведены в таблице.
Регистры EEPROM
Регистр адреса EEAR (EEPROM Address Register) физически размещается в двух РВВ — EEARH:EEARL. В этот регистр загружается адрес ячейки, к которой будет производиться обращение. Регистр адреса доступен как для записи, так и для чтения. Причем в регистре EEARH используются только младшие биты (количество задействованных битов зависит от объема EEPROM-памяти). Незадействованные биты регистра EEARH доступны только для чтения и содержат нули.
Во время записи в регистр данных EEDR (EEPROM Data Register) заносятся значения, которые будут сохранены в EEPROM по адресу, определяемому регистром EEAR, а во время чтения в этот регистр помещаются данные, считанные из EEPROM.
Регистр управления EECR (EEPROM Control Register) используется для управления доступом к EEPROM-памяти. Формат этого регистра показан на рисунке,а описание его битов для различных моделей приведено в таблице.
Биты регистра EECR
Процедура записи одного байта в EEPROM-память состоит из следующих этапов:
1. Дождаться готовности EEPROM к записи данных (ждать, пока не сбросится флаг EEWE (ЕЕРЕ) регистра EECR).
2. Дождаться завершения записи в FLASH-память программ.
3. Загрузить байт данных в регистр EEDR, а требуемый адрес — в регистр EEAR (при необходимости).
4. Установить в 1 флаг EEMWE (ЕЕМРЕ) регистра EECR.
5. В течение 4 тактов после установки флага EEMWE (ЕЕМРЕ) записать в бит EEWE (ЕЕРЕ) регистра EECR лог. 1. После установки этого бита процессор пропускает 2 такта перед выполнением следующей инструкции.
Второй пункт введен из-за того, что запись в EEPROM не может выполняться одновременно с записью в FLASH-память. Поэтому перед выполнением записи в EEPROM следует убедиться, что программирование FLASH-памяти завершено. Если загрузчик в программе отсутствует,
При записи в EEPROM могут возникнуть некоторые проблемы, вызванные прерываниями:
1. При возникновении прерывания между 4-м и 5-м этапом описанной последовательности запись в EEPROM будет сорвана, так как за время обработки прерывания флаг EEMWE сбросится в 0.
2. Если в подпрограмме обработки прерывания, возникшего во время записи в EEPROM-память, также происходит обращение к ней, то будет изменено содержимое регистров адреса и данных EEPROM. В результате первая запись (прерванная) будет сорвана.
Во избежание описанных проблем настоятельно рекомендуется запрещать все прерывания (сбрасывать бит 1 регистра SREG) на время выполнения пунктов 2…5 описанной выше последовательности.
Меры предосторожности
К сожалению, у EEPROM-памяти есть один недостаток: при снижении напряжения питания хранящиеся в ней данные могут быть повреждены. Это может произойти по двум причинам:
1. Если напряжение питания ниже некоторой величины, запись в EEPROM будет произведена некорректно.
2. Микроконтроллер сам может выполнять команды некорректно, если напряжение питания будет ниже нормы.
Чтобы избежать повреждения данных, хранящихся в EEPROM, достаточно воспользоваться одним из трех следующих решений:
1. Удерживать микроконтроллер в состоянии сброса все время, пока напряжение питания находится ниже нормы. Для этого следует использовать встроенный детектор пониженного напряжения питания (Brown-Out Detector — BOD).
2. Удерживать микроконтроллер в «спящем» режиме (Power Down), пока напряжение питания находится ниже нормы. Поскольку в этом режиме микроконтроллер не может выполнять никаких команд, такое решение эффективно защищает служебные регистры EEPROM от непреднамеренной записи.
3. Хранить константы в FLASH-памяти программ, если они не должны меняться во время работы программы. Микроконтроллер не может самостоятельно производить запись в FLASH-память, соответственно при понижении напряжения питания ее содержимое не будет повреждено.
Счетчик команд.
Счетчик команд представляет собой регистр, в котором содержится адрес следующей исполняемой команды. Напрямую из программы он не доступен. Размер счетчика команд зависит от объема имеющейся памяти программ и составляет от 11 (ATmega48x) до 17 (ATmega2560x/2561x) битов.
При нормальном выполнении программы содержимое счетчика команд автоматически увеличивается на 1 или на 2 (в зависимости от выполняемой команды) в каждом такте. Этот порядок нарушается при выполнении команд перехода, вызова и возврата из подпрограмм, а также при возникновении прерываний.
После включения питания, а также после сброса микроконтроллера в счетчик программ автоматически загружается стартовый адрес ($0000 или начальный адрес сектора загрузчика). Как правило, по этому адресу располагается команда безусловного перехода к инициализационной части программы.
При возникновении прерывания в счетчик команд загружается адрес соответствующего вектора прерывания. Если прерывания используются в программе, то по адресам векторов прерываний должны размещаться команды перехода к подпрограммам обработки прерываний.
Стек.
Во всех микроконтроллерах семейства Mega стек реализован программно. Он размещается в памяти данных, и его глубина определяется только размером свободной области памяти данных. В качестве указателя стека во всех моделях используется пара регистров ввода/вывода SPH:SPL, расположенных по адресам $3Е ($5Е) и $3D ($5D) соответственно. Так как после подачи напряжения питания (или после сброса) в регистрах содержится нулевое значение, в самом начале программы указатель стека необходимо проинициализировать, записав в него значение верхнего адреса памяти данных. Обычно это делается следующим образом:
При вызове подпрограмм адрес команды, расположенной за командой вызова, сохраняется в стеке. Значение указателя стека при этом уменьшается на 2 или 3, в зависимости от размера счетчика команд. При возврате из подпрограммы этот адрес извлекается из стека и загружается в счетчик команд. Значение указателя стека соответственно увеличивается на 2 (3). То же происходит и во время прерывания. При генерации прерывания адрес следующей команды сохраняется в стеке, а при возврате из подпрограммы обработки прерывания он восстанавливается из стека.
Во всех моделях микроконтроллеров семейства Mega стек доступен программно. Для работы со стеком имеются две команды: команда занесения в стек (push) и команда извлечения из стека (POP).
Статьи к прочтению:
Энергонезависимая память AT24C02 и Arduino
Похожие статьи:
-
Типы памяти микроконтроллеров: память программ, память данных, регистры.
В микроконтроллерах используется три основных вида памяти – это память программ, память данных и регистры. Память программ представляет собой постоянную…
-
Данные могут храниться в регистрах процессора, в области статической памяти, в области организованной как стек и в динамической памяти. Статическая…