Регистр управления ЭСППЗУ – EECR

Разряды 7…4 – Резерв

Данные разряды у ATmega128 зарезервированы и считываются как 0.

Разряд 3 – EERIE: Разрешение прерывания по готовности ЭСППЗУ

Запись в EERIE 1 разрешает прерывание по готовности ЭСППЗУ, если кроме того установлен бит I в регистре SREG. Запись в EERIE нуля отключает это прерывание. Прерывание по готовности ЭСППЗУ генерируется, если бит EEWE сброшен.

Разряд 2 – EEMWE: Главное разрешение записи в ЭСППЗУ

Бит EEMWE разрешает установку бита EEWE, инициирующего запись в ЭСППЗУ. Данные будут записаны в ЭСППЗУ по указанному адресу, если в EEMWE записать 1, а затем в течение 4 машинных циклов записать 1 в EEWE. Если EEMWE=0, то запись в EEWE лог. 1 не вызовет никаких действий. После программной установки бита EEMWE он автоматически сбрасывается аппаратно по истечении четырех машинных циклов.

Разряд 1 – EEWE: Разрешение записи в ЭСППЗУ

Сигнал разрешения записи EEWE является стробирующим сигналом записи для ЭСППЗУ. Для записи в ЭСППЗУ после корректной установки адреса и данных необходимо установить бит EEWE. Перед установкой бита EEWE должен быть установлен бит EEWE, иначе запись в ЭСППЗУ не произойдет. При выполнении операции записи в ЭСППЗУ необходимо руководствоваться следующей последовательностью (порядок шагов 3 и 4 не важен):

Ожидание пока EEWE станет равным нулю. Ожидание равенства нулю бита SPMEN в регистре SPMCSR. Запись нового адреса ЭСППЗУ в EEAR (опционально). Запись новых данных в регистр EEDR для записи в ЭСППЗУ (опционально). Запись лог. 1 в EEMWE, когда в EEWE регистра EECR записан ноль. Запись лог. 1 в EEWE в течение четырех машинных циклов после установки EEMWE.

ЭСППЗУ нельзя программировать во время записи флэш-памяти из ЦПУ. С учетом этого, перед началом новой записи в ЭСППЗУ необходимо проверить завершение программирования флэш-памяти. Шаг 2 необходимо выполнять, если в приложении используется программирование из загрузочного сектора. Если программирование флэш-памяти под управлением ЦПУ не предусмотрено, то шаг 2 может быть исключен. См. “Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи” для детального изучения программирования из загрузочного сектора.

НЕ нашли? Не то? Что вы ищете?

Предостережения: Прерывание между шагами 5 и 6 может нарушить цикл записи из-за превышения установленного предела времени на выполнение этих шагов. Если процедура обработки прерывания, осуществляющая доступ к ЭСППЗУ, прерывается другим доступом к ЭСППЗУ, то EEAR или EEDR будут изменены, вызывая сбой прерванного цикла доступа. Во избежание этих проблем рекомендуется сбрасывать флаг общего разрешения прерываний при выполнении последних четырех шагов.

По окончании записи бит EEWE сбрасывается аппаратно. Данный бит может опрашиваться программно для определения возможности записи следующего байта (нулевое значение). После установки EEWE ЦПУ останавливается на два машинных цикла перед выполнением следующей инструкции.

Разряд 0 – EERE: Разрешение чтения из ЭСППЗУ

Сигнал разрешения чтения из ЭСППЗУ EERE является стробом чтения ЭСППЗУ. После записи корректного адреса в регистр адреса EEAR бит EERE должен быть установлен к лог.1 для запуска механизма чтения ЭСППЗУ. Чтение из ЭСППЗУ выполняется одновременно с инструкцией, поэтому, запрашиваемые данные готовы для считывания сразу по ее завершении. После чтения из ЭСППЗУ ЦПУ задерживается на четыре машинных цикла, а только затем выполняет следующую инструкцию.

Пользователь должен опросить флаг EEWE до начала операции чтения. Если осуществляется операция записи, то невозможно не только считать ЭСППЗУ, но и изменить регистр адреса EEAR. Во время доступа к ЭСППЗУ используется калиброванный генератор. В таблице 2 приведено типичное время программирования ЭСППЗУ через ЦПУ.

Таблица 2 – Время программирования ЭСППЗУ

Операция

Количество периодов калиброванного RC-генератора (1).

Типичное время программирования

Запись ЭСППЗУ (через ЦПУ)

8448

8.5 мс

Прим 1. Используется частота 1 МГц независимо от установки конфигурационного бита CKSEL

Далее представлены примеры кодов функций записи в ЭСППЗУ на языках Ассемблер и Си. В данных примерах предполагается, что прерывания работают таким образом, что ни одно не возникает в процессе выполнения данных функций (например, путем общего отключения прерываний). Кроме того, считается, что из загрузочного сектора не выполняется программирование флэш-памяти. В противном случае функция записи в ЭСППЗУ должна ожидать окончания действия инструкции SPM.

Пример кода на Ассемблере

EEPROM_write:

; Ожидаем окончание предыдущей записи

sbic EECR, EEWE

rjmp EEPROM_write

; Записываем адрес (r18:r17) в адресный регистр ЭСППЗУ

out EEARH, r18

out EEARL, r17

; Записываем данные (r16) в регистр данных ЭСППЗУ

out EEDR, r16

; Записывает лог. 1 в EEMWE

sbi EECR, EEMWE

; Запуск записи в ЭСППУ установкой EEWE

sbi EECR, EEWE

ret

Пример кода на Си

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)

{

/* Ожидаем окончание предыдущей записи */

while(EECR & (1<<EEWE))

;

/* Указание адреса и данных */

EEAR = uiAddress;

EEDR = ucData;

/* Запись лог. 1 в EEMWE */

EECR |= (1<<EEMWE);

/* Запуск записи в ЭСППЗУ путем установки EEWE */

EECR |= (1<<EEWE);

}

В следующих примерах кодов на Си и Ассемблере представлены функции чтения из ЭСППЗУ. При разработке примеров учитывалось управление прерываниями таким образом, что ни одно из них не возникает в процессе выполнения этих функций.

Пример кода на Ассемблере

EEPROM_read:

; Ожидание завершения предыдущей записи

sbic EECR, EEWE

rjmp EEPROM_read

; Установка адреса (r18:r17) в адресном регистре

out EEARH, r18

out EEARL, r17

; Запуск чтения ЭСППЗУ путем установки EERE

sbi EECR, EERE

; Считывание данных из регистра данных ЭСППЗУ

in r16,EEDR

ret

Пример кода на Си

unsigned char EEPROM_read(unsigned int uiAddress)

{

/* Ожидание завершения предыдущей записи*/

while(EECR & (1<<EEWE))

;

/* Установка адресного регистра */

EEAR = uiAddress;

/* Разрешение чтения из ЭППЗУ путем установки EERE */

EECR |= (1<<EERE);

/* Возврат данных из регистра данных ЭСППЗУ*/

return EEDR;

}

Запись в ЭСППЗУ в режиме выключения (Power Down)

Если микроконтроллер переводится в режим выключения (Power Down) командой sleep в процессе выполнения операции записи в ЭСППЗУ, то операция записи будет продолжена и завершится по истечении требуемого времени доступа для записи. Однако, по завершении операции записи кварцевый генератор будет продолжать работу, и как следствие, микроконтроллер будет переведен в режим снижения мощности не полностью. С учетом этого, рекомендуется проверять окончание операции записи в ЭСППЗУ перед переводом в режим выключения (Power-down).

Меры предотвращения повреждения данных в ЭСППЗУ

В те моменты, когда напряжение VCC находится на уровне недостаточном для корректной работы ЦПУ и ЭСППЗУ, содержимое ЭСППЗУ может быть нарушено. Данные проблемы аналогичны устройствам, использующих отдельное ЭСППЗУ, поэтому, в данном случае необходимо применить те же меры.

При сниженном напряжении питания может быть две причины нарушения содержимого ЭСППЗУ. Первая причина состоит в возможности корректной регулярной записи в ЭСППЗУ только при определенном напряжении питания. Вторая состоит в возможности некорректного выполнения программы микроконтроллером при чрезмерном низком уровне питания.

Повреждение данных в ЭСППЗУ может быть легко предотвращено, если придерживаться следующих рекомендаций:

Микроконтроллер необходимо удерживать в состоянии сброса (низкий уровень на выводе RESET) при недостаточности уровня питания. Аналогично это можно выполнить, разрешив работу встроенного детектора питания (BOD). Если пороговый уровень встроенного детектора питания не соответствует необходимому порогу, то следует применить внешнюю схему сброса при снижении VCC (супервизор питания). Если сброс возникает во время действия операции записи, то запись будет завершена при условии достаточности уровня питания.

Память ввода-вывода

Существующее пространство ввода-вывода для ATmega128 показано в разделе “Сводная таблица регистров”.

Все порты ввода-вывода и периферийные устройства в ATmega128 размещены в пространстве ввода-вывода. Доступ ко всем ячейкам ввода-вывода может быть осуществлен с помощью инструкций LD/LDS/LDD и ST/STS/STD путем передачи данных между одним из 32-х универсальным рабочим регистром и памятью ввода-вывода. Регистры ввода-вывода с адресами $00 - $1F могут побитно адресоваться с помощью инструкций SBI и CBI. Состояние одного из разрядов в этих регистрах может тестироваться с помощью инструкций SBIS и SBIC. При использовании специфических команд ввода-вывода IN и OUT необходимо использовать адреса $00 - $3F. Если адресоваться к регистрам ввода-вывода как к памяти данных с помощью инструкций LD и ST, то к указанным выше адресам необходимо прибавить $20. ATmega128 является сложным микроконтроллером, для которого 64 адреса, зарезервированных в кодах операций IN и OUT, не достаточно для поддержки всех имеющихся периферийных устройств. Для расширенной области ввода-вывода, которая находится по адресам $60 - $FF в статическом ОЗУ необходимо использовать только инструкции ST/STS/STD и LD/LDS/LDD. Пространство расширенного ввода-вывода заменяется ячейками статического ОЗУ в режиме совместимости с ATmega103.

Если осуществляется доступ к зарезервированным разрядам, то в целях совместимости с последующими микроконтроллерами в них необходимо записывать лог. 0.

Не должна производиться запись в ячейки по зарезервированным адресам в пространстве ввода-вывода.

Некоторые флаги статуса сбрасываются путем записи в них лог. 1. Инструкции CBI и SBI работают только с регистрами по адресам $00…$1F.

Регистры управления вводом-выводом и периферийными устройствами описываются в следующих разделах.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66