Go Down

Topic: Pin change interrupts on arbitrary pins? (Read 799 times) previous topic - next topic

maniacbug

Hi, I am trying to understand the pin change interrupts that are available on Arduino.

From the AttachInterrupt docs, I see "Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).".  Yet the Atmega328 data sheet specifies PCINTxx values for nearly every pin.  So from that, it would seem I could get an interrupt on any pin

What accounts for this difference in docs?  And can I actually put an ISR on any pin?  (Is it just that I have to do it manually for the others??)

JimEli

#1
Mar 20, 2011, 08:16 pm Last Edit: Mar 20, 2011, 08:22 pm by JimEli Reason: 1
afaik, only 2 pins for interrupts on 8/168/328 arduinos, however, more pins are available on the mega based boards. you would need to hardcode the interrupts, and i'm not sure if doing that would break any other functions.

something like this worked for me:

Code: [Select]

ISR(PCINT0_vect) {
 …
}

Setup() {
 //disable interrupts
 cli();
 
 //setup digital pin #8 pin-change interrupt (see datasheet)
 PCICR |= (1<<PCIE0);
 PCMSK0 |= (1<<PCINT0);

 //enable interrupts
 sei();
}

Coding Badly

#2
Mar 20, 2011, 08:54 pm Last Edit: Mar 20, 2011, 08:55 pm by Coding Badly Reason: 1
From the AttachInterrupt docs, I see "Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).".  Yet the Atmega328 data sheet specifies PCINTxx values for nearly every pin.  So from that, it would seem I could get an interrupt on any pin

What accounts for this difference in docs?


"external interrupts" versus "pin change interrupts".

"External interrupts" get their own interrupt vector and have extended functionality (hardware support for LOW, RISING, FALLING, CHANGE).  RISING, FALLING, and CHANGE do not work if the processor clock is stopped (deeper sleep modes).

"Pin change interrupts" have one vector per port (up to eight pins assigned to one vector) and have very basic functionality (hardware support for CHANGE).  Pin change interrupts always work; even in the deepest sleep modes.

Quote
And can I actually put an ISR on any pin?  (Is it just that I have to do it manually for the others??)


Yes.  Examples...

@JimEli's post above.
http://www.arduino.cc/playground/Main/PinChangeInt
http://www.arduino.cc/playground/Main/PcInt
http://www.google.com/search?q=pin+change+interrupt+site:arduino.cc%2Fforum

maniacbug


"external interrupts" versus "pin change interrupts".


Totally get it now.  Thanks!  You have been very helpful to me today :)

Go Up