March Madness - AVR Interrupts

Arduino Explorer Part 3

My Arduino Exporer program is becoming quite useful. I spent all day Sunday using it to track down which pin is what on the Liquidware Touchslide. and was able to update the core files.

The memory dump command allows you to look at RAM, and FLASH. The first part of the flash memory is the interrupt vectors. I got interested in figuring out how these work.

First a bit of history. From 1977 though 1990, I programed the Motorola 6800 family of processors. These were 8 bit cpus, very similar to the avr. Of course not near as powerful. They had 4 interrupt vectors, RESET, NON-MASKABLE IRQ, IRQ and Software Interrupt. They were the last 8 bytes of memory (0xFFF8 -> 0xFFFF).

Why do I bring this up. This is VERY similar to the interrupts on the AVR. The AVR had many more interrupt vectors and they are the bottom end of program memory starting at address 0000.

Interrupts on the AVR. Things you need to know

Below the first part is a simple memory dump from the MEGA, you will notice that the first 4 bytes are 7D C3 00 00. This translates to C3 7D 00 00, which is RJMP 037D. Since RJMP is a 16 bit the 00 00 would be the next instruction. However, it never gets executed.

The next part shows the entire list of interrupt vectors for each CPU.

Click here for the Arduino Explorer Manual Full source code is available.

Arduino>F
0000 - 7D C3 00 00 A6 C3 00 00 A4 C3 00 00 A2 C3 00 00 }...............
0010 - A0 C3 00 00 9E C3 00 00 9C C3 00 00 9A C3 00 00 ................
0020 - 98 C3 00 00 96 C3 00 00 94 C3 00 00 92 C3 00 00 ................
0030 - 90 C3 00 00 8E C3 00 00 8C C3 00 00 8A C3 00 00 ................
0040 - 88 C3 00 00 86 C3 00 00 84 C3 00 00 82 C3 00 00 ................
0050 - 80 C3 00 00 7E C3 00 00 7C C3 00 00 0C 94 19 17 ....~...|.......
0060 - 78 C3 00 00 0C 94 0D 1A 74 C3 00 00 72 C3 00 00 x.......t...r...
0070 - 70 C3 00 00 6E C3 00 00 6C C3 00 00 6A C3 00 00 p...n...l...j...
0080 - 68 C3 00 00 66 C3 00 00 64 C3 00 00 62 C3 00 00 h...f...d...b...
0090 - 0C 94 4D 1A 5E C3 00 00 5C C3 00 00 BD C7 00 00 ..M.^...\.......
00A0 - 58 C3 00 00 56 C3 00 00 54 C3 00 00 52 C3 00 00 X...V...T...R...
00B0 - 50 C3 00 00 4E C3 00 00 4C C3 00 00 4A C3 00 00 P...N...L...J...
00C0 - 48 C3 00 00 46 C3 00 00 44 C3 00 00 0C 94 8D 1A H...F...D.......
00D0 - 40 C3 00 00 3E C3 00 00 0C 94 CD 1A 3A C3 00 00 @...>.......:...
00E0 - 38 C3 00 00 8D 16 9A 16 A1 16 A9 16 B4 16 05 17 8...............
00F0 - 08 17 14 17 14 17 14 17 14 17 14 17 14 17 14 17 ................
Arduino>

Atmega328P (Duemilanove) ATmega1280 (Mega)
V#   ADDR   Vector      inst        Interrupt
 1 - 0000 = C2 B8 00 00 rjmp 02B8   RESET
 2 - 0002 = C2 DE 00 00 rjmp 02DE   INT0
 3 - 0004 = C2 DC 00 00 rjmp 02DC   INT1
 4 - 0006 = C2 DA 00 00 rjmp 02DA   PCINT0
 5 - 0008 = C2 D8 00 00 rjmp 02D8   PCINT1
 6 - 000A = C2 D6 00 00 rjmp 02D6   PCINT2
 7 - 000C = C2 D4 00 00 rjmp 02D4   WDT
 8 - 000E = C2 D2 00 00 rjmp 02D2   TIMER2 COMPA
 9 - 0010 = C2 D0 00 00 rjmp 02D0   TIMER2 COMPB
10 - 0012 = C2 CE 00 00 rjmp 02CE   TIMER2 OVF 
11 - 0014 = C2 CC 00 00 rjmp 02CC   TIMER1 CAPT
12 - 0016 = C2 CA 00 00 rjmp 02CA   TIMER1 COMPA
13 - 0018 = C2 C8 00 00 rjmp 02C8   TIMER1 COMPB 
14 - 001A = C2 C6 00 00 rjmp 02C6   TIMER1 OVF
15 - 001C = C2 C4 00 00 rjmp 02C4   TIMER0 COMPA
16 - 001E = C2 C2 00 00 rjmp 02C2   TIMER0 COMPB
17 - 0020 = 94 0C 15 5D jmp  00155D TIMER0 OVF 
18 - 0022 = C2 BE 00 00 rjmp 02BE   SPI, STC
19 - 0024 = 94 0C 17 3A jmp  00173A USART0, RX
20 - 0026 = C2 BA 00 00 rjmp 02BA   USART0, UDRE
21 - 0028 = C2 B8 00 00 rjmp 02B8   USART0, TX
22 - 002A = C2 B6 00 00 rjmp 02B6   ADC
23 - 002C = C2 B4 00 00 rjmp 02B4   EE READY
24 - 002E = C2 B2 00 00 rjmp 02B2   ANALOG COMP
25 - 0030 = C7 13 00 00 rjmp 0713   TWI
26 - 0032 = C2 AE 00 00 rjmp 02AE   SPM READY
Arduino>


V#   ADDR   Vector      inst        Interrupt
 1 - 0000 = C3 7D 00 00 rjmp 037D   RESET
 2 - 0002 = C3 A6 00 00 rjmp 03A6   INT0
 3 - 0004 = C3 A4 00 00 rjmp 03A4   INT1
 4 - 0006 = C3 A2 00 00 rjmp 03A2   INT2
 5 - 0008 = C3 A0 00 00 rjmp 03A0   INT3
 6 - 000A = C3 9E 00 00 rjmp 039E   INT4
 7 - 000C = C3 9C 00 00 rjmp 039C   INT5
 8 - 000E = C3 9A 00 00 rjmp 039A   INT6
 9 - 0010 = C3 98 00 00 rjmp 0398   INT7
10 - 0012 = C3 96 00 00 rjmp 0396   PCINT0
11 - 0014 = C3 94 00 00 rjmp 0394   PCINT1
12 - 0016 = C3 92 00 00 rjmp 0392   PCINT2
13 - 0018 = C3 90 00 00 rjmp 0390   WDT
14 - 001A = C3 8E 00 00 rjmp 038E   TIMER2 COMPA
15 - 001C = C3 8C 00 00 rjmp 038C   TIMER2 COMPB
16 - 001E = C3 8A 00 00 rjmp 038A   TIMER2 OVF 
17 - 0020 = C3 88 00 00 rjmp 0388   TIMER1 CAPT
18 - 0022 = C3 86 00 00 rjmp 0386   TIMER1 COMPA
19 - 0024 = C3 84 00 00 rjmp 0384   TIMER1 COMPB 
20 - 0026 = C3 82 00 00 rjmp 0382   TIMER1 COMPC
21 - 0028 = C3 80 00 00 rjmp 0380   TIMER1 OVF
22 - 002A = C3 7E 00 00 rjmp 037E   TIMER0 COMPA
23 - 002C = C3 7C 00 00 rjmp 037C   TIMER0 COMPB
24 - 002E = 94 0C 17 19 jmp  001719 TIMER0 OVF 
25 - 0030 = C3 78 00 00 rjmp 0378   SPI, STC
26 - 0032 = 94 0C 1A 0D jmp  001A0D USART0, RX
27 - 0034 = C3 74 00 00 rjmp 0374   USART0, UDRE
28 - 0036 = C3 72 00 00 rjmp 0372   USART0, TX
29 - 0038 = C3 70 00 00 rjmp 0370   ANALOG COMP
30 - 003A = C3 6E 00 00 rjmp 036E   ADC
31 - 003C = C3 6C 00 00 rjmp 036C   EE READY
32 - 003E = C3 6A 00 00 rjmp 036A   TIMER3 CAPT
33 - 0040 = C3 68 00 00 rjmp 0368   TIMER3 COMPA
34 - 0042 = C3 66 00 00 rjmp 0366   TIMER3 COMPB
35 - 0044 = C3 64 00 00 rjmp 0364   TIMER3 COMPC
36 - 0046 = C3 62 00 00 rjmp 0362   TIMER3 OVF 
37 - 0048 = 94 0C 1A 4D jmp  001A4D USART1, RX
38 - 004A = C3 5E 00 00 rjmp 035E   USART1, UDRE
39 - 004C = C3 5C 00 00 rjmp 035C   USART1, TX
40 - 004E = C7 BD 00 00 rjmp 07BD   TWI
41 - 0050 = C3 58 00 00 rjmp 0358   SPM READY
42 - 0052 = C3 56 00 00 rjmp 0356   TIMER4 CAPT
43 - 0054 = C3 54 00 00 rjmp 0354   TIMER4 COMPA
44 - 0056 = C3 52 00 00 rjmp 0352   TIMER4 COMPB
45 - 0058 = C3 50 00 00 rjmp 0350   TIMER4 COMPC
46 - 005A = C3 4E 00 00 rjmp 034E   TIMER4 OVF 
47 - 005C = C3 4C 00 00 rjmp 034C   TIMER5 CAPT
48 - 005E = C3 4A 00 00 rjmp 034A   TIMER5 COMPA
49 - 0060 = C3 48 00 00 rjmp 0348   TIMER5 COMPB
50 - 0062 = C3 46 00 00 rjmp 0346   TIMER5 COMPC
51 - 0064 = C3 44 00 00 rjmp 0344   TIMER5 OVF 
52 - 0066 = 94 0C 1A 8D jmp  001A8D USART2, RX
53 - 0068 = C3 40 00 00 rjmp 0340   USART2, UDRE
54 - 006A = C3 3E 00 00 rjmp 033E   USART2, TX
55 - 006C = 94 0C 1A CD jmp  001ACD USART3, RX
56 - 006E = C3 3A 00 00 rjmp 033A   USART3, UDRE
57 - 0070 = C3 38 00 00 rjmp 0338   USART3, TX
Arduino>