.. _avr-isr-vector: 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: .. csv-table:: :header: 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: .. code-block:: text #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: .. code-block:: text ; org 0x0000 RESET rjmp start org 0x0016 rjmp Timer1_ISR start: ; main code goes here ... Timer1_ISR: ; code for interrupt service routine goes here.