Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 Interrupt


von Christian Schmidt (Gast)


Lesenswert?

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

von Christian Schmidt (Gast)


Lesenswert?

...ich hol den fred mal wieder hoch, da das Problem immernoch besteht...

von Ich (Gast)


Lesenswert?

Erzähl mal lieber, wie Du zu dem Problem kommst.
Den 90CAN32 setze ich hier seit Jahren ohne Probleme ein.
Und ja, CAN im IRQ plus mindestens einem Timer-IRQ.

Von AVR-Studio 4.x bis Atmel-Studio 6.1.

von Christian Schmidt (Gast)


Lesenswert?

Hallo,

also, wie ich zu meinem Problem komme :)
Ich initialisiere den Controller, setze meine Empfangs-ID und meine 
Maske, im Datenregister sehe ich beim debuggen auch die empfangene 
Nachricht. im CANGIE habe ich ENIT, ENRX, ENTX und im CANIE2 IEMOB0 
gesetzt meine ISR (ISR(CANIT_vect)) wird jedoch leider nie aufgerufen. 
Habe ich irgendwas im Datenblatt übersehen? Habe mich an der Abbildung 
zur CAN-Controller Interrupt Struktur orientiert...


schöne Grüße

Chris

von Christian Schmidt (Gast)


Lesenswert?

...Ergänzung:

Es tritt wohl ein Interrupt auf, der Controller springt aber 
unkontrolliert irfgendwo in den Flash, hinzu kommt die seltsame 
Anordnung der Interrupt Veltoren. Nach Senden eines Pakets läuft der 
Controller durch den Flash, bis er wieder anm Programmanfang ankommt...

von Mr.T (Gast)


Lesenswert?

Christian Schmidt schrieb:

> bis er wieder anm Programmanfang ankommt...
Hmmm.... irgendetwas muss demnach den PC ja wieder auf den Resetvektor 
setzen, ergo tippe ich vage darauf, dass ein Reset (Watchdog?) 
stattfindet.

von Christian Schmidt (Gast)


Lesenswert?

Hallo,

ein Watchdog ist nicht eingeschaltet... Interessanterweise läuft es nun, 
zumindest solange ich das Programm normal kompiliere und nicht per 
Linker-Option in den Bootloader-Bereich schiebe (hatte versehentlich das 
Programm ohne Linker-Option auf den Bootloader-Bereich compiliert, die 
Interruptvektoren waren aber noch verschoben...kann ja dann nicht 
gehen). Dies ist jedoch in meiner Applikation (Bootloader, was ein 
Zufall:)) notwendig. Ich habe im Linker unter Miscellaneous 
-Ttext=0xF000 angegeben, also die Word-Adresse. Entgegen anderer Angaben 
(die sich aber u.U. auf ältere Studio-Versionen beziehen), ergibt sich 
nur so die korrekte Speicherkonfiguration. Gebe ich hingegen unter 
Memory-settings die Word-Adresse an, so landet alles im Flash ab Adresse 
0x01e000 (sieht man dann in der .lss-File, das Studio verdoppelt also 
die Adresse (um zur Byte-Adresse zu kommen), der Compiler (AVRGCC 
3.4.1.95) scheint aber eine Word-Adresse zu erwarten, zumindest startet 
der Controller nur mit der Angabe -Ttext=0xF000.
Nichtsdestotrotz läuft irgendwas mit den Interrupts in der Bootloader 
Section schief. Das Verschieben der Vektoren funktionert, nur die ISR 
wird nicht aufgerufen...

schöne Grüße

Chris

von Ich (Gast)


Lesenswert?

Ahh, Bootloader, völlig neue Info, sonst nur so Schnipsel und Hinweise.

Nen Bootloader habe ich noch nicht gebaut, zum einen drängt es mich 
nicht so weil ich nicht genug "im Feld" umprogrammieren muss.
Zum anderen gehört zu einem Bootloader auch die Software für den PC.

von Christian Schmidt (Gast)


Lesenswert?

Hallo,

ja, die Info hatte ich unterschlagen. Eine UART-Routine (von Peter 
Fleury) funktioniert einwandfrei, nutzt auch Interrupts. Nur die 
CAN-Interrupts laufen im Bootloader-Bereich halt nicht, wenn ich den 
Debugger unterbreche (dieser läuft nach Senden der Nachricht und Drücken 
von F5 an einem Breakpoint, ohne dass er an dem Breakpoint in meiner ISR 
anhält), lande ich irgendwo bei 0x557A, also außerhalb des 
Bootloader-Bereichs. Die Interrupt-Tabelle verweist für den 
CAN-Interrupt allerdings mit einem JMP-Befehl auf 0x7877A, wo auch 
tatsächlich die ISR steht. Sehr seltsam, vielleicht hat ja noch jemand 
ne Idee.

Gruß,

Chris

von Christian Schmidt (Gast)


Lesenswert?

Es läuft!
Das Linker-Argument hab ich auf -Ttext=0x1EFF geändert, von da an lief 
es, interessanterweise hat es zuvor trotzdem den bootloader gestartet, 
als ich die Word-Adresse übergeben hatte.

Danke an alle!

Chris

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.