Forum: Mikrocontroller und Digitale Elektronik AVR: Rücksprung aus Unterprogramm geht nicht


von Thomas R. (automatenmann)


Angehängte Dateien:

Lesenswert?

Hallo,
hab hier wohl einen Anfängerfehler:

Nachdem ein für den ATMega8 geschriebenes Assembler-Programm nicht so
funktionierte wie es sollte, habe ich Teile entfernt und simuliert. Was
vom Programm übrig ist findet Ihr im Anhang.

Das Problem:
Nach Aufruf des Unterprogramms INIT, welches nur aus dem
Rücksprungbefehl RET besteht, erwarte ich eigentlich, dass das Programm
mit dem zweiten Befehl im Label START fortgeführt wird. Tatsächlich
springt es aber zum ersten Befehl im Label RESET!!!!

Ich versteh nicht warum, wer kann helfen?

Thomas

von johnny.m (Gast)


Lesenswert?

Wenn Du den Stack nicht initialisierst, dann kann es nicht
funktionieren. Du musst am Programmanfang den Stack Pointer
initialisieren, und wie das geht steht im Datenblatt des Controllers.

von johnny.m (Gast)


Lesenswert?

Naja, und abgesehen davon macht dieses Programm überhaupt keinen Sinn.
Was willst Du damit erreichen? Oder testest Du nur den Simulator?

von A.K. (Gast)


Lesenswert?

Das klappt auch mit Stack nicht, da wenn "START" durch ist ein RET
ohne passenden CALL ausgeführt wird.

von johnny.m (Gast)


Lesenswert?

Das ist richtig. Es fehlt eine Schleife am Ende.

von Thomas R. (automatenmann)


Lesenswert?

@ johnny.m

klar macht das Programm keinen Sinn, da ich zum Testen Programmteile
entfernt habe. Hab ich aber eigentlich geschrieben!

Thomas

von johnny.m (Gast)


Lesenswert?

Ja dann schick doch gleich den kompletten Code! Dann kann man sich
nämlich die ganzen Vermutungen und ne Menge Zeit sparen. Warum denkt da
eigentlich keiner dran?

von Rolf Magnus (Gast)


Lesenswert?

> klar macht das Programm keinen Sinn, da ich zum Testen
> Programmteile entfernt habe. Hab ich aber eigentlich geschrieben!

Mit anderen Worten: Du postest Code, der so gar nicht funktionieren
kann und von dem du weißt, daß er Blödsinn ist, und wir sollen jetzt
auf dieser Basis versuchen, zu raten, warum der Code, den du nicht
gepostet hast, nicht funktioniert.

von D. W. (dave) Benutzerseite


Lesenswert?

Ich glaube ja.

von Thomas R. (automatenmann)


Lesenswert?

@ jonny.m
Danke, das mit der Initialisierung des Stackpointer wer die Lösung


@ Rolf Magnus
@ David W.
Der Code macht zwar keinen Sinn, trotzdem muss das Programm durchlaufen
werden! Wegen der fehlenden Stackpointer-Initialisierung tat es das aber
nicht! Wozu soll ich 100 Zeilen posten, wenn 10 Zeilen reichen?

von Qwerty (Gast)


Lesenswert?

Genau! Ich verstehe auch die Aufregung nicht. Üblicherweise wird in
Foren immer "Reduktion auf das Wesentliche" verlangt, und das hast du
getan, indem du den kleinstmöglichen Code-Schnipsel gepostet hast, der
noch laufen sollte, aber den gesuchten Fehler zeigt. Dass der Code dann
u.U. keinen Sinn mehr macht (im Sinne von "nicht mehr die Funktion
erfüllt", nicht im Sinne von "nicht läuft") ist erstmal zweitrangig.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>"Reduktion auf das Wesentliche"
Dabei kann es aber auch gut passieren, dass der Fehler mit reduziert
(oder auch eleminiert) wird, oder ganz andere zutage treten.
Wenn der Code sooo geheim ist, dann sollte man nicht hier nach Hilfe
fragen (müssen).

von johnny.m (Gast)


Lesenswert?

Hier mal ein aktuelles Beispiel, wozu eine "Reduktion auf das
Wesentliche" führen kann:

http://www.mikrocontroller.net/forum/read-1-394936.html

von Karl heinz B. (kbucheg)


Lesenswert?

Bitte mässigt euch.
Der OP hat ganz klar in seiner Einleitung geschrieben, dass
er den Code abgespeckt hat, und das der abgespeckte Code
immer noch sein Problem zeigt. Er hat auch ganz klar
dazu geschrieben was nicht funktioniert, wie das Ergebnis
seiner Meinung nach aussehen muesste und was statt dessen
passiert.

Ehrlich gesagt: Derartig präzise formulierte Anfragen würde
ich mir öfter wünschen.

von Qwerty (Gast)


Lesenswert?

Falsch verstanden, meine Aussage war: Solange das reduzierte Programm
noch prinzipiell läuft und den Fehler zeigt, ist eine Reduktion
durchaus sinnvoll. Im verlinkten Thread sehe ich kein lauffähiges
Programm mehr, sondern nur einen Codeschnipsel. Es ist unbestritten,
dass dies für eine Fehlersuche oft zu wenig ist.

von Qwerty (Gast)


Lesenswert?

@Karl Heinz: Volle Zustimmung (mein Posting bezog sich auf die beiden
davor)!

von Christoph W. (christoph)


Lesenswert?

Zum Verständnis : CALL verhält sich wie JMP, speichert jedoch bevor es
springt die Aktuelle Addresse in einen Stapelspeicher, den Stack.
Dieser ist ein einfaches LIFO (Last-In-First-Out) und wächst nach
unten. Das heiß man initialisiert den Stack-Pointer auf das RAM-Ende,
da ein Call die Addresse dort hinschreibt und den Pointer verkleinert,
sodass der nächste Wert DAVOR geschrieben wird.
RET verhält sich auch wie ein Sprung, nur dass er als Ziel den Wert aus
dem Stack zieht. Dabei wird der Stackpointer erhöht und wenn du keinen
Fehler machst läuft alles einwandfrei. Hast du aber solche umherirrende
"CALL" oder "RET" Befehle, können die den Stack soweit
durcheinanderbringen, dass dein Programm irreläuft und anfängt
irgendwohinzuspringen. Dassselbe übrigens auch, wenn der Stackponter
aus dem RAM läuft.
Auch musst du mit PUSH-POP aufpassen. Diese beiden Befehle
Schreiben/Holen) jeweils den obersten Wert im Stack. Äußerst nützlich,
aber auch gefährlich - denn hier passieren die meisten Fehler, die den
Stack zerstören. (nicht bachtete Schleifen, etc.)
SOmit kannst du auch theoretisch unbegrenzt viele Subprogramme
verschachteln - praktisch ist der RAM deine Grenze (Stackgröße).

von Christoph W. (christoph)


Lesenswert?

Holla !!! Um zwei auf Submit geklickt und bis jetz hats gedauert ! Kennt
ihr das auch ? WLAN will nich, obwohl man "verbunden" is. Auf jeden
Fall sollte der Beitrag zwischen denen von 13:58 und 13:59 rein.

von Peter D. (peda)


Lesenswert?

Mitn 8051 wär das nicht passiert.

Die Intel-Leute hatten nämlich mitgedacht: "Mensch da setzen wir doch
den SP einfach auf ne gültige Adresse nachm Reset".

Aber der AVR wurde ja viel später entwickelt und da wäre es doch total
uncool, alte Erfahrungen zu nutzen.


Peter

von Karl heinz B. (kbucheg)


Lesenswert?

:-)
Zumal der SP bei 1 Million AVRs wahrscheinlich mindestens
999999 mal gleich initialisiert wird.

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.