mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik push pop Problem


Autor: Ebby (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ebby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.