From d7d0e304d53b8a75d61b1976ffe8a92d38e867e2 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Fri, 2 Dec 2011 17:17:27 -0500 Subject: [PATCH] Support 3rd external interrupt on ATmega1284P (maniacbug) http://code.google.com/p/arduino/issues/detail?id=728 --- hardware/arduino/cores/arduino/WInterrupts.c | 22 +++++++++++++++++++ .../arduino/cores/arduino/wiring_private.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/hardware/arduino/cores/arduino/WInterrupts.c b/hardware/arduino/cores/arduino/WInterrupts.c index 75c713b89..1449cfbbc 100755 --- a/hardware/arduino/cores/arduino/WInterrupts.c +++ b/hardware/arduino/cores/arduino/WInterrupts.c @@ -110,6 +110,21 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { #warning attachInterrupt may need some more work for this cpu (case 1) #endif break; + + case 2: + #if defined(EICRA) && defined(ISC20) && defined(ISC21) && defined(EIMSK) + EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); + EIMSK |= (1 << INT2); + #elif defined(MCUCR) && defined(ISC20) && defined(ISC21) && defined(GICR) + MCUCR = (MCUCR & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); + GICR |= (1 << INT2); + #elif defined(MCUCR) && defined(ISC20) && defined(GIMSK) && defined(GIMSK) + MCUCR = (MCUCR & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); + GIMSK |= (1 << INT2); + #else + #warning attachInterrupt may need some more work for this cpu (case 1) + #endif + break; #endif } } @@ -237,6 +252,13 @@ SIGNAL(INT1_vect) { intFunc[EXTERNAL_INT_1](); } +#if defined(EICRA) && defined(ISC20) +SIGNAL(INT2_vect) { + if(intFunc[EXTERNAL_INT_2]) + intFunc[EXTERNAL_INT_2](); +} +#endif + #endif /* diff --git a/hardware/arduino/cores/arduino/wiring_private.h b/hardware/arduino/cores/arduino/wiring_private.h index 41d1d40f6..f0ceb0cc4 100755 --- a/hardware/arduino/cores/arduino/wiring_private.h +++ b/hardware/arduino/cores/arduino/wiring_private.h @@ -54,6 +54,8 @@ extern "C"{ #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define EXTERNAL_NUM_INTERRUPTS 8 +#elif defined(__AVR_ATmega1284P__) +#define EXTERNAL_NUM_INTERRUPTS 3 #else #define EXTERNAL_NUM_INTERRUPTS 2 #endif