www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warum stimmen die Interrupteinsprungadressen nicht?


Autor: Thomas O. (kosmos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe da ein komisches Problem und zwar springt ein Interrupt 
beim simulieren im AVR-Studio 3.5X nicht die Adresse an wie es im 
Datenblatt des ATM16 steht. Speziell geht es im den Timr Overflow 
Interrupt wenn mein Timmer auf FF steht und dann wechselt sollte laut 
Datenblatt die 10te Stelle angesprungen werden, das Programm springt 
aber an die 17te Stelle meiner Sprungtabelle. Weiß jemand woran das 
liegt. Mein Programm funktioniert im Simulator wie es soll.

.cseg
.org 0x00
jmp reset        ;RESET
jmp ExternerInterrupt0  ;Int0
reti
reti
reti ExternerInterrupt1 ;INT1
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
jmp Timer0Overflow
reti
reti
reti
reti

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionieren denn die anderen Interrupts???

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
reti ist nur ein Wort (zwei Bytes) breit, die Interrupt-Vektoren beim 
Mega16 aber 2 Worte (vier Bytes). Also entweder jedem Vektor ein 
zusätzliches "nop" verpassen oder mit .org arbeiten. Am allerbesten 
einfach die Vektortabelle aus dem jeweiligen Datenblatt übernehmen...

Aber wenigstens das "jmp" anstelle von "rjmp" stimmt schon mal...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ geht's auch so:
.include"m16def.inc"
.cseg
.org 0              ;Reset- und Interrupt-Vektoren AT-Mega 16
 jmp RESET          ;Reset Handler
 jmp nix ;EXT_INT0       ;IRQ0 Handler
 jmp nix ;EXT_INT1       ;IRQ1 Handler
 jmp nix ;TIM2_COMP      ;Timer2 Compare Handler
 jmp nix ;TIM2_OVF       ;Timer2 Overflow Handler
 jmp nix ;TIM1_CAPT      ;Timer1 Capture Handler
 jmp nix ;TIM1_COMPA     ;Timer1 CompareA Handler
 jmp nix ;TIM1_COMPB     ;Timer1 CompareB Handler
 jmp nix ;TIM1_OVF       ;Timer1 Overflow Handler
 jmp nix ;TIM0_OVF       ;Timer0 Overflow Handler
 jmp nix ;SPI_STC        ;SPI Transfer Complete Handler
 jmp nix ;USART_RXC      ;USA RT RX Complete Handler
 jmp nix ;USART_UDRE     ;UDR Empty Handler
 jmp nix ;USART_TXC      ;USART TX Complete Handler
 jmp nix ;ADCC           ;ADC Conversion Complete Handler
 jmp nix ;EE_RDY         ;EEPROM Ready Handler
 jmp nix ;ANA_COMP       ;Analog Comparator Handler
 jmp nix ;TWSI           ;Two-wire Serial Interface Handler
 jmp nix ;EXT_INT2       ;IRQ2 Handler
 jmp nix ;TIM0_COMP      ;Timer0 Compare Handler
 jmp nix ;SPM_RDY        ;Store Program Memory Ready Handler
nix:                ;Interrupt nicht genutzt
 ;Falle zum Aufspüren von Programmierfehlern, je nach Möglichkeit mit
 ;einer Ausgabe (LED?) erweiterbar
 rjmp nix                ;Endlosschleife
reset:              ;Programmstart

Sowas schreibe ich ein einziges mal für jeden AVR-Typ, und zwar dann, 
wenn ich ihn zum ersten mal benutze. Der Text ist dabei aus dem 
Datenblatt kopiert und entsprechend angepasst. In einer Textdatei werden 
Kopien aller bisher verwendeten Int-Vektortabellen gesammelt, was die 
Wiederverwendung bereits erstellter Tabellen erleichtert.

Wird ein Interrupt verwendet, so wird einfach das "nix ;" aus der 
entsprechenden Zeile entfernt und die ISR mit dem entsprechenden Label 
geschrieben.

Die "Fehlerfalle" namens "nix" kann an die Gegebenheiten angepasst 
werden, z.B. Impulserzeugung an einem Portpin (LED an, Warteschleife, 
LED aus, Warteschleife, nochmal), wobei das ein "Programmteil" ist, der 
im Normalfall (Fehlerfreiheit) nie aufgerufen werden wird.

...

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, danke daran lags, jetzt springt er die richtige stelle an.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

sagt mal bitte, warum man lieber ein "jmp" anstelle von "rjmp" verwenden 
sollte. Im Datenblatt zum Tiny26 z.B. steht die vektortabelle mit 
"rjmp".
Gruß

Fred

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rjmp ist ein relativer Sprung und kann maximal 8 kB Flash addressieren. 
Deshalb gibt es den jmp-Befehl auch nur bei den AVRs mit mehr als 8 kB 
Flash, was auf den Tiny nicht zutrifft. Bei den "kleinen" AVRs kann man 
eben den kompletten Programmspeicher mit dem platzsparenden rjmp 
ansprechen.

jmp hat im Unterschied zu rjmp 32 Bit und deshalb sind auch bei den AVRs 
mit mehr als 8 kB Flash die Interrupt-Vektoren 32 Bit lang (16 Bit bei 
denen mit bis zu 8 kB).

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes,

danke für die schnelle Antwort. Ich hatte mir zwar schon das 
"instruction summary" durchgelesen, aber irgendwie fehlte mir der 
Durchblick. Jetzt isses klar. Danke nochmal
Gruß

Fred

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich hatte mir zwar schon das
> "instruction summary" durchgelesen,

Auch die kontextsensitive Online-Hilfe des AVR-Studios (F1-Taste) kann 
sehr hilfreich sein.

...

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.