Pins 2 & 3 on the Arduino are great to attach interrupts to; to pick up input even when the Arduino is asleep. The AVR chip though provides 3 more interrupt vectors that can be used to catch interrupts on all pins – even the crystal pins.
These interrupts though are change interrupts and so requires a clock to be present. Therefore, will not be suitable to wake up the Arduino from deep sleep.
Below is example code where interrupts are configured on Pin 8 & Pin 9.
See the Basic AVR page for details on the registers used.
volatile boolean pin8or9changedState = false;
ISR(PCINT0_vect) {
pin8or9changedState = true;
}
void setup()
{
Serial.begin(9600);
Serial.println("Ready...");
// Enable pull-up on Pin 8 (PB0) & Pin 9 (PB1)
PORTB |= _BV(PORTB0) | _BV(PORTB1);
// Enable interrupt on Pin 8 (PCINT0) & Pin 9 (PCINT1)
PCICR |= _BV(PCIE0);
PCMSK0 |= _BV(PCINT0) | _BV(PCINT1);
}
void loop()
{
if (pin8or9changedState) {
Serial.println("Pin 8 or 9 changed state...");
pin8or9changedState = false;
}
}