Forum: Mikrocontroller und Digitale Elektronik push pop Problem


von Ebby (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jochen M. (taschenbuch)


Lesenswert?

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

von Ebby (Gast)


Lesenswert?

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

von Thomas (kosmos)


Lesenswert?

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
Noch kein Account? Hier anmelden.