Hallo! Ich habe eine Frage undzwar, ich würde gerne über den PC also beim Programmieren in den EEPROM meines AtMega32 eine Zahl reinschreiben, sie ich im Programm selbst am AVR dann nurmehr auslese, und nur unter bestimmten umständen möchte ich die Zahl überschreiben und auch danach die überschriebene Zahl beibehalten auch wenn der AVR Stromlos ist ... Nun kenne ich die Befehle um im Programm eine variable im EEPROM zu deklarieren, den EEPROM zu lesen und zu schreiben Aber ich möchte ja nicht jedesmal den EEPROM beim Programmstart beschreiben, sondern ich möchte das ich den EEPROM einmal mit der Zahl beschreibe und danach nurmehr lese bzw. überschreibe. Ich verstehe nicht ganz wie genau das funktioniert Kann mir jemand helfen? Danke stefan08
Meine Kristallkugel sagt, Du programmierst in C, aber die Batterien sollte ich auch mal wieder wechseln: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
Oh ja sorry klar programmiere ich in C ... Hab mir das Tut schon sooo oft angesehen, komm aber ned drauf wie ich das machen soll... wie gesagt variablen deklarieren aus eeprom lesen/schreiben ist klar ... Aber wie ich das Problem wie schon geschrieben angeh weiß ich nicht
Bitte gehe das Tutorial in Bezug auf das EEPROM lesen/schreiben mal Punkt für Punkt durch und frage dann, was genau Du nicht verstehst.
Hab ich, wie gesagt, ich versteh wie ich lese, wie ich schreibe... Aber!!! Wie kann ich einen Wert einmal ins EEPROM schreiben ( diese einmalige schreiben darf ja nicht in dem Programm ansich erfolgen ) und danach nurmehr rauslesen, aber nur unter best. umständen überschreiben... weißt du nun wie ich das meine?
Nein genau das ist mir nicht klar wie ich einmalig den EEPROM per PC beschreibe
>Nein genau das ist mir nicht klar wie ich einmalig den EEPROM per PC >beschreibe OK. Die genaue Vorgehensweise hängt davon ab, welche Entwicklungsumgebung Du benutzt. Falls Du AVRStudio verwendest, gibt es im Dialog zum Programmieren auch den Punkt EERPOM schreiben. Dort musst Du ein HEX-File angeben und nach Druck auf "programmieren" schreibt er dieses HEX-File. Wenn es einen (oder mehrere) unmögliche Werte gibt, dann geht es auch über das Programm auf dem uC. Du testest einfach ob der unmögliche Wert drinsteht und programmierst dann einen der möglichen Werte.
Das macht dein Brennprogramm. Im C Code markierst du die Variebale als EEMEM und gibst ihr einen Wert. Der Compiler, bzw die Toolchain erstellt daraus ein weiteres Hex-File, welches dein Brennprogramm in den µC schiesst.
Ja also so wie hier: deklaration: uint8_t eeFooByte EEMEM = 59; lesen: myByte = eeprom_read_byte(&eeFooByte); nur wird ja jedesmal AVR neu starten die Zahl 59 erneut ins EEPROM geschrieben oder ?
>nur wird ja jedesmal AVR neu starten die Zahl 59 erneut ins EEPROM >geschrieben oder ? Nur, wenn Du wieder den Originalwert haben willst. Oder was meinst Du mit "jedesmal". Ansonsten kannst Du per Fuse einstellen, das beim löschen des Flashs das EEPROM nicht mit gelöscht wird. Welcher Prozessor?
AtMega32 wie oben schon erwähnt. Ich meine wenn ich den AVR Sromlos schalte, und ihn wieder neu einschalte. Führt er doch die variablendeklaration in den EEPROM neu aus und schreibt mir den Wert "59" wieder in das EEPROM oder?
Wenn Deine SW auf dem uC den Wert verändert hat und Du wieder den Originalwert haben willst, dann schon: Dann musst Du das Hex-File erneut reinbrennen.
stefan08 schrieb: > AtMega32 wie oben schon erwähnt. > > Ich meine wenn ich den AVR Sromlos schalte, und ihn wieder neu > einschalte. Führt er doch die variablendeklaration in den EEPROM neu aus > und schreibt mir den Wert "59" wieder in das EEPROM oder? Nein Die Werte, die du hier als Initialisierungen angibst werden gesammelt, landen in einem extra Hex-File und mussen von dir mit dem Brennprogramm übertragen werden.
Sorry. Habe ich überlesen mit dem uC. >nur wird ja jedesmal AVR neu starten die Zahl 59 erneut ins EEPROM >geschrieben oder ? Nein. Die Deklaration ist nur für den Compiler. Er erzeugt daraus die Belegung für das EEPROM und den Inhalt der HEX-Datei für das EEPROM. Wenn Du den Prozessor neu startest, wird nichts im EEPROM veränder nur weil es im Quelltext mit einem bestimmten Startwert initialisiert wurde. Nur, wenn Dein Programm das so will wird der Wert nochmal verändert.
Achso... ok, das ändert das natürlich, aber ich habe gestern Abend das genauso versucht habe also die Variable deklariert und mit = 59 gleich den Wert reingeschrieben, gleich daraus habe ich sie ausgelesen und es stand der wert "255" drin. Erst wenn ich den zusätzlichen Befehl für schreiben benutzt habe, stand 59 drin. Das ist doch nicht normal oder?
@ Karl Heinz : Uääääh. @ stefan08 Anders, ausgedrückt, der Startwert für das EEPROM wird nur dann wieder auf den Initialisierungswert gesetzt, falls und wenn Du das HEX-File für das EEPROM erneut reinbrennst.
>Das ist doch nicht normal oder?
Nein. Und man müsste mal klären wie Du festgestellt hast, das der Wert
255 drinstand. Hast Du das im Simulator getestet oder per Ausgabe oder
wie?
Man müsste mal den kompletten Quelltext sehen, bei dem das Problem
auftrat. Wahrscheinlich hast Du den aber nicht mehr, oder?
Vielleicht hattest Du auch nur vergessen das EEPROM-HEX-File zu brennen?
Dabei musst Du auch auf die Reihenfolge achten: 1. Das FLASH programmieren 2. Das EEPROM programmieren Falls nämlich die oben genannte Fuse nicht gesetzt ist, wird bei jedem Flashen das EEPROM mit gelöscht.
Naja, das macht PonyProg eh von selbst, das er zuerst den Flash und dann den EEPROM beschreibt. Also müsste das eigentlich passen. Ausgabe ist über ein angeschlossenes LCD, deshalb hab ich gewusst das der Wert 255 in dem EEPROM stand.
Sorry, war mal tanken. >Ausgabe ist über ein angeschlossenes LCD, deshalb hab ich gewusst das >der Wert 255 in dem EEPROM stand. Na ja. Das kann also, wiegesagt, ganz verschiedene Ursachen gehabt haben. Wenn es aber jetzt funktioniert, dann willst Du das vielleicht auf sich beruhen lassen. Falls nicht, werden wir ohne den Sourcecode, der genau diesen Fehler zeigt, nicht weiter kommen.
Ja es funktioniert nun alles, war wohl ein Fehler beim Programmieren! Danke!
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.