Using Interrupts in AVR GCC

When we use interavrupqts in assembly language, we need to make sure that the interrupt vector jump table, which needs to be set up starting at address 0x00, is properly set up. The names we need to use for each possible interrupt source are defined in the datasheet for the chip being used. From that document (page 65) we see this table:

VectorNo Address Name Definition
0 0x0000 RESET Power-on Reset
1 0x0002 INT0_vect External Interrupt Request 0
2 0x0004 INT1_vect External Interrupt Request 1
3 0x0004 PCINT0_vect Pin Change Interrupt Request 0
4 0x0008 PCINT1_vect Pin Change Interrupt Request 1
5 0x000A PCINT2_vect Pin Change Interrupt Request 2
6 0x000C WDT_vect Watchdog Time-out Interrupt
7 0x000E TIMER2_COMPA_vect Timer/Counter2 Compare Match A
8 0x0010 TIMER2_COMPB_vect Timer/Counter2 Compare Match A
9 0x0012 TIMER2_OVF_vect Timer/Counter2 Overflow
10 0x0014 TIMER1_CAPT_vect Timer/Counter1 Capture Event
11 0x0016 TIMER1_COMPA_vect Timer/Counter1 Compare Match A
12 0x0018 TIMER1_COMPB_vect Timer/Counter1 Compare Match B
13 0x001A TIMER1_OVF_vect Timer/Counter1 Overflow
14 0x001C TIMER1_COMPA_vect Timer/Counter0 Compare Match A
15 0x001E TIMER1_COMPB_vect Timer/Counter0 Compare Match A
16 0x0020 TIMER0_OVF_vect Timer/Counter0 Overflow
17 0x0022 SPI_STC_vect SPI Serial Transfer Complete
18 0x0024 USART_RX_vect USART Rx Complete
19 0x0026 USART_UDRE_vect USART Data Register Empty
20 0x0028 USART_TX_vect USART Tx Complete
21 0x002A ADC_vect ADC Conversion Complete
22 0x002C EE_READY_vect EEPROM Ready
23 0x002E ANALOG_COMP_vect Analog Comparator
24 0x0030 TWI_vect 2-wire Serial Interface
25 0x0032 SPM_READY_vect Store Program Memory Ready

If you dig into the AVR_GCC files, you will find a file named Interrupts.h where a handy ISR macro is defined. We can use this macro to set up the required entry in the vector table:

#define ISR(vector)

The actual macro is more complex than this, but this will work for our assembly language work. The vector names we need to use are define din the table above.

As an example, here is how we would set up the required entry in the vector table for using the counter compare interrupt for Timer1:

;
        org 0x0000
RESET   rjmp        start

        org 0x0016
        rjmp        Timer1_ISR

start:  ; main code goes here
        ...

Timer1_ISR:
        ; code for interrupt service routine goes here.