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
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.
Naja, und abgesehen davon macht dieses Programm überhaupt keinen Sinn. Was willst Du damit erreichen? Oder testest Du nur den Simulator?
Das klappt auch mit Stack nicht, da wenn "START" durch ist ein RET ohne passenden CALL ausgeführt wird.
@ johnny.m klar macht das Programm keinen Sinn, da ich zum Testen Programmteile entfernt habe. Hab ich aber eigentlich geschrieben! Thomas
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?
> 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.
@ 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?
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.
>"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).
Hier mal ein aktuelles Beispiel, wozu eine "Reduktion auf das Wesentliche" führen kann: http://www.mikrocontroller.net/forum/read-1-394936.html
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.
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.
@Karl Heinz: Volle Zustimmung (mein Posting bezog sich auf die beiden davor)!
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).
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.
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
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.