Прерывания прекращают работу основной программ для того чтобы выполнить более приоритетную, определяемую внутренними или внешними событиями, влияющими на работу микроконтроллера. При этом в стек записывается содержимое счетчика команд, а в сам счетчик записывается вектор прерывания, по которому находится команда безусловного перехода к подпрограмме обработки прерывания. После выполнения подпрограммы обработки прерывания, в счетчик команд загружается сохраненное значение из стека и выполнение основной программы продолжается с того места, где оно остановилось.
Бит IVCEL (1) указывает где будет располагаться таблица векторов прерывания:
Таблица векторов прерывания микроконтроллера ATmega328 выглядит следующим образом:
Таблица векторов прерывания располагается в памяти программ, начиная с адреса 0x0002, либо в области загрузчика. Приоритет прерывания зависит также от его расположения в таблице векторов прерывания: чем меньше адрес, тем выше приоритет прерывания.
Регистр MCUCR:
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
-
|
BODS
|
BODSE
|
PUD
|
-
|
-
|
IVSEL
|
IVCE
|
Бит IVCEL (1) указывает где будет располагаться таблица векторов прерывания:
- 0 - по адресу 0x0002
- 1 - по адресу начала загрузчика + 0x0002 (подробнее тут)
Бит IVCE (0) разрешает изменение бита IVCEL в течении 4 машинных циклов после установки его в 1.
Разрешение обработки прерываний осуществляется установкой 1 в бит I (7) регистра SREG:
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
I
|
T
|
H
|
S
|
V
|
N
|
Z
|
C
|
Таблица векторов прерывания микроконтроллера ATmega328 выглядит следующим образом:
- 0x0000 RESET - сброс
- 0x0002 INT0 - внешнее прерывание 0
- 0x0004 INT1 - внешнее прерывание 0
- 0x0006 PCINT0 - прерывание по изменению состояния нулевой группы выводов
- 0x0008 PCINT1 - прерывание по изменению состояния первой группы выводов
- 0x000A PCINT2 - прерывание по изменению состояния второй группы выводов
- 0x000C WDT - прерывание от сторожевого таймера
- 0x000E TIMER2 COMPA - прерывание от таймера/счетчика T2 при совпадении с A
- 0x0010 TIMER2 COMPB - прерывание от таймера/счетчика T2 при совпадении с B
- 0x0012 TIMER2 OVF - прерывание по переполнению таймера/счетчика T2
- 0x0014 TIMER1 CAPT - прерывание от таймера/счетчика T1 по записи
- 0x0016 TIMER1 COMPA - прерывание от таймера/счетчика T1 при совпадении с A
- 0x0018 TIMER1 COMPB - прерывание от таймера/счетчика T2 при совпадении с B
- 0x001A TIMER1 OVF - прерывание по переполнению таймера/счетчика T1
- 0x001C TIMER0 COMPA - прерывание от таймера/счетчика T0 при совпадении с A
- 0x001E TIMER0 COMPB - прерывание от таймера/счетчика T0 при совпадении с B
- 0x0020 TIMER0 OVF - прерывание по переполнению таймера/счетчика T0
- 0x0022 SPI, STC - прерывание по окончанию передачи модуля SPI
- 0x0024 USART, RX - прерыванию по окончанию приема модуля USART
- 0x0026 USART, UDRE - прерывание по опустошению регистра данных модуля USART
- 0x0028 USART, TX - прерывание по окончанию приема модуля USART
- 0x002A ADC - прерывание по завершению преобразования АЦП
- 0x002C EE READY - прерывание по готовности памяти EEPROM
- 0x002E ANALOG COMP - прерывание от аналогового компаратора
- 0x0030 TWI - прерывание от модуля I2C (TWI)
- 0x0032 SPM READY - прерывание по готовности flash памяти
Комментариев нет:
Отправить комментарий