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


von Skater (Gast)


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

von Merle (Gast)


Lesenswert?

probiers mit (r)jmp

gruß
Merle

von Skater (Gast)


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...

von mmerten (Gast)


Lesenswert?

schau dir mal die befehle ijmp und icall mit zieladresse via Z-Register.

von crazy horse (Gast)


Lesenswert?

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

von Fino (Gast)


Lesenswert?

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

von Stefan Peter (Gast)


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

von Skater (Gast)


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...

von Daniel Roth (Gast)


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)

von Thomas Burkhardt (Gast)


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

von Skater (Gast)


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?)

von crazy horse (Gast)


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.

von Fino (Gast)


Lesenswert?


von Skater (Gast)


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...

von crazy horse (Gast)


Lesenswert?

der assemblerbefehl bei den kleinen lautet natürlich rcall (relativ
call).

von Thomas Burkhardt (Gast)


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/DOC0856.PDF


Viele Grüße

von Skater (Gast)


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!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.