@@ -44,111 +44,84 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
44
44
// to the configuration bits in the hardware register, so we simply shift
45
45
// the mode into place.
46
46
47
- // Enable the interrupt.
48
-
49
47
switch (interruptNum ) {
50
48
#if defined(__AVR_ATmega32U4__ )
51
49
// I hate doing this, but the register assignment differs between the 1280/2560
52
50
// and the 32U4. Since avrlib defines registers PCMSK1 and PCMSK2 that aren't
53
51
// even present on the 32U4 this is the only way to distinguish between them.
54
52
case 0 :
55
53
EICRA = (EICRA & ~((1 <<ISC00 ) | (1 <<ISC01 ))) | (mode << ISC00 );
56
- EIMSK |= (1 <<INT0 );
57
54
break ;
58
55
case 1 :
59
56
EICRA = (EICRA & ~((1 <<ISC10 ) | (1 <<ISC11 ))) | (mode << ISC10 );
60
- EIMSK |= (1 <<INT1 );
61
57
break ;
62
58
case 2 :
63
59
EICRA = (EICRA & ~((1 <<ISC20 ) | (1 <<ISC21 ))) | (mode << ISC20 );
64
- EIMSK |= (1 <<INT2 );
65
60
break ;
66
61
case 3 :
67
62
EICRA = (EICRA & ~((1 <<ISC30 ) | (1 <<ISC31 ))) | (mode << ISC30 );
68
- EIMSK |= (1 <<INT3 );
69
63
break ;
70
64
case 4 :
71
65
EICRB = (EICRB & ~((1 <<ISC60 ) | (1 <<ISC61 ))) | (mode << ISC60 );
72
- EIMSK |= (1 <<INT6 );
73
66
break ;
74
- #elif defined(EICRA ) && defined(EICRB ) && defined( EIMSK )
67
+ #elif defined(EICRA ) && defined(EICRB )
75
68
case 2 :
76
69
EICRA = (EICRA & ~((1 << ISC00 ) | (1 << ISC01 ))) | (mode << ISC00 );
77
- EIMSK |= (1 << INT0 );
78
70
break ;
79
71
case 3 :
80
72
EICRA = (EICRA & ~((1 << ISC10 ) | (1 << ISC11 ))) | (mode << ISC10 );
81
- EIMSK |= (1 << INT1 );
82
73
break ;
83
74
case 4 :
84
75
EICRA = (EICRA & ~((1 << ISC20 ) | (1 << ISC21 ))) | (mode << ISC20 );
85
- EIMSK |= (1 << INT2 );
86
76
break ;
87
77
case 5 :
88
78
EICRA = (EICRA & ~((1 << ISC30 ) | (1 << ISC31 ))) | (mode << ISC30 );
89
- EIMSK |= (1 << INT3 );
90
79
break ;
91
80
case 0 :
92
81
EICRB = (EICRB & ~((1 << ISC40 ) | (1 << ISC41 ))) | (mode << ISC40 );
93
- EIMSK |= (1 << INT4 );
94
82
break ;
95
83
case 1 :
96
84
EICRB = (EICRB & ~((1 << ISC50 ) | (1 << ISC51 ))) | (mode << ISC50 );
97
- EIMSK |= (1 << INT5 );
98
85
break ;
99
86
case 6 :
100
87
EICRB = (EICRB & ~((1 << ISC60 ) | (1 << ISC61 ))) | (mode << ISC60 );
101
- EIMSK |= (1 << INT6 );
102
88
break ;
103
89
case 7 :
104
90
EICRB = (EICRB & ~((1 << ISC70 ) | (1 << ISC71 ))) | (mode << ISC70 );
105
- EIMSK |= (1 << INT7 );
106
91
break ;
107
92
#else
108
93
case 0 :
109
- #if defined(EICRA ) && defined(ISC00 ) && defined( EIMSK )
94
+ #if defined(EICRA ) && defined(ISC00 )
110
95
EICRA = (EICRA & ~((1 << ISC00 ) | (1 << ISC01 ))) | (mode << ISC00 );
111
- EIMSK |= (1 << INT0 );
112
- #elif defined(MCUCR ) && defined(ISC00 ) && defined(GICR )
113
- MCUCR = (MCUCR & ~((1 << ISC00 ) | (1 << ISC01 ))) | (mode << ISC00 );
114
- GICR |= (1 << INT0 );
115
- #elif defined(MCUCR ) && defined(ISC00 ) && defined(GIMSK )
96
+ #elif defined(MCUCR ) && defined(ISC00 )
116
97
MCUCR = (MCUCR & ~((1 << ISC00 ) | (1 << ISC01 ))) | (mode << ISC00 );
117
- GIMSK |= (1 << INT0 );
118
98
#else
119
99
#error attachInterrupt not finished for this CPU (case 0)
120
100
#endif
121
101
break ;
122
102
123
103
case 1 :
124
- #if defined(EICRA ) && defined(ISC10 ) && defined(ISC11 ) && defined( EIMSK )
104
+ #if defined(EICRA ) && defined(ISC10 ) && defined(ISC11 )
125
105
EICRA = (EICRA & ~((1 << ISC10 ) | (1 << ISC11 ))) | (mode << ISC10 );
126
- EIMSK |= (1 << INT1 );
127
- #elif defined(MCUCR ) && defined(ISC10 ) && defined(ISC11 ) && defined(GICR )
128
- MCUCR = (MCUCR & ~((1 << ISC10 ) | (1 << ISC11 ))) | (mode << ISC10 );
129
- GICR |= (1 << INT1 );
130
- #elif defined(MCUCR ) && defined(ISC10 ) && defined(GIMSK ) && defined(GIMSK )
106
+ #elif defined(MCUCR ) && defined(ISC10 ) && defined(ISC11 )
131
107
MCUCR = (MCUCR & ~((1 << ISC10 ) | (1 << ISC11 ))) | (mode << ISC10 );
132
- GIMSK |= (1 << INT1 );
133
108
#else
134
109
#warning attachInterrupt may need some more work for this cpu (case 1)
135
110
#endif
136
111
break ;
137
112
138
113
case 2 :
139
- #if defined(EICRA ) && defined(ISC20 ) && defined(ISC21 ) && defined( EIMSK )
114
+ #if defined(EICRA ) && defined(ISC20 ) && defined(ISC21 )
140
115
EICRA = (EICRA & ~((1 << ISC20 ) | (1 << ISC21 ))) | (mode << ISC20 );
141
- EIMSK |= (1 << INT2 );
142
- #elif defined(MCUCR ) && defined(ISC20 ) && defined(ISC21 ) && defined(GICR )
116
+ #elif defined(MCUCR ) && defined(ISC20 ) && defined(ISC21 )
143
117
MCUCR = (MCUCR & ~((1 << ISC20 ) | (1 << ISC21 ))) | (mode << ISC20 );
144
- GICR |= (1 << INT2 );
145
- #elif defined(MCUCR ) && defined(ISC20 ) && defined(GIMSK ) && defined(GIMSK )
146
- MCUCR = (MCUCR & ~((1 << ISC20 ) | (1 << ISC21 ))) | (mode << ISC20 );
147
- GIMSK |= (1 << INT2 );
148
118
#endif
149
119
break ;
150
120
#endif
151
121
}
122
+
123
+ // Enable the interrupt.
124
+ enableInterrupt (interruptNum );
152
125
}
153
126
}
154
127
@@ -242,78 +215,7 @@ void enableInterrupt(uint8_t interruptNum) {
242
215
243
216
void detachInterrupt (uint8_t interruptNum ) {
244
217
if (interruptNum < EXTERNAL_NUM_INTERRUPTS ) {
245
- // Disable the interrupt. (We can't assume that interruptNum is equal
246
- // to the number of the EIMSK bit to clear, as this isn't true on the
247
- // ATmega8. There, INT0 is 6 and INT1 is 7.)
248
- switch (interruptNum ) {
249
- #if defined(__AVR_ATmega32U4__ )
250
- case 0 :
251
- EIMSK &= ~(1 <<INT0 );
252
- break ;
253
- case 1 :
254
- EIMSK &= ~(1 <<INT1 );
255
- break ;
256
- case 2 :
257
- EIMSK &= ~(1 <<INT2 );
258
- break ;
259
- case 3 :
260
- EIMSK &= ~(1 <<INT3 );
261
- break ;
262
- case 4 :
263
- EIMSK &= ~(1 <<INT6 );
264
- break ;
265
- #elif defined(EICRA ) && defined(EICRB ) && defined(EIMSK )
266
- case 2 :
267
- EIMSK &= ~(1 << INT0 );
268
- break ;
269
- case 3 :
270
- EIMSK &= ~(1 << INT1 );
271
- break ;
272
- case 4 :
273
- EIMSK &= ~(1 << INT2 );
274
- break ;
275
- case 5 :
276
- EIMSK &= ~(1 << INT3 );
277
- break ;
278
- case 0 :
279
- EIMSK &= ~(1 << INT4 );
280
- break ;
281
- case 1 :
282
- EIMSK &= ~(1 << INT5 );
283
- break ;
284
- case 6 :
285
- EIMSK &= ~(1 << INT6 );
286
- break ;
287
- case 7 :
288
- EIMSK &= ~(1 << INT7 );
289
- break ;
290
- #else
291
- case 0 :
292
- #if defined(EIMSK ) && defined(INT0 )
293
- EIMSK &= ~(1 << INT0 );
294
- #elif defined(GICR ) && defined(ISC00 )
295
- GICR &= ~(1 << INT0 ); // atmega32
296
- #elif defined(GIMSK ) && defined(INT0 )
297
- GIMSK &= ~(1 << INT0 );
298
- #else
299
- #error detachInterrupt not finished for this cpu
300
- #endif
301
- break ;
302
-
303
- case 1 :
304
- #if defined(EIMSK ) && defined(INT1 )
305
- EIMSK &= ~(1 << INT1 );
306
- #elif defined(GICR ) && defined(INT1 )
307
- GICR &= ~(1 << INT1 ); // atmega32
308
- #elif defined(GIMSK ) && defined(INT1 )
309
- GIMSK &= ~(1 << INT1 );
310
- #else
311
- #warning detachInterrupt may need some more work for this cpu (case 1)
312
- #endif
313
- break ;
314
- #endif
315
- }
316
-
218
+ disableInterrupt (interruptNum );
317
219
intFunc [interruptNum ] = 0 ;
318
220
}
319
221
}
0 commit comments