March Madness - AVR InterruptsArduino 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> |