Многие микроконтроллеры 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 в соответствующий регистр будет записан новый адрес или данные, то еще продолжающийся процесс программирования будет прерван, и результат будет неопределенным!
Обработка прерываний
Прерывания – это вызовы определенных функций, генерируемые, главным образом, аппаратной частью микроконтроллера. В результате прерывания выполнение программы останавливается, и происходит переход к соответствующей подпрограмме обработки прерывания.
Прерывания бывают внутренними и внешними. Источниками внутреннего прерывания являются встроенные модули микроконтроллера (например, таймер/счетчик или сторожевой таймер). Внешние прерывания вызываются сбросом (сигнал на выводе RESET) или сигналами предустановленного уровня на выводах INT. К примеру, в микроконтроллерах AVR за характер сигналов на выводах INT0/INT1, вызывающих прерывание, определяется с помощью разрядов регистра управления MCUCR: ISC00 (разряд 0), ISC01 (разряд 1) – для входа INT0; ISC 10 (разряд 2), ISC11 (разряд 3) – для входа INT1 (табл. 3.1 и табл. 3.2).
Таблица 3.1. Выбор способа активизации прерывания по входу INT0
Разряд ISC01 | Разряд 1SC00 | Описание |
0 | 0 | Прерывание вызывается по уровню лог. 0 на входе INT0 |
1 | 0 | Прерывание вызывается по ниспадающему фронту сигнала INT0 |
1 | 1 | Прерывание вызывается по нарастающему фронту сигнала INT0 |
Таблица 3.2. Выбор способа активизации прерывания по входу INT1
Разряд ISC11 | Разряд ISC10 | Описание |
0 | 0 | Прерывание вызывается по уровню лог. 0 на входе INT1 |
1 | 0 | Прерывание вызывается по нарастающему фронту сигнала INT1 |
1 | 1 | Прерывание вызывается по ниспадающему фронту сигнала INT1 |
В ряде микроконтроллеров PIC выбор фронта для активизации прерывания по входу INT определяется состоянием разряда 6 регистра OPTION: лог. 1 в этом разряде соответствует прерывание по нарастающему, а лог. 0 – по ниспадающему фронту сигнала. Для установки этого разряда в языке С обычно используют специальные функции.
В микроконтроллерах AVR всем прерываниям, включая сброс, поставлен в соответствие собственный вектор прерывания – адрес в начальной области памяти программ, по которому компилятор размещает команду перехода к подпрограмме обработки прерывания. Перечень векторов прерывания в некоторых моделях микроконтроллеров AVR может выглядеть следующим образом (табл. 3.3). В микроконтроллерах AVR все прерывания имеют одинаковый приоритет, и в случае одновременного возникновения двух прерываний первым обрабатывается прерывание с меньшим номером вектора.
Таблица 3.3. Векторы прерываний
Адрес в памяти программ | Источник прерывания | Описание |
0x0000 | RESET | Сигнал сброса |
0x0001 | INT0 | Внешний запрос на прерывание по входу INT0 |
0x0002 | INT1 | Внешний запрос на прерывание по входу INT1 |
0x0003 | Т/С1 | Захват по таймеру/счетчику Т/С1 |
0x0004 | Т/С1 | Совпадение с регистром сравнения А таймера Т/С1 |
0x0005 | Т/С1 | Совпадение с регистром сравнения В таймера Т/С1 |
0x0006 | Т/С1 | Переполнение таймера/счетчика Т/С1 |
0x0007 | Т/С0 | Переполнение таймера/счетчика Т/С0 |
0x0008 | SPI | Завершение передачи данных по интерфейсу SPI |
0x0009 | UART | Прием байта приемопередатчиком UART завершен |
0х000А | UART | Регистр данных приемопередатчика UART пуст |
0x000В | UART | Передача данных приемопередатчиком UART завершена |
0х000С | ANA_COMP | Прерывание от аналогового компаратора |
В микроконтроллерах PIC источники прерывания, кроме RESET, не рассматриваются в отдельности, им обычно соответствует один вектор, а в некоторых моделях – два вектора для прерываний с различной приоритетностью. Определять, какое именно прерывание требует обслуживания, – задача программиста, и многие компиляторы с языка С предоставляют для этой цели готовые функции, освобождающие от необходимости самому "вычислять" источник прерывания.
В момент возникновения прерывания в стек помещается адрес возврата – адрес команды, которая должна быть выполнена первой после выхода из подпрограммы обработки прерывания. В результате выполнения последней ассемблерной команды подпрограммы обработки прерывания (для микроконтроллеров AVR – это команда reti, а для микроконтроллеров PIC – retfie) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается.
Дата: 2019-05-28, просмотров: 194.