void setup() {
Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
attachPCINT(5);
attachPCINT(6);
}
void loop() {
Serial.println("NOP");
delay(200);
}
// пример использования PCINT - прерывания на любом пине
// прерывание вызывается при переключении состояния любого пина из группы
// наши обработчики прерываний
ISR(PCINT0_vect) { // пины 8-13
}
ISR(PCINT1_vect) { // пины A0-A5
}
ISR(PCINT2_vect) { // пины 0-7
if (!pinRead(5)) {
Serial.println("PCINT INTERRUPT D5");
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
}
if (!pinRead(6)) {
Serial.println("PCINT INTERRUPT D6");
digitalWrite(7, HIGH);
delay(100);
digitalWrite(7, LOW);
}
}
// функция для настройки PCINT
uint8_t attachPCINT(uint8_t pin) {
if (pin < 8) { // D0-D7 (PCINT2)
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << pin); return 2;
}
else if (pin > 13) { //A0-A5 (PCINT1)
PCICR |= (1 << PCIE1);
PCMSK1 |= (1 << pin - 14);
return 1;
} else { // D8-D13 (PCINT0)
PCICR |= (1 << PCIE0);
PCMSK0 |= (1 << pin - 8);
return 0;
}
}
// быстрый digitalRead для опроса внутри ISR
// пригодится для проверки конкретного пина
bool pinRead(uint8_t pin) {
if (pin < 8) {
return bitRead(PIND, pin);
} else if (pin < 14) {
return bitRead(PINB, pin - 8);
} else if (pin < 20) {
return bitRead(PINC, pin - 14);
}
}