Hallo ich habe ein Problem mit den Befehlen push und pop. Mein Programm funktioniert, wenn ich keine push und pop Befehle in dem Unterprogramm "check_temperature_alert" nutze. Nutze ich push und pop dann geht es nicht mehr. Denn Stackpointer habe ich initialisiert: ldi temp1, low(RAMEND) out SPL, temp1 ldi temp1, high(RAMEND) out SPH, temp1 Warum funktioniert es nicht. kurzen Programmcode angehängt Ebby
Ebby, 1) Wenn Du zu temperature_alert springst, dann ÜBERSPRINGST DU DOCH ein POP! Der Wert bleibt dann auf dem Stack und der läuft dann irgendwann über. Jedenfalls wenn Du die Kommentare bei PUSH/POP entfernst. 2) Du springst aus einer SUB in eine andere, das ist auch keine guter Stil. Das Problem liegt aber ganz klar bei 1) PUSH und POP müssen immer gegeneinander aufrechenbar sein! Jochen Müller
Danke Jochen für die schnelle Antwort. Habe das mit dem übersprungenen pop übersehen. Was das Springen von einer Subroutine in die andere angeht, würde ich dies bei einem so kleinen Programmteil normalerweise auch nicht machen. Nur wird die Auswertelogik evt. komplexer werden, so dass das Programm einfach zu unübersichtlich wird. Daher verwende ich zwei Subroutinen. Vielen Dank nochmal Ebby
ich denke mal es liegt an deinem Programm du veränderst ein Register und holst danach wieder Daten aus dem Stack dein Programm wird aber bestimmt den veränderten Wert brauchen. Im Simulator kannst du dir doch den Inhalt der Register anschauen, schau dir mal an wie sich der Wert ohne Push und Pop verändert und was er mit Push und Pop macht. Ich speichere auch gerne Registerinhalte im SRAM dann kann ich speichern und zurückladen wenn ichs will beim pushen muss man immer wieder poppen wenn mans vergisst läuft der Stack irgendwann über, nur beim Interrupt ist es nötig da dieser ja zwischenreinfunken kann. Außerdem nutze ich das gerne da man ja nicht unbegrenzt Register zur Verfügung hat, im SRAm hat man aber Platz genug. .DSEG ;Reserve jeweils 1 Byte im SRAM WertXYZ: .byte 1 im Programm dann sts WertXYZ, temp ... ... ... ... lds temp, WertXYZ
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.