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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.