Forum: Mikrocontroller und Digitale Elektronik Problem Interrupteinsprung ATMega16M1


von Thomas (kosmos)


Lesenswert?

Hallo,

ich habe gerade ein Problem mit dem Einsprung in eine Interruptroutine.

ich habe meinen Interruptvector wie folgt gestezt
1
.CSEG
2
.ORG  0x0000
3
jmp RESET         ; Reset Handler
4
reti;  jmp ANA_COMP_0  ; Analog Comparator 0 Handler
5
reti;  jmp ANA_COMP_1  ; Analog Comparator 1 Handler
6
reti;  jmp ANA_COMP_2  ; Analog Comparator 2 Handler
7
reti;  jmp ANA_COMP_3  ; Analog Comparator 3 Handler
8
.....
9
10
Reset:
11
ldi r16, high(RAMEND)
12
out SPH,r16
13
ldi r16, low(RAMEND)
14
out SPL,r16

Im Datenblatt habe ich folgende Adressen gefunden
1
Address Labels Code Comments
2
0x000 jmp RESET ; Reset Handler
3
0x002 jmp ANA_COMP_0 ; Analog Comparator 0 Handler
4
0x004 jmp ANA_COMP_1 ; Analog Comparator 1 Handler
5
0x006 jmp ANA_COMP_2 ; Analog Comparator 2 Handler
6
0x008 jmp ANA_COMP_3 ; Analog Comparator 3 Handler
7
......

im disassembler stimmen diese aber nicht überein
1
28:       jmp RESET         ; Reset Handler
2
+00000000:   940C0022    JMP       0x00000022     Jump
3
29:       reti;  jmp ANA_COMP_0  ; Analog Comparator 0 Handler
4
+00000002:   9518        RETI                     Interrupt return
5
30:       reti;  jmp ANA_COMP_1  ; Analog Comparator 1 Handler
6
+00000003:   9518        RETI                     Interrupt return
7
31:       reti;  jmp ANA_COMP_2  ; Analog Comparator 2 Handler
8
+00000004:   9518        RETI                     Interrupt return
9
32:       reti;  jmp ANA_COMP_3  ; Analog Comparator 3 Handler
10
+00000005:   9518        RETI                     Interrupt return

der Abstand 0000, 0002, 0004.... sieht nur noch so aus 0000, 0002, 0003, 
0004

Wenn ich ein Interrupt Flag setze lande ich nicht in der 
Interruptvectortabelle sondern mitten im Programm.

Womit könnte dieser Versatz zusammenhängen?

von Peter II (Gast)


Lesenswert?

was soll denn die 2 Anweisungen?
> reti;  jmp ANA_COMP_0  ; Analog Comparator 0 Handler

mache doch einfach
1
jmp RESET         ; Reset Handler
2
jmp ANA_COMP_0  ; Analog Comparator 0 Handler
3
jmp ANA_COMP_1  ; Analog Comparator 1 Handler
4
jmp ANA_COMP_2  ; Analog Comparator 2 Handler
5
jmp ANA_COMP_3  ; Analog Comparator 3 Handler

von Thomas (kosmos)


Lesenswert?

falls ein Interrupt ausgelöst wird den man eigentlich garnicht verwendet 
aber durch Fehlkonfiguration angesprungen wird, wird er durch reti 
sofort wieder beendet und es geht im Programm einfach weiter.

Ich handhabe das immer so das ich vor jeden Sprungbefehl der 
Interrupteinsprungtabelle ein reti setze und dieses nur bei diesen 
Punkten lösche die ich auch wirklich verwende.

von Peter II (Gast)


Lesenswert?

Thomas O. schrieb:
> falls ein Interrupt ausgelöst wird den man eigentlich garnicht verwendet
> aber durch Fehlkonfiguration angesprungen wird, wird er durch reti
> sofort wieder beendet und es geht im Programm einfach weiter.

zwischen den jmp  hast du aber kein platz für ein reti

von Peter II (Gast)


Lesenswert?

ach sorry, die jmp sind ja nur auskommentiert. Du hast die falschen Tags 
verwendet, damit habe ich das nicht gleich erkannt.

von Thomas (kosmos)


Lesenswert?

ich habe jetzt erstmal als Notlösung die Interrupttabelle so verschoben 
das die Einsprungbefehle auch richtig angesprungen werden. Ich kann mir 
aber nicht erklären warum sie sonst nicht getroffen werden.

1
.CSEG
2
.ORG  0x0000
3
jmp RESET        ; Reset Handler
4
5
.ORG  0x001C
6
reti;  jmp ANA_COMP_0  ; Analog Comparator 0 Handler
7
reti;  jmp ANA_COMP_1  ; Analog Comparator 1 Handler
8
reti;  jmp ANA_COMP_2  ; Analog Comparator 2 Handler
9
reti;  jmp ANA_COMP_3  ; Analog Comparator 3 Handler
10
.....

von Max M. (jens2001)


Lesenswert?

RTFM;-)

http://avr-asm-download.de/beginner_de.pdf
Seite 67/68


Aufbau bei
großen
 AVR
Große AVR haben einen Adressraum, der mit relativen Sprungbefehlen nicht 
mehr ganz zugänglich
ist. Bei diesen hat die Sprungliste Einträge mit jeweils zwei Worten 
Länge. Etwa so:
   jmp Main ; Reset, Sprung zur Initiierung
   jmp Int0Sr ; Externer Interrupt an INT0, Sprung zur Service-Routine
   reti ; Irgendein anderer Interrupt, nicht benutzt
   nop
Avr-Asm-Tutorial
S.
68
   jmp IntTc0OvflwSr ; Überlauf Timer 0, Behandlungsroutine
   reti ; Irgendwelche anderen Interrupts, nicht benutzt
   nop
   reti ; Und noch mehr Interrupts, auch nicht benutzt
   nop
Bei Ein-Wort-Einträgen (z.B. RETI) sind die NOP-Instruktionen eingefügt, 
um ein weiteres Wort zu
ergänzen, damit die Adressierung der nachfolgenden Sprungziel-Einträge 
wieder stimmt.

: Bearbeitet durch User
von Thomas (kosmos)


Lesenswert?

Danke werde nach jedem reti ein nop ergänzen.

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.