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...
schau dir mal die befehle ijmp und icall mit zieladresse via Z-Register.
verstehe ich da was falsch? Das ist doch der klassische Fall eines Unterprogramms (call/return)?? Oder sehe ich das zu einfach?
Nö, seh ich auch so, aber verrat doch nicht alles :-P
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...
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)
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.
Vielleicht wäre http://www.mikrocontroller.net/tutorial/stack.htm ganz empfehlenswert, oder http://www.avr-asm-tutorial.net/ ...
@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...
der assemblerbefehl bei den kleinen lautet natürlich rcall (relativ call).
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!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.