mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprungfehler bei atmega16


Autor: luxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
ich habe ein problem mit meinem atmega16 bzw auch schon mit dem
simulator in avrstudio.
bei solchem asm code wie unten spring er immer falsch.


.org 0x000                    ; kommt ganz an den Anfang des Speichers
         rjmp RESET           ; Interruptvektoren überspringen
                              ; und zum Hauptprogramm
         rjmp EXT_INT0        ; IRQ0 Handler
         rjmp EXT_INT1        ; IRQ1 Handler
         rjmp TIM2_COMP
         rjmp TIM2_OVF
         rjmp TIM1_CAPT       ; Timer1 Capture Handler
         rjmp TIM1_COMPA      ; Timer1 CompareA Handler
         rjmp TIM1_COMPB      ; Timer1 CompareB Handler
         rjmp TIM1_OVF        ; Timer1 Overflow Handler
         rjmp TIM0_OVF        ; Timer0 Overflow Handler
         rjmp SPI_STC         ; SPI Transfer Complete Handler
         rjmp USART_RXC       ; USART RX Complete Handler
         rjmp USART_DRE       ; UDR Empty Handler
         rjmp USART_TXC       ; USART TX Complete Handler
         rjmp ADC             ; ADC Conversion Complete Interrupt
         rjmp EE_RDY          ; EEPROM Ready Handler
         rjmp ANA_COMP        ; Analog Comparator Handler
         rjmp TWSI            ; Two-wire Serial Interface Handler
         rjmp SPM_RDY         ; Store Program Memory Ready Handler

bei diesem code springt er bei TIM0_OVF Interrupt statt nach 0x009
immer zu 0x018. auch im avrstudio simulator springt er immer dahin.

wo liegt da der fehler?

luxx

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jmp benutzen.

Autor: luxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber warum?

luxx

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wegen: "Besser is das!"
Guck doch mal ins "Instruction Set Summary" - da wirst du einen
Unterschied zwischen "rjmp" und "jmp" finden.

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch WERNER sagte schon: Jo, besser is´das!
Ich habe auch die Erfahrung gemacht, daß rjmp sonstwo hinspringt.

MfG Paul

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rjmp an sich springt nicht "irgendwohin", sondern exakt dorthin, was
man angibt.
Das Problem liegt in diesem Fall  daran, dass rjmp nur 1 word breit
ist, jmp  2 word. Und um den vollen Programmspeicher direkt anspringen
zu können, hat Atmel klugerweise die Interrupteinsprung-Adressen im
Doppelword-Abstand angeordnet.
Selbstverständlich kannst du auch rjmp benutzen:
.org 0x000
rjmp RESET
.org 0x002
rjmp EXT_INT0        ; IRQ0 Handler

.org 0x000
rjmp RESET
nop
rjmp EXT_INT0        ; IRQ0 Handler
nop
rjmp EXT_INT1        ; IRQ1 Handler
nop

Sinn macht es nicht, du gewinnst nichts, verlierst aber die
Möglichkeit, den gesamten Programmspeicher anzuspringen.

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jmp in der Vektortabelle kommt bei allen größeren Prozis ab 16k
Flash-Speicher zum Einsatz, bei allen kleineren wird rjmp benutzt; auch
etwas, was im Datenblatt steht...

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur zur Vollständigkeit: rjmp ist 1 Takt schneller.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nur zur Vollständigkeit: rjmp ist 1 Takt schneller

weil es auch 1 Byte kürzer ist...

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist 1 Wort kürzer.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch dafür sorgen, dass deine Interrupt-routine innerhalb des
von rjmp adressierbaren bereichs liegt. Also gleich nach den
Interruptvektoren oder ganz am Ende des Speichers. Aber ob dir der eine
Takt den Ärger wirklich wert ist musst du selbst wissen. Mir wär er's
nicht.

Sebastian

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Befehlslänge spielt in diesem Fall ja keine Rolle, die
Ausführungszeit evtl. schon.
Es läßt sich durchaus eine kleine Routine innerhalb des Interruptblocks
unterbringen, vorausgesetzt, man hat nur wenige Interrupts und findet
eine entsprechende Lücke.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Die Befehlslänge spielt in diesem Fall ja keine Rolle"

Hu??? In der Interrupt-Vektor-Tabelle zählt einzig die Position. Wen
die Laufzeit von JMP stört (ähem, wegen 1 Takt?), der mag halt hinter
jedem RJMP noch ein NOP plazieren, aber es müssen 2 Worte pro Sprung
sein.

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ärger, Sebastian? - Nur eine Frage der Organisation.

Aber ich wollte, als Reaktion auf TravelRec., nur verdeutlichen, dass
der Interruptblock mit rjmp oder jmp theoretisch gar nichts zu tun hat:
der Prozessor springt hinein, ob bzw. wie mein Programm dann
herausspringt ist eine andere Sache.

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.