|
- #if defined(__AVR__)
-
- #include <avr/io.h>
- #include <avr/interrupt.h>
-
- #define attachInterrupt(num, func, mode) enableInterrupt(num)
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- #define SCRAMBLE_INT_ORDER(num) ((num < 4) ? num + 2 : ((num < 6) ? num - 4 : num))
- #define DESCRAMBLE_INT_ORDER(num) ((num < 2) ? num + 4 : ((num < 6) ? num - 2 : num))
- #else
- #define SCRAMBLE_INT_ORDER(num) (num)
- #define DESCRAMBLE_INT_ORDER(num) (num)
- #endif
-
- static void enableInterrupt(uint8_t num)
- {
- switch (DESCRAMBLE_INT_ORDER(num)) {
- #if defined(EICRA) && defined(EIMSK)
- case 0:
- EICRA = (EICRA & 0xFC) | 0x01;
- EIMSK |= 0x01;
- return;
- case 1:
- EICRA = (EICRA & 0xF3) | 0x04;
- EIMSK |= 0x02;
- return;
- case 2:
- EICRA = (EICRA & 0xCF) | 0x10;
- EIMSK |= 0x04;
- return;
- case 3:
- EICRA = (EICRA & 0x3F) | 0x40;
- EIMSK |= 0x08;
- return;
- #elif defined(MCUCR) && defined(GICR)
- case 0:
- MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
- GICR |= (1 << INT0);
- return;
- case 1:
- MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
- GICR |= (1 << INT1);
- return;
- #elif defined(MCUCR) && defined(GIMSK)
- case 0:
- MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
- GIMSK |= (1 << INT0);
- return;
- case 1:
- MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
- GIMSK |= (1 << INT1);
- return;
- #endif
- #if defined(EICRB) && defined(EIMSK)
- case 4:
- EICRB = (EICRB & 0xFC) | 0x01;
- EIMSK |= 0x10;
- return;
- case 5:
- EICRB = (EICRB & 0xF3) | 0x04;
- EIMSK |= 0x20;
- return;
- case 6:
- EICRB = (EICRB & 0xCF) | 0x10;
- EIMSK |= 0x40;
- return;
- case 7:
- EICRB = (EICRB & 0x3F) | 0x40;
- EIMSK |= 0x80;
- return;
- #endif
- }
- }
-
- #elif defined(__PIC32MX__)
-
- #ifdef ENCODER_OPTIMIZE_INTERRUPTS
- #undef ENCODER_OPTIMIZE_INTERRUPTS
- #endif
-
- #else
-
- #ifdef ENCODER_OPTIMIZE_INTERRUPTS
- #undef ENCODER_OPTIMIZE_INTERRUPTS
- #endif
-
- #endif
|