пятница, 22 марта 2013 г.

Прерывания

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

Таблица векторов прерывания располагается в памяти программ, начиная с адреса 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 памяти