[gnoduino: 223/237] Support 3rd external interrupt on ATmega1284P (maniacbug)



commit 5cedb2b71828bc8d46038c05726e5678116da639
Author: David A. Mellis <d mellis arduino cc>
Date:   Fri Dec 2 17:17:27 2011 -0500

    Support 3rd external interrupt on ATmega1284P (maniacbug)
    
    http://code.google.com/p/arduino/issues/detail?id=728

 arduino/cores/arduino/WInterrupts.c    |   22 ++++++++++++++++++++++
 arduino/cores/arduino/wiring_private.h |    2 ++
 2 files changed, 24 insertions(+), 0 deletions(-)
---
diff --git a/arduino/cores/arduino/WInterrupts.c b/arduino/cores/arduino/WInterrupts.c
index 75c713b..1449cfb 100755
--- a/arduino/cores/arduino/WInterrupts.c
+++ b/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/arduino/cores/arduino/wiring_private.h b/arduino/cores/arduino/wiring_private.h
index 41d1d40..f0ceb0c 100755
--- a/arduino/cores/arduino/wiring_private.h
+++ b/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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]