Энергонезависимая память данных (EEPROM).

 

Все микроконтроллеры семейства 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).