В ДШ очень четко все сказано:
The External Interrupts are triggered by the INT0 and INT1 pins or any of the PCINT23..0 pins.
Observe that, if enabled, the interrupts will trigger even if the INT0 and INT1 or PCINT23..0 pins
are configured as outputs. This feature provides a way of generating a software interrupt. The
pin change interrupt PCI2 will trigger if any enabled PCINT23..16 pin toggles. The pin change
interrupt PCI1 will trigger if any enabled PCINT14..8 pin toggles. The pin change interrupt PCI0
will trigger if any enabled PCINT7..0 pin toggles. The PCMSK2, PCMSK1 and PCMSK0 Registers
control which pins contribute to the pin change interrupts. Pin change interrupts on
PCINT23..0 are detected asynchronously. This implies that these interrupts can be used for
waking the part also from sleep modes other than Idle mode.Внешние прерывания срабатывают по INT0 и INT1 пинам или по любому пину из PCINT23..0.
Заметьте, что прерывания сработают (если разрешены) даже если INT0, INT1 или PCINT23..0 пины сконфигурированы на вывод. Эта фича позволяет генерировать программные прерывания.
Прерывание PCI2 сработает если любой из разрешенных PCINT23..16 пинов изменит состояние.
PCI1 - если любой из PCINT15..8.
PCI0 - если любой из PCINT7..0.
PCMSK2, PCMSK1 и PCMSK0 регистры отвечают за настройку - какие пины из (PCINT23..16, PCINT15..8, PCINT7..0) будут возбуждать Pin Change прерывание. Pin Change прерывания на PCINT23..0 детектируются асинхронно. Последнее означает, что эти прерывания могут быть использованы для пробуждения МК из режимов сна, отличных от Idle.
Соответсвенно все что вам надо сделать, это определить обработчик прерывания PCINT для соответсвующей группы пинов и определить маску PCMSK - разрещающую прерывание PCINT от соответсвующих пинов, разрешить соответсвующее прерывание PCIX в регистре PCICR и установить флаг разрешения глобальных прерываний.
пример
Код
#pragma vector=PCINT0_vect
__interrupt void PCINT0_Handler(void){
// обработчик PCI0
}
...
int main(void)
{
// настройка маски для группы PCI0 (PCINT7..0)
// изменение уровня на PCINT4 и PCINT5 будут возбуждать прерывание
PCMSK0 = (1 << 5) | (1 << 4); // пины PCINT4 и PCINT5 разрешить возбуждение PCInt
PCICR = (1 << PCIE0); // разрешить PCI0
sei(); // разрешить прерывания
for(;;);
}