www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interupts auf mega16-Simulation


Autor: Flip B. (frickelfreak)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche gerade ein Programm zur auswertung van Drehencodern (asm, 
AVR Studio) und ansteuerung eines displays zu schreiben. Dafür werden 2 
Interrupts benutzt (e_int0+e_int1). Am anfang stehen die 
interruptvektoren und dann eine interruptrutine. Bei der simulation 
springt e_int1 immer in die interruprutine mitten rein (0x004) wenn ich 
die .org direktive nehme und 0x004 vor e_int1 schreibe, springt er 
dahin. Ist das nurmal und macht der echte AtMega das auch so? bug? 
Normal sollte der doch nach 0x002 springen, ich habe jetzt schon 2 
stunden etliche Fehler entfernt, auf dem controller läuft das programm 
trotzdem noch nicht. Bin langsam am Verzweifeln.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt nicht durch das Programm geschaut.
Wenn du schon jeden Interrupt Vektor mit .org auf seine Position nageln 
willst, dann mach das nicht mit Zahlenwerten! Denn das bringt keine 
Sicherheit.
Hier ist zb der entsprechende Abschnitt aus dem Tut für einen Mega8
.include "m8def.inc"
 
.org 0x000
       rjmp RESET
.org INT0addr                 ; External Interrupt0 Vector Address
       reti                   
.org INT1addr                 ; External Interrupt1 Vector Address
       reti                   
.org OC2addr                  ; Output Compare2 Interrupt Vector Address
       reti                   
.org OVF2addr                 ; Overflow2 Interrupt Vector Address
       reti                   
.org ICP1addr                 ; Input Capture1 Interrupt Vector Address
       reti                   
.org OC1Aaddr                 ; Output Compare1A Interrupt Vector Address
       reti                   
.org OC1Baddr                 ; Output Compare1B Interrupt Vector Address
       reti                   
.org OVF1addr                 ; Overflow1 Interrupt Vector Address
       reti                   
.org OVF0addr                 ; Overflow0 Interrupt Vector Address
       reti                   
.org SPIaddr                  ; SPI Interrupt Vector Address
       reti                   
.org URXCaddr                 ; USART Receive Complete Interrupt Vector Address
       reti                   
.org UDREaddr                 ; USART Data Register Empty Interrupt Vector Address
       reti                   
.org UTXCaddr                 ; USART Transmit Complete Interrupt Vector Address
       reti                   
.org ADCCaddr                 ; ADC Interrupt Vector Address
       reti                   
.org ERDYaddr                 ; EEPROM Interrupt Vector Address
       reti                   
.org ACIaddr                  ; Analog Comparator Interrupt Vector Address
       reti                   
.org TWIaddr                  ; Irq. vector address for Two-Wire Interface
       reti                   
.org SPMaddr                  ; SPM complete Interrupt Vector Address
       reti                   
.org SPMRaddr                 ; SPM complete Interrupt Vector Address
       reti                   
 
.org INT_VECTORS_SIZE
RESET:                        ; hier beginnt das Hauptprogramm  


Für die Lage des Vektoren gibt es Konstanten! Benutze sie.


Den Rest hab ich (noch) nicht durchgesehen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der Atmega hat 2 Word pro Eintrag in der Sprungtabelle (passend für
'jmp Label'). Die Adressen stehen im Datenblatt. Noch leichter ist es, 
wenn du '.org INT0addr' bzw '.org INT1addr' schreibst. Dann setzt der 
Assembler die richtigen Werte aus der m16def.inc ein.

Übrigens ist Drehencoder+Interrupt eine dumme Idee.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp Bigott schrieb:

> interruptvektoren und dann eine interruptrutine. Bei der simulation
> springt e_int1 immer in die interruprutine mitten rein (0x004) wenn ich
> die .org direktive nehme und 0x004 vor e_int1 schreibe, springt er
> dahin. Ist das nurmal

Ja das ist normal.
Bei solchen Fällen ist das Datenblatt dein bester Ratgeber.
Da gibt es eine wunderbare Tabelle mit den Einsprungadresse aller 
Vektoren.

Aber wie gesagt: wenn du die Konstanten in Textform benutzt, musst du 
die Adressen zahlenmässig ja gar nicht wissen und kannst daher da gar 
keinen Fehler machen.


> und macht der echte AtMega das auch so?

Ja

> bug?

Ja, bug bei dir. Du hast nicht ins Datenblatt gesehen, sondern etwas 
angenommen.

> Normal sollte der doch nach 0x002 springen,

nein, sollte er nicht.

interrupt 0      $002
interrupt 1      $004

die 4 stimmen, aber deine 1 für int 0 stimmen nicht :-)

Autor: Flip B. (frickelfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke so Klappt es jetzt auch auf dem Controller. (war noch ein kleiner 
fehler bei int0) Und der Code ist ohne die Zahlenwerte echt "clean". Ich 
habe im Tut jedoch gerade bemerkt, dass die dortige Liste keinen vermerk 
ala gilt nur für mega8 o.ä. hat. Der Blick ins datenblatt hätte mich 
auch sicher schlauer machen können.

Philipp

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.