@@ -152,6 +152,94 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
152
152
}
153
153
}
154
154
155
+ void enableInterrupt (uint8_t interruptNum ) {
156
+ if (interruptNum < EXTERNAL_NUM_INTERRUPTS ) {
157
+
158
+ // Enable the interrupt.
159
+ switch (interruptNum ) {
160
+ #if defined(__AVR_ATmega32U4__ )
161
+ // I hate doing this, but the register assignment differs between the 1280/2560
162
+ // and the 32U4. Since avrlib defines registers PCMSK1 and PCMSK2 that aren't
163
+ // even present on the 32U4 this is the only way to distinguish between them.
164
+ case 0 :
165
+ EIMSK |= (1 <<INT0 );
166
+ break ;
167
+ case 1 :
168
+ EIMSK |= (1 <<INT1 );
169
+ break ;
170
+ case 2 :
171
+ EIMSK |= (1 <<INT2 );
172
+ break ;
173
+ case 3 :
174
+ EIMSK |= (1 <<INT3 );
175
+ break ;
176
+ case 4 :
177
+ EIMSK |= (1 <<INT6 );
178
+ break ;
179
+ #elif defined(EIFR ) && defined(EICRB ) && defined(EIMSK )
180
+ case 2 :
181
+ EIMSK |= (1 << INT0 );
182
+ break ;
183
+ case 3 :
184
+ EIMSK |= (1 << INT1 );
185
+ break ;
186
+ case 4 :
187
+ EIMSK |= (1 << INT2 );
188
+ break ;
189
+ case 5 :
190
+ EIMSK |= (1 << INT3 );
191
+ break ;
192
+ case 0 :
193
+ EIMSK |= (1 << INT4 );
194
+ break ;
195
+ case 1 :
196
+ EIMSK |= (1 << INT5 );
197
+ break ;
198
+ case 6 :
199
+ EIMSK |= (1 << INT6 );
200
+ break ;
201
+ case 7 :
202
+ EIMSK |= (1 << INT7 );
203
+ break ;
204
+ #else
205
+ case 0 :
206
+ #if defined(ISC00 ) && defined(EIMSK )
207
+ EIMSK |= (1 << INT0 );
208
+ #elif defined(ISC00 ) && defined(GICR )
209
+ GICR |= (1 << INT0 );
210
+ #elif defined(ISC00 ) && defined(GIMSK )
211
+ GIMSK |= (1 << INT0 );
212
+ #else
213
+ #error attachInterrupt not finished for this CPU (case 0)
214
+ #endif
215
+ break ;
216
+
217
+ case 1 :
218
+ #if defined(ISC10 ) && defined(ISC11 ) && defined(EIMSK )
219
+ EIMSK |= (1 << INT1 );
220
+ #elif defined(ISC10 ) && defined(ISC11 ) && defined(GICR )
221
+ GICR |= (1 << INT1 );
222
+ #elif defined(ISC10 ) && defined(GIMSK ) && defined(GIMSK )
223
+ GIMSK |= (1 << INT1 );
224
+ #else
225
+ #warning attachInterrupt may need some more work for this cpu (case 1)
226
+ #endif
227
+ break ;
228
+
229
+ case 2 :
230
+ #if defined(ISC20 ) && defined(ISC21 ) && defined(EIMSK )
231
+ EIMSK |= (1 << INT2 );
232
+ #elif defined(ISC20 ) && defined(ISC21 ) && defined(GICR )
233
+ GICR |= (1 << INT2 );
234
+ #elif defined(ISC20 ) && defined(GIMSK ) && defined(GIMSK )
235
+ GIMSK |= (1 << INT2 );
236
+ #endif
237
+ break ;
238
+ #endif
239
+ }
240
+ }
241
+ }
242
+
155
243
void detachInterrupt (uint8_t interruptNum ) {
156
244
if (interruptNum < EXTERNAL_NUM_INTERRUPTS ) {
157
245
// Disable the interrupt. (We can't assume that interruptNum is equal
@@ -230,6 +318,82 @@ void detachInterrupt(uint8_t interruptNum) {
230
318
}
231
319
}
232
320
321
+ void disableInterrupt (uint8_t interruptNum ) {
322
+ if (interruptNum < EXTERNAL_NUM_INTERRUPTS ) {
323
+ // Disable the interrupt. (We can't assume that interruptNum is equal
324
+ // to the number of the EIMSK bit to clear, as this isn't true on the
325
+ // ATmega8. There, INT0 is 6 and INT1 is 7.)
326
+ switch (interruptNum ) {
327
+ #if defined(__AVR_ATmega32U4__ )
328
+ case 0 :
329
+ EIMSK &= ~(1 <<INT0 );
330
+ break ;
331
+ case 1 :
332
+ EIMSK &= ~(1 <<INT1 );
333
+ break ;
334
+ case 2 :
335
+ EIMSK &= ~(1 <<INT2 );
336
+ break ;
337
+ case 3 :
338
+ EIMSK &= ~(1 <<INT3 );
339
+ break ;
340
+ case 4 :
341
+ EIMSK &= ~(1 <<INT6 );
342
+ break ;
343
+ #elif defined(EICRA ) && defined(EICRB ) && defined(EIMSK )
344
+ case 2 :
345
+ EIMSK &= ~(1 << INT0 );
346
+ break ;
347
+ case 3 :
348
+ EIMSK &= ~(1 << INT1 );
349
+ break ;
350
+ case 4 :
351
+ EIMSK &= ~(1 << INT2 );
352
+ break ;
353
+ case 5 :
354
+ EIMSK &= ~(1 << INT3 );
355
+ break ;
356
+ case 0 :
357
+ EIMSK &= ~(1 << INT4 );
358
+ break ;
359
+ case 1 :
360
+ EIMSK &= ~(1 << INT5 );
361
+ break ;
362
+ case 6 :
363
+ EIMSK &= ~(1 << INT6 );
364
+ break ;
365
+ case 7 :
366
+ EIMSK &= ~(1 << INT7 );
367
+ break ;
368
+ #else
369
+ case 0 :
370
+ #if defined(EIMSK ) && defined(INT0 )
371
+ EIMSK &= ~(1 << INT0 );
372
+ #elif defined(GICR ) && defined(ISC00 )
373
+ GICR &= ~(1 << INT0 ); // atmega32
374
+ #elif defined(GIMSK ) && defined(INT0 )
375
+ GIMSK &= ~(1 << INT0 );
376
+ #else
377
+ #error detachInterrupt not finished for this cpu
378
+ #endif
379
+ break ;
380
+
381
+ case 1 :
382
+ #if defined(EIMSK ) && defined(INT1 )
383
+ EIMSK &= ~(1 << INT1 );
384
+ #elif defined(GICR ) && defined(INT1 )
385
+ GICR &= ~(1 << INT1 ); // atmega32
386
+ #elif defined(GIMSK ) && defined(INT1 )
387
+ GIMSK &= ~(1 << INT1 );
388
+ #else
389
+ #warning detachInterrupt may need some more work for this cpu (case 1)
390
+ #endif
391
+ break ;
392
+ #endif
393
+ }
394
+ }
395
+ }
396
+
233
397
/*
234
398
void attachInterruptTwi(void (*userFunc)(void) ) {
235
399
twiIntFunc = userFunc;
0 commit comments