Учебное пособие: Микроконтроллеры AVR
-по окончанию считывания разряда 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) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается.
Управление прерываниями в микроконтроллерах AVR
В микроконтроллерах AVR за управление прерываниями отвечают, главным образом, четыре регистра:
-GIMSK (General Interrupt Mask Register) – разрешает или запрещает внешние прерывания по входу INT0/INT1;
-GIFR (General Interrupt Flag Register) – регистрфлаговвнешнихпрерываний;
-TIMSK (Timer/Counter Interrupt Mask Register) – регистр маскирования прерываний от таймера/счетчика Т/С0 и Т/С1;
-TIFR (Timer/Counter Interrupt Flag Register) – регистр флагов прерываний от таймеров/счетчиков.
О состоянии прерывания сигнализирует соответствующий флаг, который устанавливается или сбрасывается в регистре флагов. Даже если в регистре маски прерываний установлен соответствующий отдельный разряд разрешения прерывания, то прерывания могут активизироваться только тогда, когда в регистре состояния SREG установлен разряд общего разрешения прерываний I (разряд 7). Если это имеет место, и наступает прерывание, то выполнение программы ответвляется по соответствующему адресу (см. табл. 1.4) и разряд общего разрешения прерываний I в регистре SREG сбрасывается в состояние лог. 0, блокируя тем самым последующие прерывания. Если требуется прервать подпрограмму другим прерыванием, то после входа в подпрограмму обработки прерывания программа пользователя должна установить флаг I в лог. 1.
Вместе с входом в подпрограмму обработки прерывания аппаратно сбрасывается также и соответствующий флаг, вызвавший прерывание. Некоторые флаги прерываний могут быть сброшены самим пользователем посредством установки соответствующего флага в лог. 1.
Регистр GIMSK
Регистр GIMSK (рис. 3.1), расположенный в области ввода/вывода по адресу 0x003В (адрес в SRAM – 0x005В), используется для разрешения внешних прерываний.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
INT1 | INT0 | – | – | – | – | – | – |
Рис. 3.1. Структура регистра GIMSK микроконтроллеров AVR
Если разряд INT1/INT0 установлен в лог. 1, то внешнее прерывание по входу INT1/INT0 будет разрешено до тех пор, пока установлен в лог. 1 разряд I в регистре состояния SREG.
Регистр GIFR
Состояние внешнего прерывания определяется по регистру GIFR (рис. 3.2), который расположен в области ввода/вывода по адресу 0х003А (адрес SRAM – 0х005А).+
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
INTF1 | INTF0 | – | – | – | – | – | – |
Рис. 3.2. Структура регистра GIFR микроконтроллеров AVR
Флаг INTF1/INTF0 устанавливается в лог. 1, если возникает внешнее прерывание по сигналу на выводе INT1/INT0. При входе в подпрограмму обработки прерывания этот разряд переводится аппаратно в исходное состояние лог. 0.