ВекторИдентификаторНазваниеПримечания
1INT0_vectВнешнее прерывание 0Изменение состояния вывода Digital 2
2INT1_vectВнешнее прерывание 1Изменение состояния вывода Digital 3
3PCINT0_vectПрерывание по изменению входа 0Изменение состояния одного из выводов порта B (выводы Digital 8..13)
4PCINT1_vectПрерывание по изменению входа 1Изменение состояния одного из выводов порта C (выводы Analog In)
5PCINT2_vectПрерывание по изменению входа 2Изменение состояния одного из выводов порта D (выводы Digital 0..7)
6WDT_vectПрерывание сторожевого таймераСторожевой таймер позволяет сбросить микроконтроллер при "зависании" программы и при необходимости сохранить данные перед сбросом по таймеру.
7TIMER2_COMPA_vectСовпадение A таймера-счётчика 2Регистр TCNT2 принял значение, равное регистру OCR2A
8TIMER2_COMPB_vectCовпадение B таймера-счётчика 2Регистр TCNT2 принял значение, равное регистру OCR2B
9TIMER2_OVF_vectПереполнение таймера-счётчика 2Регистр TCNT2 поменял значение с 0xFF на 0
10TIMER1_CAPT_vectСобытие захвата таймера-счётчика 1Изменение состояния вывода Digital 8
11TIMER1_COMPA_vectСовпадение A таймера-счётчика 1Регистр TCNT1 принял значение, равное регистру OCR1A
12TIMER1_COMPB_vectCовпадение B таймера-счётчика 1Регистр TCNT1 принял значение, равное регистру OCR1B
13TIMER1_OVF_vectПереполнение таймера-счётчика 1Регистр TCNT1 поменял значение с 0xFFFF на 0
14TIMER0_COMPA_vectСовпадение A таймера-счётчика 0Регистр TCNT0 принял значение, равное регистру OCR0A
15TIMER0_COMPB_vectCовпадение B таймера-счётчика 0Регистр TCNT0 принял значение, равное регистру OCR0B
16TIMER0_OVF_vectПереполнение таймера-счётчика 0Регистр TCNT0 поменял значение с 0xFF на 0
17SPI_STC_vectВыполнена передача по интерфейсу SPI
18USART_RX_vectВыполнен приём по интерфейсу USART
19USART_UDRE_vectРегистр данных USART пустМожно отправить по интерфейсу следующий "байт" (от 5 до 9 бит) данных
20USART_TX_vectВыполнена передача по интерфейсу USART
21ADC_vectВыполнено преобразование АЦП
22EE_READY_vectГотовность EEPROM
23ANALOG_COMP_vectПрерывание аналогового компаратора
24TWI_vectПрерывание интерфейса TWI
25SPM_READY_vectВыполнено чтение из памяти программ




Регистр PCICR — определяет какую группу входов использовать в качестве источника прерывания:

76543210
PCIE2

PCINT[23:16],

PCIE1

PCINT[14:8]

PCIE0

PCINT[7:0]

Пример использования:

PCICR |= (1 << PCIE2); // определяет группу входов PCIE2 PCINT23…16


\arduino-1.6.5-r5\hardware\arduino\avr\variants\standard\pins_arduino.h

#define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))



  • Регистр PCMSK2 отвечает за выходы PCINT[23:16]
76543210
PCINT23PCINT22PCINT21PCINT20PCINT19PCINT18PCINT17PCINT16
  • Регистр PCMSK1 отвечает за выходы PCINT[14:8]
76543210
PCINT14PCINT13PCINT12PCINT11PCINT10PCINT9PCINT8
  • Регистр PCMSK0 отвечает за выходы PCINT[7:0]
76543210
PCINT7PCINT6PCINT5PCINT4PCINT3PCINT2PCINT1PCINT0

Установка какого-нибудь бита из PCINT0…23 разрешает соответствующему выводу работать в качестве источника.

Одновременно можно задействовать несколько входов, которые будут работать как источник прерывания.

Пример использования:

PCMSK2 |= (1 << PCINT20); // использовать PCINT20 в группе PCIE2


\arduino-1.6.5-r5\hardware\arduino\avr\variants\standard\pins_arduino.h

#define digitalPinToPCMSK(p)    (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0))))
#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))



PCIFR — регистр флагов

76543210
PCIF2PCIF1PCIF0

При смене логического уровня на любом из выводов PCINT0…23 происходит вызов прерывания, 

при этом устанавливается соответствующий флаг прерывания PCIF0…3 (на одну группу один флаг). 

Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания.

Обработчики прерывания PCINTx_vect, каждый для своей группы.

Пример использования:

ISR(PCINT0_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

ISR(PCINT1_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

ISR(PCINT2_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //


Пример:

int i;

void setup() {
  DDRB |= (1 << PB5);                   // выход светодиода D13 (PB5) на плате Arduino
  DDRB &= ~(1 << 0); PORTD |= (1 << 4); // выход PCINT20 (D4) как выход, подтягивающий резистор включить
  PCICR |= (1 << PCIE2);                // определяет группу входов PCIE2 PCINT20...16
  PCMSK2 |= (1 << PCINT20);             // использовать PCINT20 в группе PCIE2
}

void loop() {
  PORTB |= (1 << 5);                    // PB5 выход 1
  if (i == 1) delay(5000); i = 0;       // как сработает прерывание подождать 5 секунд
}

ISR(PCINT2_vect) {
  PORTB &= ~(1 << 5);                   // погасить светодиод на D13
  i = 1;
}

Светодиод на плате Arduino Uno который подключен к PB5 горит всегда, если кратковременно замкнуть вход PCINT20 на GND, светодиод погаснет на 5 секунд и загорится вновь.