
Регистр PCICR — определяет какую группу входов использовать в качестве источника прерывания:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 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
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PCINT23 | PCINT22 | PCINT21 | PCINT20 | PCINT19 | PCINT18 | PCINT17 | PCINT16 |
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | PCINT14 | PCINT13 | PCINT12 | PCINT11 | PCINT10 | PCINT9 | PCINT8 |
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 |
Установка какого-нибудь бита из PCINT0…23 разрешает соответствующему выводу работать в качестве источника.
Одновременно можно задействовать несколько входов, которые будут работать как источник прерывания.
Пример использования:
PCMSK2 |= (1 << PCINT20); // использовать PCINT20 в группе PCIE2
\arduino-1.6.5-r5\hardware\arduino\avr\variants\standard\pins_arduino.h
PCIFR — регистр флагов
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| PCIF2 | PCIF1 | PCIF0 |
При смене логического уровня на любом из выводов 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 секунд и загорится вновь.