www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik zu sprungmarke springen, und wieder zurück


Autor: Skater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin ihr helferchen!!

ich hab folgendes problem: ich will ein 48bit schieberegister (6x8bit)
ansteuern. dazu brauche ich einen trick, oder befehl, mit dem ich von
X nach Y springen kann, und nachdem Y ausgeführt wurde, wieder
nach X zurückkehrt. klingt einfach, aber es gibt ein hindernis:

während Y eine feste position hat, kann X überall sein. und ich
kann X nicht in X1 umbenennen, da ich ja sonst zu X1 auch ein
Y1 brauche, und das meinen programmrahmen sprengen würde. gibt es da
einen trick, mit einer variablen sprungmarke, die immer beim
"richtigen" X ist??

THX 4 HELP

Autor: Merle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probiers mit (r)jmp

gruß
Merle

Autor: Skater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
witzbold.. damit kann ich ja bloß zu einer sprungmarke springen, aber nt
zu meiner "absprungmarke" zurück...
RJMP bedeutet nämlich Relative Jump und nicht Rejump

und JMP gibts beim 2313 garnet...

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir mal die befehle ijmp und icall mit zieladresse via Z-Register.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
verstehe ich da was falsch? Das ist doch der klassische Fall eines
Unterprogramms (call/return)?? Oder sehe ich das zu einfach?

Autor: Fino (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, seh ich auch so, aber verrat doch nicht alles :-P

Autor: Stefan Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich glaube der Befehl den du suchst heisst "ret". Es ist der selbe
wie "reti", nur dass der dafür ist um aus Interrupt unterprogrammen
wieder zurück zu kommen und "ret" aus normalen Unterprogrammen. Für
diesen Befehl muss aber der Stackpointer richtig initialisiert werden!

Grüsse

Stefan P

Autor: Skater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@mmerten: jo, das hab ich auch schon im auge gehabt, aber wie setzte ich
das "z" register (r31:r30)??

@verrücktes pferd: ja, nur das das return variabel ist...

Autor: Daniel Roth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
X_Marke1:
  ..
  RJMP Y_Marke


X_Marke2:
  ..
  RJMP Y_Marke

X_Marke3:

.
.
.

Y_Marke:

  LDI ZL, low (X_Marke..)
  LDI ZH, high (X_Marke..)

  IJMP  ;Sprung zu vorher definierter X-Marke (ist variabel und
        ;kann sich während der Laufzeit ändern)

Autor: Thomas Burkhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Skater,

freilich ist das ret variabel, aber das ist doch genau das, was du
suchtest. Du willst von verschiedenen Stellen nach Y springen und nach
der Ausführung dort an eben diese Stellen zurück. Genau dafür ist das
ret da und speichert eben jene Stelle aufm Stack. Wenn wir das, was du
schreibst nicht vollkommen falsch verstehen, ist es genau so wie Crazy
Horse schreibt: call - ret

Viele Grüße

Autor: Skater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wenn ich das dann richtig verstehe, dan geht der code dann so:

X1: rjmp Y
      .
      .
      .

X5: rjmp Y

Y: [....]
    ret




oder muss ich den stack initialisieren.. (wie?)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den Stack sollte man IMMER initialiesieren, selbst wenn er gar nicht
gebraucht wird, irgendwann kommt eine kleine Änderung, und schon steht
man auf dem Schlauch, weil man daran oft nicht denkt.

Ansonsten:
X1: call Y

X2: call Y

X3: call Y

Y:  irgendwas
    ret          //führt auf den Befehl zurück, der auf call Y folgt,
                 also X1+1 oder X2+1 oder X3+3, je nachdem, woher der
call kommt.

Das versuche ich dir die ganze Zeit zu verklickern, das ist doch
wirklich was grundlegendes, ich hatte noch nie ein Programm, dass ohne
calls auskam.

Autor: Fino (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Skater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@horse: da shab ich grad ausprobiert.. stellt sich bloß ein problem
dar:
wen ich das ganze Debug, bzw. assemble, dann kommt im bericht die
fehlermeldung:
WARNING: 'CALL' not supportet on this device...
naja... ich versuch jetzt des mal mit dem stack

@fino:
lach net, aber diese seite hab ich schon seit gestern gesuch..
alzheimer lässt grüßen...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der assemblerbefehl bei den kleinen lautet natürlich rcall (relativ
call).

Autor: Thomas Burkhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Skater,

jawohl der 2313 hat kein CALL. Da der Speicher mit 2k aber klein genug
ist, kann der gesammte Bereich mit RCALL adressiert werden.

Was du suchst ist also: RCALL

Dazu lohnt sich ein Blick in die vollständige Instruktionstabelle der
AVR und natürlich das Datenblatt des Einzeltyps (da steht dann
beispielsweise drinnen, dass es kein CALL gibt)

http://www.atmel.com/dyn/resources/prod_documents/...


Viele Grüße

Autor: Skater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so leute..VIELEN VIELEN DANK!!!

ich hab jetzt das ganze mit dem stack gemacht... gehtecht super... mein
programm besteht jetzt nur noch aus "recall ..." es wird ja also ne
uhr... für die schieberegister hat ich die bits in konstanten
gespeichert (0-9) ... echt klasse!!

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.