AVR Libc Home Page |  | AVR Libc Development Pages
Main Page | User Manual | Library Reference | FAQ | Alphabetical Index | Example Projects

# <avr/interrupt.h>: Interrupts

## Detailed Description

Note:
  This discussion of interrupts was originally taken from Rich Neswold's document. See Acknowledgments.

### Introduction to avr-libc's interrupt handling

It's nearly impossible to find compilers that agree on how to handle interrupt code. Since the C language tries to stay away from machine dependent details, each compiler writer is forced to design their method of support.

In the AVR-GCC environment, the vector table is predefined to point to interrupt routines with predetermined names. By using the appropriate name, your routine will be called when the corresponding interrupt occurs. The device library provides a set of default interrupt routines, which will get used if you don't define your own.

Patching into the vector table is only one part of the problem. The compiler uses, by convention, a set of registers when it's normally executing compiler-generated code. It's important that these registers, as well as the status register, get saved and restored. The extra code needed to do this is enabled by tagging the interrupt function with `__attribute__((signal))`.

These details seem to make interrupt routines a little messy, but all these details are handled by the Interrupt API. An interrupt routine is defined with ISR(). This macro register and mark the routine as an interrupt handler for the specified peripheral. The following is an example definition of a handler for the ADC interrupt.

    #include <avr/interrupt.h>

    ISR(ADC_vect)
    {
        // user code here
    }

Refer to the chapter explaining assembler programming for an explanation about interrupt routines written solely in assembler language.

### Catch-all interrupt vector

If an unexpected interrupt occurs (interrupt is enabled and no handler is installed, which usually indicates a bug), then the default action is to reset the device by jumping to the reset vector. You can override this by supplying a function named `__vector_default` which should be defined with ISR() as such.

    #include <avr/interrupt.h>

    ISR(__vector_default)
    {
        // user code here
    }

### Nested interrupts

The AVR hardware clears the global interrupt flag in SREG before entering an interrupt vector. Thus, normally interrupts will remain disabled inside the handler until the handler exits, where the RETI instruction (that is emitted by the compiler as part of the normal function epilogue for an interrupt handler) will eventually re-enable further interrupts. For that reason, interrupt handlers normally do not nest. For most interrupt handlers, this is the desired behaviour, for some it is even required in order to prevent infinitely recursive interrupts (like UART interrupts, or level-triggered external interrupts). In rare circumstances though it might be desired to re-enable the global interrupt flag as early as possible in the interrupt handler, in order to not defer any other interrupt more than absolutely needed. This could be done using an sei() instruction right at the beginning of the interrupt handler, but this still leaves few instructions inside the compiler-generated function prologue to run with global interrupts disabled. The compiler can be instructed to insert an SEI instruction right at the beginning of an interrupt handler by declaring the handler the following way:

    void XXX_vect(void) __attribute__((interrupt));
    void XXX_vect(void) {
      ...
    }

where `XXX_vect` is the name of a valid interrupt vector for the MCU type in question, as explained below.

### Choosing the vector: Interrupt vector names

The interrupt is chosen by supplying one of the symbols in following table.

There are currently two different styles present for naming the vectors. One form uses names starting with `SIG_`, followed by a relatively verbose but arbitrarily chosen name describing the interrupt vector. This has been the only available style in avr-libc up to version 1.2.x.

Starting with avr-libc version 1.4.0, a second style of interrupt vector names has been added, where a short phrase for the vector description is followed by `_vect`. The short phrase matches the vector name as described in the datasheet of the respective device (and in Atmel's XML files), with spaces replaced by an underscore and other non-alphanumeric characters dropped. Using the suffix `_vect` is intented to improve portability to other C compilers available for the AVR that use a similar naming convention.

The historical naming style might become deprecated in a future release, so it is not recommended for new projects.

Note:
  The ISR() macro cannot really spell-check the argument passed to them. Thus, by misspelling one of the names below in a call to ISR(), a function will be created that, while possibly being usable as an interrupt function, is not actually wired into the interrupt vector table. The compiler will generate a warning if it detects a suspiciously looking name of a ISR() function (i.e. one that after macro replacement does not start with "__vector_").

Vector name | Old vector name | Description | Applicable for device
ADC_vect | SIG_ADC | ADC Conversion Complete | AT90S2333, AT90S4433, AT90S4434, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny15, ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
ANALOG_COMP_0_vect | SIG_COMPARATOR0 | Analog Comparator 0 | AT90PWM3, AT90PWM2, AT90PWM1
ANALOG_COMP_1_vect | SIG_COMPARATOR1 | Analog Comparator 1 | AT90PWM3, AT90PWM2, AT90PWM1
ANALOG_COMP_2_vect | SIG_COMPARATOR2 | Analog Comparator 2 | AT90PWM3, AT90PWM2, AT90PWM1
ANALOG_COMP_vect | SIG_COMPARATOR | Analog Comparator | AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
ANA_COMP_vect | SIG_COMPARATOR | Analog Comparator | AT90S1200, AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny2313, ATtiny26, ATtiny28, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
CANIT_vect | SIG_CAN_INTERRUPT1 | CAN Transfer Complete or Error | AT90CAN128, AT90CAN32, AT90CAN64
EEPROM_READY_vect | SIG_EEPROM_READY, SIG_EE_READY |  | ATtiny2313
EE_RDY_vect | SIG_EEPROM_READY | EEPROM Ready | AT90S2333, AT90S4433, AT90S4434, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535, ATtiny12, ATtiny13, ATtiny15, ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
EE_READY_vect | SIG_EEPROM_READY | EEPROM Ready | AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
EXT_INT0_vect | SIG_INTERRUPT0 | External Interrupt Request 0 | ATtiny24, ATtiny44, ATtiny84
INT0_vect | SIG_INTERRUPT0 | External Interrupt 0 | AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny2313, ATtiny26, ATtiny28, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT1_vect | SIG_INTERRUPT1 | External Interrupt Request 1 | AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny28, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT2_vect | SIG_INTERRUPT2 | External Interrupt Request 2 | AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8515, ATmega8535, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT3_vect | SIG_INTERRUPT3 | External Interrupt Request 3 | AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega406, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT4_vect | SIG_INTERRUPT4 | External Interrupt Request 4 | AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT5_vect | SIG_INTERRUPT5 | External Interrupt Request 5 | AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT6_vect | SIG_INTERRUPT6 | External Interrupt Request 6 | AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
INT7_vect | SIG_INTERRUPT7 | External Interrupt Request 7 | AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
IO_PINS_vect | SIG_PIN, SIG_PIN_CHANGE | External Interrupt Request 0 | ATtiny11, ATtiny12, ATtiny15, ATtiny26
LCD_vect | SIG_LCD | LCD Start of Frame | ATmega169, ATmega169P, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega649, ATmega6490
LOWLEVEL_IO_PINS_vect | SIG_PIN | Low-level Input on Port B | ATtiny28
OVRIT_vect | SIG_CAN_OVERFLOW1 | CAN Timer Overrun | AT90CAN128, AT90CAN32, AT90CAN64
PCINT0_vect | SIG_PIN_CHANGE0 | Pin Change Interrupt Request 0 | ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
PCINT1_vect | SIG_PIN_CHANGE1 | Pin Change Interrupt Request 1 | ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny24, ATtiny44, ATtiny84, AT90USB162, AT90USB82
PCINT2_vect | SIG_PIN_CHANGE2 | Pin Change Interrupt Request 2 | ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
PCINT3_vect | SIG_PIN_CHANGE3 | Pin Change Interrupt Request 3 | ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega324P, ATmega164P, ATmega644P, ATmega644
PCINT_vect | SIG_PIN_CHANGE, SIG_PCINT |  | ATtiny2313, ATtiny261, ATtiny461, ATtiny861
PSC0_CAPT_vect | SIG_PSC0_CAPTURE | PSC0 Capture Event | AT90PWM3, AT90PWM2, AT90PWM1
PSC0_EC_vect | SIG_PSC0_END_CYCLE | PSC0 End Cycle | AT90PWM3, AT90PWM2, AT90PWM1
PSC1_CAPT_vect | SIG_PSC1_CAPTURE | PSC1 Capture Event | AT90PWM3, AT90PWM2, AT90PWM1
PSC1_EC_vect | SIG_PSC1_END_CYCLE | PSC1 End Cycle | AT90PWM3, AT90PWM2, AT90PWM1
PSC2_CAPT_vect | SIG_PSC2_CAPTURE | PSC2 Capture Event | AT90PWM3, AT90PWM2, AT90PWM1
PSC2_EC_vect | SIG_PSC2_END_CYCLE | PSC2 End Cycle | AT90PWM3, AT90PWM2, AT90PWM1
SPI_STC_vect | SIG_SPI | Serial Transfer Complete | AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
SPM_RDY_vect | SIG_SPM_READY | Store Program Memory Ready | ATmega16, ATmega162, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535
SPM_READY_vect | SIG_SPM_READY | Store Program Memory Read | AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIM0_COMPA_vect | SIG_OUTPUT_COMPARE0A | Timer/Counter Compare Match A | ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85
TIM0_COMPB_vect | SIG_OUTPUT_COMPARE0B | Timer/Counter Compare Match B | ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85
TIM0_OVF_vect | SIG_OVERFLOW0 | Timer/Counter0 Overflow | ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85
TIM1_CAPT_vect | SIG_INPUT_CAPTURE1 | Timer/Counter1 Capture Event | ATtiny24, ATtiny44, ATtiny84
TIM1_COMPA_vect | SIG_OUTPUT_COMPARE1A | Timer/Counter1 Compare Match A | ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85
TIM1_COMPB_vect | SIG_OUTPUT_COMPARE1B | Timer/Counter1 Compare Match B | ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85
TIM1_OVF_vect | SIG_OVERFLOW1 | Timer/Counter1 Overflow | ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85
TIMER0_CAPT_vect | SIG_INPUT_CAPTURE0 | ADC Conversion Complete | ATtiny261, ATtiny461, ATtiny861
TIMER0_COMPA_vect | SIG_OUTPUT_COMPARE0A | TimerCounter0 Compare Match A | ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER0_COMPB_vect | SIG_OUTPUT_COMPARE0B, SIG_OUTPUT_COMPARE0_B | Timer Counter 0 Compare Match B | AT90PWM3, AT90PWM2, AT90PWM1, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER0_COMP_A_vect | SIG_OUTPUT_COMPARE0A, SIG_OUTPUT_COMPARE0_A | Timer/Counter0 Compare Match A | AT90PWM3, AT90PWM2, AT90PWM1
TIMER0_COMP_vect | SIG_OUTPUT_COMPARE0 | Timer/Counter0 Compare Match | AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8515, ATmega8535
TIMER0_OVF0_vect | SIG_OVERFLOW0 | Timer/Counter0 Overflow | AT90S2313, AT90S2323, AT90S2343, ATtiny22, ATtiny26
TIMER0_OVF_vect | SIG_OVERFLOW0 | Timer/Counter0 Overflow | AT90S1200, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny11, ATtiny12, ATtiny15, ATtiny2313, ATtiny28, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER1_CAPT1_vect | SIG_INPUT_CAPTURE1 | Timer/Counter1 Capture Event | AT90S2313
TIMER1_CAPT_vect | SIG_INPUT_CAPTURE1 | Timer/Counter Capture Event | AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER1_CMPA_vect | SIG_OUTPUT_COMPARE1A | Timer/Counter1 Compare Match 1A | ATtiny26
TIMER1_CMPB_vect | SIG_OUTPUT_COMPARE1B | Timer/Counter1 Compare Match 1B | ATtiny26
TIMER1_COMP1_vect | SIG_OUTPUT_COMPARE1A | Timer/Counter1 Compare Match | AT90S2313
TIMER1_COMPA_vect | SIG_OUTPUT_COMPARE1A | Timer/Counter1 Compare Match A | AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER1_COMPB_vect | SIG_OUTPUT_COMPARE1B | Timer/Counter1 Compare MatchB | AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER1_COMPC_vect | SIG_OUTPUT_COMPARE1C | Timer/Counter1 Compare Match C | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER1_COMPD_vect | SIG_OUTPUT_COMPARE0D | Timer/Counter1 Compare Match D | ATtiny261, ATtiny461, ATtiny861
TIMER1_COMP_vect | SIG_OUTPUT_COMPARE1A | Timer/Counter1 Compare Match | AT90S2333, AT90S4433, ATtiny15
TIMER1_OVF1_vect | SIG_OVERFLOW1 | Timer/Counter1 Overflow | AT90S2313, ATtiny26
TIMER1_OVF_vect | SIG_OVERFLOW1 | Timer/Counter1 Overflow | AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny15, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER2_COMPA_vect | SIG_OUTPUT_COMPARE2A | Timer/Counter2 Compare Match A | ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER2_COMPB_vect | SIG_OUTPUT_COMPARE2B | Timer/Counter2 Compare Match A | ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER2_COMP_vect | SIG_OUTPUT_COMPARE2 | Timer/Counter2 Compare Match | AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535
TIMER2_OVF_vect | SIG_OVERFLOW2 | Timer/Counter2 Overflow | AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER3_CAPT_vect | SIG_INPUT_CAPTURE3 | Timer/Counter3 Capture Event | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER3_COMPA_vect | SIG_OUTPUT_COMPARE3A | Timer/Counter3 Compare Match A | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER3_COMPB_vect | SIG_OUTPUT_COMPARE3B | Timer/Counter3 Compare Match B | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER3_COMPC_vect | SIG_OUTPUT_COMPARE3C | Timer/Counter3 Compare Match C | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER3_OVF_vect | SIG_OVERFLOW3 | Timer/Counter3 Overflow | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TIMER4_CAPT_vect | SIG_INPUT_CAPTURE4 | Timer/Counter4 Capture Event | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER4_COMPA_vect | SIG_OUTPUT_COMPARE4A | Timer/Counter4 Compare Match A | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER4_COMPB_vect | SIG_OUTPUT_COMPARE4B | Timer/Counter4 Compare Match B | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER4_COMPC_vect | SIG_OUTPUT_COMPARE4C | Timer/Counter4 Compare Match C | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER4_OVF_vect | SIG_OVERFLOW4 | Timer/Counter4 Overflow | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER5_CAPT_vect | SIG_INPUT_CAPTURE5 | Timer/Counter5 Capture Event | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER5_COMPA_vect | SIG_OUTPUT_COMPARE5A | Timer/Counter5 Compare Match A | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER5_COMPB_vect | SIG_OUTPUT_COMPARE5B | Timer/Counter5 Compare Match B | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER5_COMPC_vect | SIG_OUTPUT_COMPARE5C | Timer/Counter5 Compare Match C | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TIMER5_OVF_vect | SIG_OVERFLOW5 | Timer/Counter5 Overflow | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
TWI_vect | SIG_2WIRE_SERIAL | 2-wire Serial Interface | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega16, ATmega163, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
TXDONE_vect | SIG_TXDONE | Transmission Done, Bit Timer Flag 2 Interrupt | AT86RF401
TXEMPTY_vect | SIG_TXBE | Transmit Buffer Empty, Bit Itmer Flag 0 Interrupt | AT86RF401
UART0_RX_vect | SIG_UART0_RECV | UART0, Rx Complete | ATmega161
UART0_TX_vect | SIG_UART0_TRANS | UART0, Tx Complete | ATmega161
UART0_UDRE_vect | SIG_UART0_DATA | UART0 Data Register Empty | ATmega161
UART1_RX_vect | SIG_UART1_RECV | UART1, Rx Complete | ATmega161
UART1_TX_vect | SIG_UART1_TRANS | UART1, Tx Complete | ATmega161
UART1_UDRE_vect | SIG_UART1_DATA | UART1 Data Register Empty | ATmega161
UART_RX_vect | SIG_UART_RECV | UART, Rx Complete | AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515
UART_TX_vect | SIG_UART_TRANS | UART, Tx Complete | AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515
UART_UDRE_vect | SIG_UART_DATA | UART Data Register Empty | AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515
USART0_RXC_vect | SIG_USART0_RECV | USART0, Rx Complete | ATmega162
USART0_RX_vect | SIG_UART0_RECV | USART0, Rx Complete | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega329P, ATmega64, ATmega645, ATmega649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
USART0_TXC_vect | SIG_USART0_TRANS | USART0, Tx Complete | ATmega162
USART0_TX_vect | SIG_UART0_TRANS | USART0, Tx Complete | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
USART0_UDRE_vect | SIG_UART0_DATA | USART0 Data Register Empty | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega329P, ATmega64, ATmega645, ATmega649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644
USART1_RXC_vect | SIG_USART1_RECV | USART1, Rx Complete | ATmega162
USART1_RX_vect | SIG_UART1_RECV | USART1, Rx Complete | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
USART1_TXC_vect | SIG_USART1_TRANS | USART1, Tx Complete | ATmega162
USART1_TX_vect | SIG_UART1_TRANS | USART1, Tx Complete | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
USART1_UDRE_vect | SIG_UART1_DATA | USART1, Data Register Empty | AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646
USART2_RX_vect | SIG_USART2_RECV | USART2, Rx Complete | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
USART2_TX_vect | SIG_USART2_TRANS | USART2, Tx Complete | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
USART2_UDRE_vect | SIG_USART2_DATA | USART2 Data register Empty | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
USART3_RX_vect | SIG_USART3_RECV | USART3, Rx Complete | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
USART3_TX_vect | SIG_USART3_TRANS | USART3, Tx Complete | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
USART3_UDRE_vect | SIG_USART3_DATA | USART3 Data register Empty | ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561
USART_RXC_vect | SIG_USART_RECV, SIG_UART_RECV | USART, Rx Complete | ATmega16, ATmega32, ATmega323, ATmega8
USART_RX_vect | SIG_USART_RECV, SIG_UART_RECV | USART, Rx Complete | AT90PWM3, AT90PWM2, AT90PWM1, ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega8535, ATmega168, ATmega48, ATmega88, ATtiny2313
USART_TXC_vect | SIG_USART_TRANS, SIG_UART_TRANS | USART, Tx Complete | ATmega16, ATmega32, ATmega323, ATmega8
USART_TX_vect | SIG_USART_TRANS, SIG_UART_TRANS | USART, Tx Complete | AT90PWM3, AT90PWM2, AT90PWM1, ATmega8535, ATmega168, ATmega48, ATmega88, ATtiny2313
USART_UDRE_vect | SIG_USART_DATA, SIG_UART_DATA | USART Data Register Empty | AT90PWM3, AT90PWM2, AT90PWM1, ATmega16, ATmega32, ATmega323, ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATtiny2313
USI_OVERFLOW_vect | SIG_USI_OVERFLOW | USI Overflow | ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATtiny2313
USI_OVF_vect | SIG_USI_OVERFLOW | USI Overflow | ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
USI_START_vect | SIG_USI_START | USI Start Condition | ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega645, ATmega6450, ATmega649, ATmega6490, ATtiny2313, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861
USI_STRT_vect | SIG_USI_START | USI Start | ATtiny26
USI_STR_vect | SIG_USI_START | USI START | ATtiny24, ATtiny44, ATtiny84
WATCHDOG_vect | SIG_WATCHDOG_TIMEOUT | Watchdog Time-out | ATtiny24, ATtiny44, ATtiny84
WDT_OVERFLOW_vect | SIG_WATCHDOG_TIMEOUT, SIG_WDT_OVERFLOW | Watchdog Timer Overflow | ATtiny2313
WDT_vect | SIG_WDT, SIG_WATCHDOG_TIMEOUT | Watchdog Timeout Interrupt | AT90PWM3, AT90PWM2, AT90PWM1, ATmega406, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

## Global manipulation of the interrupt flag
The global interrupt flag is maintained in the I bit of the status register (SREG).
#define | sei()
#define | cli()
## Macros for writing interrupt handler functions
#define | ISR(vector)
#define | SIGNAL(vector)
#define | EMPTY_INTERRUPT(vector)
#define | ISR_ALIAS(vector, target_vector)

## Define Documentation

#define cli | ( |  | ) |

     #include <avr/interrupt.h>

Disables all interrupts by clearing the global interrupt mask. This function actually compiles into a single line of assembly, so there is no function call overhead.

#define EMPTY_INTERRUPT | ( | vector |  | ) |

     #include <avr/interrupt.h>

Defines an empty interrupt handler function. This will not generate any prolog or epilog code and will only return from the ISR. Do not define a function body as this will define it for you. Example:

     EMPTY_INTERRUPT(ADC_vect);

#define ISR | ( | vector |  | ) |

     #include <avr/interrupt.h>

Introduces an interrupt handler function (interrupt service routine) that runs with global interrupts initially disabled.

`vector` must be one of the interrupt vector names that are valid for the particular MCU type.

#define ISR_ALIAS | ( | vector,
|  | target_vector |  | ) |

     #include <avr/interrupt.h>

Defines `vector` to point to the same interrupt vector as `target_vector`. That way, a single interrupt vector implementation can be used to serve several interrupt sources.

Do not define a function body.

Note:
  This requires a recent version of AVR-GCC to work (GCC 4.2 or patched GCC 4.1.x).

Example:

        ISR(INT0_vect)
        {
            PORTB = 42;
        }

        ISR_ALIAS(INT1_vect, INT0_vect);

#define sei | ( |  | ) |

     #include <avr/interrupt.h>

Enables interrupts by setting the global interrupt mask. This function actually compiles into a single line of assembly, so there is no function call overhead.

#define SIGNAL | ( | vector |  | ) |

     #include <avr/interrupt.h>

Introduces an interrupt handler function that runs with global interrupts initially disabled.

This is the same as the ISR macro.

Deprecated:
  Do not use SIGNAL() in new code. Use ISR() instead.

Automatically generated by Doxygen 1.5.2 on 1 Dec 2007.