Hallo, habe ein Problem mit den Interrupts beim AT90CAN128. In folgendem Thread habe ich gelesen, dass wohl die Vektoren falsch definiert sind: Beitrag "AT90CAN 128 CAN-Schnittstelle" . Im Disassembly kann ich dies auch nachvollziehen:
1 | Disassembly of section .text: |
2 | |
3 | 00000000 <__vectors>: |
4 | 0: 0c 94 4a 00 jmp 0x94 ; 0x94 <__ctors_end> |
5 | 4: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
6 | 8: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
7 | c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
8 | 10: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
9 | 14: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
10 | 18: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
11 | 1c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
12 | 20: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
13 | 24: 0c 94 77 00 jmp 0xee ; 0xee <__vector_9> |
14 | 28: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
15 | 2c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
16 | 30: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
17 | 34: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
18 | 38: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
19 | 3c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
20 | 40: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
21 | 44: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
22 | 48: 0c 94 6c 00 jmp 0xd8 ; 0xd8 <__vector_18> |
23 | 4c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
24 | 50: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
25 | 54: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
26 | 58: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
27 | 5c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
28 | 60: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
29 | 64: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
30 | 68: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
31 | 6c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
32 | 70: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
33 | 74: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
34 | 78: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
35 | 7c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
36 | 80: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
37 | 84: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
38 | 88: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
39 | 8c: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
40 | 90: 0c 94 6a 00 jmp 0xd4 ; 0xd4 <__bad_interrupt> |
Das Datenblatt sagt folgendes:
1 | ;Address Labels Code Comments |
2 | 0x0000 jmp RESET ; Reset Handler |
3 | 0x0002 jmp EXT_INT0 ; IRQ0 Handler |
4 | 0x0004 jmp EXT_INT1 ; IRQ1 Handler |
5 | 0x0006 jmp EXT_INT2 ; IRQ2 Handler |
6 | 0x0008 jmp EXT_INT3 ; IRQ3 Handler |
7 | 0x000A jmp EXT_INT4 ; IRQ4 Handler |
8 | 0x000C jmp EXT_INT5 ; IRQ5 Handler |
9 | 0x000E jmp EXT_INT6 ; IRQ6 Handler |
10 | 0x0010 jmp EXT_INT7 ; IRQ7 Handler |
11 | 29 0x0038 TIMER3 COMPA Timer/Counter3 Compare Match A |
12 | 30 0x003A TIMER3 COMPB Timer/Counter3 Compare Match B |
13 | 31 0x003C TIMER3 COMPC Timer/Counter3 Compare Match C |
14 | 32 0x003E TIMER3 OVF Timer/Counter3 Overflow |
15 | 33 0x0040 USART1, RX USART1, Rx Complete |
16 | 34 0x0042 USART1, UDRE USART1 Data Register Empty |
17 | 35 0x0044 USART1, TX USART1, Tx Complete |
18 | 36 0x0046 TWI Two-wire Serial Interface |
19 | 37 0x0048 SPM READY Store Program Memory Ready |
20 | Table 8-2. Reset and Interrupt Vectors Placement(1) |
21 | BOOTRST IVSEL Reset Address Interrupt Vectors Start Address |
22 | 1 0 0x0000 0x0002 |
23 | 1 1 0x0000 Boot Reset Address + 0x0002 |
24 | 0 0 Boot Reset Address 0x0002 |
25 | 0 1 Boot Reset Address Boot Reset Address + 0x0002 |
26 | Table 8-1. Reset and Interrupt Vectors (Continued) |
27 | Vector |
28 | No. |
29 | Program |
30 | Address(1) Source Interrupt Definition |
31 | 62 |
32 | 7679H–CAN–08/08 |
33 | AT90CAN32/64/128 |
34 | 0x0012 jmp TIM2_COMP ; Timer2 Compare Handler |
35 | 0x0014 jmp TIM2_OVF ; Timer2 Overflow Handler |
36 | 0x0016 jmp TIM1_CAPT ; Timer1 Capture Handler |
37 | 0x0018 jmp TIM1_COMPA; Timer1 CompareA Handler |
38 | 0x001A jmp TIM1_COMPB; Timer1 CompareB Handler |
39 | 0x001C jmp TIM1_OVF ; Timer1 CompareC Handler |
40 | 0x001E jmp TIM1_OVF ; Timer1 Overflow Handler |
41 | 0x0020 jmp TIM0_COMP ; Timer0 Compare Handler |
42 | 0x0022 jmp TIM0_OVF ; Timer0 Overflow Handler |
43 | 0x0024 jmp CAN_IT ; CAN Handler |
44 | 0x0026 jmp CTIM_OVF ; CAN Timer Overflow Handler |
45 | 0x0028 jmp SPI_STC ; SPI Transfer Complete Handler |
46 | 0x002A jmp USART0_RXC; USART0 RX Complete Handler |
47 | 0x002C jmp USART0_DRE; USART0,UDR Empty Handler |
48 | 0x002E jmp USART0_TXC; USART0 TX Complete Handler |
49 | 0x0030 jmp ANA_COMP ; Analog Comparator Handler |
50 | 0x0032 jmp ADC ; ADC Conversion Complete Handler |
51 | 0x0034 jmp EE_RDY ; EEPROM Ready Handler |
52 | 0x0036 jmp TIM3_CAPT ; Timer3 Capture Handler |
53 | 0x0038 jmp TIM3_COMPA; Timer3 CompareA Handler |
54 | 0x003A jmp TIM3_COMPB; Timer3 CompareB Handler |
55 | 0x003C jmp TIM3_COMPC; Timer3 CompareC Handler |
56 | 0x003E jmp TIM3_OVF ; Timer3 Overflow Handler |
57 | 0x0040 jmp USART1_RXC; USART1 RX Complete Handler |
58 | 0x0042 jmp USART1_DRE; USART1,UDR Empty Handler |
59 | 0x0044 jmp USART1_TXC; USART1 TX Complete Handler |
60 | 0x0046 jmp TWI ; TWI Interrupt Handler |
61 | 0x0048 jmp SPM_RDY ; SPM Ready Handler |
Ich habe testweise eine ISR für den Timer2 Compare angelegt (wie man aus dem Disassembly erkennt liegt der auf 0x0024, trotzdem springt der Controller beim Auslösen des Interrupts irgendwo hin, das Debugging hängt bzw. befindet sich dauerhaft im run mode, wenn ich es stoppe, sehe ich im Disassembly Fenster ziemlich zufällig anmutende Adressen... Hat jemand hierfür eine Lösung? schöne Grüße Chris