Einfach so den Stack initialisieren:
ramend ist die letzte SRAM Adresse, brauchst dich aber nicht drum kümmern, steht alles in den include dateien mit drinneCode:reset: ldi r16, low(ramend) out spl, r16 ldi r16, high(ramend) out sph, r16
Hallo,
super Seite. Gefällt mir sehr gut. Leider hab ich noch niemand gefunden der dasselbe Problem hatte wie ich.
Ich sollte einen ATMEGA128 mit externem Speicher programmieren. Ich benütze die Programmiersprache C und den AVR Studio 4 zum bespielen.
Das ansteuern einzelner LED`S funktioniert tadellos, jedoch kann ich kein LCD - Display ansteuern da mein Programm nicht mehr aus dem Unterprogramm herauskommt. Das soll heißen, dass er ein Unterprogramm (egal welches) immer und immer wieder ausführt und somit mit dem eigentlichen Program nicht weitermacht.
Ich habe im Datenblatt des Atmega128 gelesen, dass man den Stack-pointer für die return Adresse von Unterprogrammen aktivieren muss. Kann es daran liegen? Wenn ja, wie kann ich den Stack aktivieren?
Mit freundlichen Grüßen,
Martin
Einfach so den Stack initialisieren:
ramend ist die letzte SRAM Adresse, brauchst dich aber nicht drum kümmern, steht alles in den include dateien mit drinneCode:reset: ldi r16, low(ramend) out spl, r16 ldi r16, high(ramend) out sph, r16
@eric101,
das ist zwar richtig, was Du schreibst, er meint aber, daß er in C programmiert und nicht im Assembler...
Ich weiß es nicht ganz genau, aber muß man in C den Stack einrichten?
Ich habe es noch nie gemacht...
@ offender
Was hälst Du davon Dein Programm hier zu posten?
Dann kann Dir sicher jemand helfen, den Fehler zu finden.
Gruß Sebastian
Ich wollt`s eigentlich mit dem Programm vom Fleury probieren, welches ja eigentlich für die meisten LCD Displays und Port-Ausgänge kompatibel ist. Ich frage mich, ob sich evtl. wegen meinem zusätzlichen externen Speicher evtl. der Stack geändert hat, oder ob es sich evtl. um einen Hardware-fehler handelt, obwohl ich einzelne LED`s problemslos ansteuern kann.
Danke schon mal für die Antworten,
Martin
achso sorry, hab ich leider überlesen
Mit C kenn ich mich leider nicht aus
Kann man bei C keinen Assembler einbinden, dass geht doch eigentlich immer. Kenn mich aber mit C nicht aus, kann dir darum nicht weiterhelfen.
Hallo,
Also ich weiß nicht genau, ob da irgendwo ein Zusammenhang besteht,
aber Stack wird immer von hinten nach vorne aufgebaut...
Wie dir Eric102 beispielhaft geschrieben hat, hat der Stackpointer was mit RAMEND zu tun...
Ramend ist einfach die letzte SRAM Speicherzelle, die auf dem Chip vorhanden ist.
Es ist dann wohl auch klar, daß Ramend von Mega zu Mega anders ist, je nachdem wieviel Speicher der Chip besitzt.
ich habe einen Blick in die iom128.h geworfen und ziemlich unten fast an ende der Datei
steht folgendes:
Das heißt die letzte Speicherzelle des Mega128 befindet sich bei 0x10FF,Code:#define RAMEND 0x10FF /* Last On-Chip SRAM Location */
und daraus mach der Compiler wohl irgendwie den Stackpointer.
Wenn Du aber noch externes SRAM hast müsste das alles verschoben werden, sonst kann ja passieren, daß Du dir den Stackinhalt überschreibst.
Gruß Sebastian
das merkwürdige ist nur das offender sagt, dass das Unterprogramm immer wieder von vorne anfängt. In dem Moment wo ein Unterprogramm aufgerufen wird, speichert der Controller die Adresse(16bit) vom Hauptprogramm im Stack und springt beim return an die abgelegte Adresse. Und jetzt kommt das merkwürdige, denn im Stack steht nicht die Adresse von der letzten Stelle im Hauptprogramm sondern in diesem Fall die Adresse von der ersten Zeile des Unterprogramms und das versteh ich nicht
Hallo,
Deswegen tip ich eher auf ein Fehler im Programm
Es passiert mir auch immerwieder, daß ich eine Endlosschleife reinbaue.
Gruß Sebastian
Lesezeichen