www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sprung zum falschen Interrupt?


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hab mir so eben ein kleines Programm zusammengestrickt und 
jetzt folgendes Problem. Und zwar springt mir beim Überlauf des Timers 
T0 das Programm immer an die Adresse des Interrupts "Two-Wire Serial 
Interface" anstatt an die Stelle des Timer0 Overflow Interrupts, woran 
könnte das liegen?

.include "m16def.inc"
.cseg
.org 0x00
  jmp main ; Reset Handler
  reti ; IRQ0 Handler
  reti ; IRQ1 Handler
  reti ; Timer2 Compare Handler
  reti ; Timer2 Overflow Handler
  reti ; Timer1 Capture Handler
  reti ; Timer1 CompareA Handler
  reti ; Timer1 CompareB Handler
  reti ; Timer1 Overflow Handler
  rjmp T0overflow ; Timer0 Overflow Handler
  reti ; SPI Transfer Complete Handler
  reti ; USART RX Complete Handler
  reti ; UDR Empty Handler
  reti ; USART TX Complete Handler
  reti ; ADC Conversion Complete Handler
  reti ; EEPROM Ready Handler
  reti ; Analog Comparator Handler
  reti ; Two-wire Serial Interface Handler
  reti ; IRQ2 Handler
  reti ; Timer0 Compare Handler
  reti ; Store Program Memory Ready Handler


main:

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, dass der Mega16 mehr Speicher hat als
der Mega8. Folgerichtig braucht man 2 Bytes um eine
Adresse im Speicher zu adressieren. Folgerichtig
hat jeder Eintrag im Interrupt-Vektor 2 Bytes
anstatt nur 1 wie beim Mega8.

Du musst also nach den reti noch jeweils ein Byte einfügen.
Einfacher und sicherer ist es allerdings die Interrupt
Vektoren mittls .org Instruktionen auf die richtige Adresse
zu platzieren.

So wie es zb hier gemacht wurde:
http://www.mikrocontroller.net/articles/AVR-Tutori...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah danke ;)

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

> Das liegt daran, dass der Mega16 mehr Speicher hat als
> der Mega8. Folgerichtig braucht man 2 Bytes um eine
> Adresse im Speicher zu adressieren. Folgerichtig
> hat jeder Eintrag im Interrupt-Vektor 2 Bytes
> anstatt nur 1 wie beim Mega8.

Es ist viel SCHLIMMER!
Du meinst sicherlich 2 Worte = sage und schreibe 4 Bytes!
;-)

> Du musst also nach den reti noch jeweils ein Byte einfügen.

Neee, Wort.

MFG
Falk

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du meinst sicherlich

Kann sein, dass ich das meine :-)
Ich überlass sowas dem Compiler bzw. Assembler :-)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Einfachste ist, statt "reti" ein "jmp RESET" in die unbenutzten 
Vektoren zu schreiben, dann kann man fehlgeleitete Interrupts gleich am 
Neustart erkennen und ggf. abfangen. Außerdem füllt dieses Kommando 
exakt die 2 Worte.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man Interrupts nimmt, dann sollte man bitteschön auch die 
vordefinierten Vektoren nehmen.
Wozu schreiben sie die denn extra ins Include.


Die Vektoren sind nunmal bei den verschiedenen AVRs nicht in der 
gleichen Reihenfolge.

Also immer schön mit .org die Adresse setzen und dann zum Handler 
springen.

Alles andere ist Mumpitz und geht beim nächsten Derivat garantiert 
wieder schief.


Peter

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also mal einfach gesagt:

nicht RJMP sondern JMP verwenden....

am besten so: (MEGA16)

.org 0x000 jmp main             ; Reset Handler
                                ; steht immer ganz am Anfang des 
Speichers
           jmp falsch           ; IRQ0 Handler
           jmp falsch           ; IRQ1 Handler
           jmp falsch           ; Timer2 Compare Match
           jmp falsch           ; Timer2 Overflow
           jmp falsch           ; Timer1 Capture Handler
           jmp falsch           ; Timer1 CompareA Handler
           jmp falsch           ; Timer1 CompareB Handler
           jmp falsch           ; Timer1 Overflow Handler
           jmp falsch           ; Timer0 Overflow Handler
           jmp falsch           ; SPI Transfer Complete Handler
           jmp falsch           ; USART RX Complete Handler
           jmp falsch           ; UDR Empty Handler
           jmp falsch           ; USART TX Complete Handler
           jmp falsch           ; ADC Conversion Complete Interrupt 
Handler
           jmp falsch           ; EEPROM Ready Handler
           jmp falsch           ; Analog Comparator Handler
           jmp falsch           ; Two-wire Serial Interface Handler
           jmp falsch           ; IRQ2 Handler
           jmp falsch           ; Timer0 Compare Match
           jmp falsch           ; Store Program Memory Ready Handler

falsch:    reti

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man sich nicht sicher ist: Einfach im Datenblatt nachsehen. ATMEL 
hat immer recht viele Code-Beispiele drin, und dazu zählen auch die 
Vektortabellen in Assembler. Braucht man eigentlich nur abzutippen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Michele

Ja, genau so sollte man es eben nicht machen.


Was stört Dich daran, für jeden Vektor das passende .org zu nehmen ?

Man muß dann bloß den nachfolgenden Code hinter dem letzten Vektor 
beginnen lassen.

Und wenn dann mal ein Vektor nicht existiert oder anders heißt, kriegt 
man sofort ne ordentliche Fehlermeldung und muß nicht erst tagelang 
debuggen.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.