mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "JMP Tabelle"


Autor: Tobias Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

im Register r16 steht bei mir ein Command der nun Ausgeführt werden soll 
(r16 wurde von der ser. Schnittstelle eingelesen).
Nun möchte ich jenach inhalt von r16 zu den Befehlen springen. Ich 
dachte mir das in etwa so.


main:
  [..]
  jmp 0x0100+(r16*2)  (Hier haperts!)

.org 0x0100 ; Befehlstabelle
  rjmp Befehl1
  rjmp Befehl2
  [..]
  rjmp Befehl31

Befehl1:
  dosometing
  rjmp main

Befehl2:
  dosomethingelse
  rjmp main

[..]

Befehl 31:
  nochetwastun
  rjmp main


Nur wie springe ich in der Zeile jmp 0x0100+(r16*2) am besten? Oder ist 
der Ansatz ganz falsch?

Grüße
  Tobias

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht nur mit ijmp (indirekt jump (z). Also Zieladresse muß in Z stehen.

Autor: Tobias Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ansatz dann aber 2xr16 zu 0x0100 dazuzuzählen stimmt, aber? Oder 
einfach nur noch daführ sorgen das das Ergebnis in r30,r31 steht und 
dann ijmp?

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ansatz ist im Prinzip richtig, nur es muss R16 im Gegensatz zum 
Tabellenzugriff nicht mit 2 multipliziert werden. Dies gilt nur, wenn 
die Tabelle aus RJMP Befehlen besteht. Hier also mal der Code als 
Denkanstoss.

ldi   R30,low(JMP_TABLE)
ldi   R31,high(JMP_TABLE)
add   R30,R16
brcc  PC + 2
inc   R31
ijmp

JMP_TABLE:
      rjmp  BEFEHL1
      rjmp  BEFEHL2
      rjmp  BEFEHL3
      ....

Autor: Tobias Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

super! Es funktioniert perfekt. Eine Frage noch. Was steht in "PC"? Die 
aktuelle Adresse im Programmspeicher?

Grüße
  Tobias

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PC ist der "Program Counter", die aktuelle Adresse im Programmspeicher. 
(Der Assembler führt bei der Schreibweise "rjmp PC+2" allerdings keine 
wirkliche Addition mit PC durch, da rjmp sowieso schon eine relative 
Adressangabe erwartet.)

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.