Here is an example of something that has worked for me but I hope can be improved. It currently works with either INT0 or INT1 as determined by the pin number passed via the constructor. I would like to also support the 4 additional external interrupts available in the Mega but to do this, I have to replicate the interrupt handler for each potential interrupt source. This seems wasteful - is there a better way?
Thanks,
-Carl
myLib.h:
#ifndef _myLib_h
#define _myLib_h
#include <avr/interrupt.h>
#include <stdint.h>
volatile static uint8_t _irqRcvd0;
volatile static uint8_t _irqRcvd1;
class myLib
{
public:
myLib(uint8_t irqPin);
uint8_t dataAvail();
void clrIrq();
private:
uint8_t _irqPin;
static void irqHandler0();
static void irqHandler1();
};
#endif
myLib.cpp
#include <WProgram.h>
#include <myLib.h>
void myLib::irqHandler0() {
_irqRcvd0 = true;
}
void myLib::irqHandler1() {
_irqRcvd1 = true;
}
myLib::myLib(uint8_t irqPin)
{
_irqPin = irqPin; // Note: pin 2 = INT0, 3 = INT1
pinMode(_irqPin, INPUT);
if (_irqPin == 2) {
_irqRcvd0 = false;
attachInterrupt(0, irqHandler0, FALLING); // Monitor INT0
} else if (_irqPin == 3) {
_irqRcvd1 = false;
attachInterrupt(1, irqHandler1, FALLING); // Monitor INT1
}
}
uint8_t myLib::dataAvail() {
return ((_irqPin == 2 && _irqRcvd0) ||
(_irqPin == 3 && _irqRcvd1));
}
void myLib::clrIrq() {
uint8_t sreg;
sreg = SREG;
cli();
if (_irqPin == 2)
_irqRcvd0 = false;
else if (_irqPin == 3)
_irqRcvd1 = false;
SREG = sreg;
}