Микропроцессоры и микроконтроллеры

 
 
 
«Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены.»
Edward V Berard
Русский | Українська


Микропроцессоры и микроконтроллеры :: RISC-микроконтроллеры семейства AVR :: Прерывания микроконтроллера ATmega16

Прерывания микроконтроллера ATmega16

Прерывание прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событием микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд PC и загружает в него адрес соответствующего вектора прерывания. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы обработки прерывания должна быть команда RETI, которая обеспечит возврат в основную программу и восстановление предварительно сохраненного счетчика команд.

Микроконтроллеры AVR имеют многоуровневую систему приоритетных прерываний. Младшие адреса памяти программ отведены под таблицу векторов прерывания. Каждому прерыванию соответствует адрес в этой таблице. Положение вектора в таблице также определяет и приоритет соответствующего прерывания: чем меньше адрес, тем выше приоритет прерывания.

В микроконтроллерах семейства Mega положение таблицы векторов прерывания может быть изменено. Таблица может располагаться не только в начале памяти программ, а также в начале области загрузчика.

Распределение адресов таблицы векторов прерываний для микроконтроллера ATmega16 приведено в табл. 28.1.

Таблица 28.1

Таблица векторов прерываний модели ATmega16

Адрес

Источник

Описание

1

$0002

INT0

Внешнее прерывание 0

2

$0004

INT1

Внешнее прерывание 1

3

$0006

TIMER2 COMP

Совпадение таймера/счетчика Т2

4

$0008

TIMER2 OVF

Переполнение таймера/счетчика Т2

5

$000A

TIMER1 CAPT

Захват таймера/счетчика Т1

6

$000C

TIMER1 COMPA

Совпадение «А» таймера/счетчика Т1

7

$000E

TIMER1 COMPB

Совпадение «В» таймера/счетчика Т1

8

$0010

TIMER1OVF

Переполнение таймера/счетчика Т1

9

$0012

TIMER0OVF

Переполнение таймера/счетчика Т0

10

$0014

SPI, STC

Передача по SPI завершена

11

$0016

USART,RXC

USART, прием завершен

12

$0018

USART,UDRE

Регистр данных USART пуст

13

$001A

USART,TXC

USART, передача завершена

14

$001C

ADC

Преобразование АЦП завершено

15

$001E

EE_RDY

EEPROM, готово

16

$0020

ANA_COMP

Аналоговый компаратор

17

$0022

TWI

Прерывание от модуля TWI

18

$0024

INT2

Внешнее прерывание 2

19

$0026

TIMER0 COMP

Совпадение таймера/счетчика Т0

20

$0028

SPM_RDY

Готовность SPM

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

Для глобального разрешения/запрещения прерываний предназначен флаг I регистра SREG. Для разрешения прерываний он должен быть установлен в «1», а для запрещения сброшен в «0». Индивидуальное маскирование прерываний производится установкой/сбросом соответствующих разрядов регистров масок прерываний.

При возникновении прерывания флаг I регистра SREG аппаратно сбрасывается, запрещая тем самым обработку следующих прерываний. Однако в подпрограмме обработки прерывания этот флаг можно снова установить в «1» для разрешения вложенных прерываний. При возврате из подпрограммы обработки прерываний (команда RETI) флаг I устанавливается аппаратно.

Все имеющиеся прерывания можно разделить на два типа. Прерывания первого типа генерируются при наступлении некоторого события, в результате которого устанавливается флаг прерывания. Затем, если прерывание разрешено, в счетчик команд загружается адрес вектора соответствующего прерывания. При этом флаг прерывания аппаратно (или программно) сбрасывается.

Прерывания второго типа не имеют флагов прерываний и генерируются в течение всего времени, пока присутствуют условия, необходимые для этого. Соответственно, если условия, вызывающие прерывание, исчезнут до разрешения прерывания, генерации прерывания не произойдет.

Микроконтроллеры семейства Mega поддерживают очередь прерываний, которая работает следующим образом: если условия генерации одного или более прерываний возникают в то время, когда флаг общего разрешения прерываний сброшен, соответствующие флаги устанавливаются в «1» и остаются в этом состоянии до установки флага общего разрешения прерываний. После разрешения прерываний, выполняется их обработка в порядке приоритета.

Наименьшее время отклика для любого прерывания составляет 4 машинных цикла, в течение которых происходит сохранение счетчика команд в стеке. В течение последующих двух или трех циклов выполняется команда перехода к подпрограмме обработки прерывания. Если прерывание произойдет во время выполнения команды, длящейся несколько циклов, то генерация прерывания произойдет только после выполнения этой команды. Если же прерывание произойдет во время нахождения микроконтроллера в «спящем» режиме, время отклика увеличивается еще на 4 машинных цикла.

Возврат в основную подпрограмму занимает 4 машинных цикла, в течение которых происходит восстановление счетчика команд из стека. После выхода из прерывания процессор всегда выполняет одну команду основной программы, прежде чем обслужить любое отложенное прерывание.




<< Предыдущая статья
«Функционирование таймера Т1»