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
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...
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
@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...
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
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?)
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.
@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...
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
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!!