Skip to content

Commit c8d6aef

Browse files
M-Reimeraentinger
authored andcommittedSep 25, 2019
Interrupt ordering for 32u2 and 16u2 MCU (#66)
* Interrupt ordering for 32u2 and 16u2 MCU * Added missing chip variants
1 parent 2f67c91 commit c8d6aef

File tree

1 file changed

+70
-1
lines changed

1 file changed

+70
-1
lines changed
 

‎cores/arduino/WInterrupts.c

+70-1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,39 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
102102
EICRB = (EICRB & ~((1<<ISC60) | (1<<ISC61))) | (mode << ISC60);
103103
EIMSK |= (1<<INT6);
104104
break;
105+
#elif defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__)
106+
case 0:
107+
EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
108+
EIMSK |= (1 << INT0);
109+
break;
110+
case 1:
111+
EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
112+
EIMSK |= (1 << INT1);
113+
break;
114+
case 2:
115+
EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20);
116+
EIMSK |= (1 << INT2);
117+
break;
118+
case 3:
119+
EICRA = (EICRA & ~((1 << ISC30) | (1 << ISC31))) | (mode << ISC30);
120+
EIMSK |= (1 << INT3);
121+
break;
122+
case 4:
123+
EICRB = (EICRB & ~((1 << ISC40) | (1 << ISC41))) | (mode << ISC40);
124+
EIMSK |= (1 << INT4);
125+
break;
126+
case 5:
127+
EICRB = (EICRB & ~((1 << ISC50) | (1 << ISC51))) | (mode << ISC50);
128+
EIMSK |= (1 << INT5);
129+
break;
130+
case 6:
131+
EICRB = (EICRB & ~((1 << ISC60) | (1 << ISC61))) | (mode << ISC60);
132+
EIMSK |= (1 << INT6);
133+
break;
134+
case 7:
135+
EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70);
136+
EIMSK |= (1 << INT7);
137+
break;
105138
#elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
106139
case 2:
107140
EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
@@ -204,7 +237,32 @@ void detachInterrupt(uint8_t interruptNum) {
204237
break;
205238
case 4:
206239
EIMSK &= ~(1<<INT6);
207-
break;
240+
break;
241+
#elif defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__)
242+
case 0:
243+
EIMSK &= ~(1 << INT0);
244+
break;
245+
case 1:
246+
EIMSK &= ~(1 << INT1);
247+
break;
248+
case 2:
249+
EIMSK &= ~(1 << INT2);
250+
break;
251+
case 3:
252+
EIMSK &= ~(1 << INT3);
253+
break;
254+
case 4:
255+
EIMSK &= ~(1 << INT4);
256+
break;
257+
case 5:
258+
EIMSK &= ~(1 << INT5);
259+
break;
260+
case 6:
261+
EIMSK &= ~(1 << INT6);
262+
break;
263+
case 7:
264+
EIMSK &= ~(1 << INT7);
265+
break;
208266
#elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
209267
case 2:
210268
EIMSK &= ~(1 << INT0);
@@ -287,6 +345,17 @@ IMPLEMENT_ISR(INT2_vect, EXTERNAL_INT_2)
287345
IMPLEMENT_ISR(INT3_vect, EXTERNAL_INT_3)
288346
IMPLEMENT_ISR(INT6_vect, EXTERNAL_INT_4)
289347

348+
#elif defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__)
349+
350+
IMPLEMENT_ISR(INT0_vect, EXTERNAL_INT_0)
351+
IMPLEMENT_ISR(INT1_vect, EXTERNAL_INT_1)
352+
IMPLEMENT_ISR(INT2_vect, EXTERNAL_INT_2)
353+
IMPLEMENT_ISR(INT3_vect, EXTERNAL_INT_3)
354+
IMPLEMENT_ISR(INT4_vect, EXTERNAL_INT_4)
355+
IMPLEMENT_ISR(INT5_vect, EXTERNAL_INT_5)
356+
IMPLEMENT_ISR(INT6_vect, EXTERNAL_INT_6)
357+
IMPLEMENT_ISR(INT7_vect, EXTERNAL_INT_7)
358+
290359
#elif defined(EICRA) && defined(EICRB)
291360

292361
IMPLEMENT_ISR(INT0_vect, EXTERNAL_INT_2)

0 commit comments

Comments
 (0)