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.