Problem Interrupteinsprung ATMega16M1

OP #4407499
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?
Gast #4407514
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
OP #4407521
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.
OP #4407633
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
.....
#4407706
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren