Hi, ich habe mal eine Frage. Mein Programm, welches ich geschrieben habe, übertrage ich immer über den Programm Button ins Flash Speicher. Jetzt gibt es aber beim AVRprog die Schhaltfläche EEPROM, wann muss ich denn da hin übertragen ? (Siehe Anhang) Dachte das ich die Dateien die ins EEPROM geschrieben werden nur über die Funktion : -eeprom_read_byte(&xxx) -eeprom_write_byte(&xxx) etc. schreibe. Vielen Dank.
Die genannten Funktionen sind für den Zugriff auf das EEPROM *zur Laufzeit*. Wenn man zur Compilezeit Daten fürs EEPROM hat, werden die von der Toolchain in einer extra Datei (Endung oft *.eep) zusammengefasst. Und diese EEPROM Daten überträgt man im AVR Studio, ähnlich wie man Daten fürs Flash überträgt.
Also wenn ich jetzt daten sowieso per -eeprom_read_byte(&xxx) -eeprom_write_byte(&xxx) etc. schreibe dann brauche ich das nicht über den Button machen ? Verstehe ich doch jetzt richtig, oder ?
Aber wenn ich das jetzt mache dann startet mein Atmega8 nicht mehr. Ich muss erst einmal das Programm über den besagten EEPROM Button einspielen danach läuft mein Controller wieder hoch. Ich habe die Vermutung da ich keine Initalisierung in der "int main(void){" habe. Wenn ich das nämlich mache. Wie z.B. eeprom_write_byte(&xxx,10); dann funzt es auch so ohne EEPROM Button. Aber wenn ich das mache mit eeprom_write_byte(&xxx,10) dann hat der immer nach jedem übertragen eine 10 dadrin. wenn ich aber ur : eeprom_read_byte(&xxx) schreibe funzt es bekomme jedoch eine Warnung das diese Funktion ohne Sinn ist! Was mache ich noch verkehrt ?
> immer nach jedem übertragen eine 10 dadrin. wenn ich aber ur : > eeprom_read_byte(&xxx) > schreibe funzt es bekomme jedoch eine Warnung das diese Funktion ohne Funzt doch nicht mit read_byte.
Ich habe strickt nach Anleitung gearbeitet:
1 | //...
|
2 | uint8_t myByte; |
3 | |
4 | myByte = eeprom_read_byte(&eeFooByte); // lesen |
5 | // myByte hat nun den Wert 123
|
6 | //...
|
7 | myByte = 99; |
8 | eeprom_write_byte(&eeFooByte, myByte); // schreiben |
9 | // der Wert 99 wird im EEPROM an die Adresse der
|
10 | // 'Variablen' eeFooByte geschrieben
|
11 | //...
|
12 | myByte = eeprom_read_byte(&eeFooByteArray1[1]); |
13 | // myByte hat nun den Wert 3
|
14 | //...
|
Wenn ich jedoch nur ins Flash das Programm übertrage läuft der Atmega nicht hoch. Gehe ich auf den EEPROM Button kommt zwar erst dieser Meldung (Anhang) er überträgt aber und danach läuft auch alles. Ist das richtig so ?
>Aber wenn ich das jetzt mache dann startet mein Atmega8 nicht mehr. Wenn Du "was" machst? >Ich muss erst einmal das Programm über den besagten EEPROM Button einspielen >danach läuft mein Controller wieder hoch. Das Programm wird nicht über einen EEPROM-Button eingespielt. Du meinst wahrscheinlich den "Program"-Button in der EEPROM-Abteilung des von Dir gezeigten Menues. Aber damit wird wie gesagt kein "Programm" überspielt sondern der EEPROM-Inhalt. Das Wort "Program" auf den Buttons heisst auf Deutsch "programmiere" - ein Kommando, ein Befehl an das AVRStudio, das es programmieren soll. Den gibt es zweimal. Einmal für das Programm - also die Befehle die der uC abarbeiten soll und einmal für die EEPROM-Inhalte. Was genau Du verkehrt machst hängt davon ab, was Du tun willst, genauer was Dein Programm tun soll. Es scheint das Dein Programm davon abhängig ist, das ein bestimmter Wert im EEPROM steht. An sich ist das eeprom_read_... unabhängig davon, ob Du zuvor, das EEPROM programmiert hast. Falls Du das nicht tust steht darin entweder 0xFF oder der Wert der schon vorher drin stand. (Das hängt evtl. von einer zusätzlichen Eeinstellung ab, die besagt, das das EEPROM gelöscht werden soll, wenn der gesamte uC gelöscht wird oder nicht. Ich weiss allerdings nicht, ob es diese Einstellung auch mit dem AVRProg gibt). Am besten Du beschreibst das mal. Bitte erlaube mir, Dich zu bitten, etwas sorgfältiger zu formulieren. Dein Text ist gelinde gesagt schwer zu verstehen. Und poste bitte Deinen Code.
Hi, ja sorry habe mich versucht schnell zu fassen, da ich nicht wollte das Du evtl. abhaust ;-) Ich habe es jetzt hin bekommen. Wie im Bild zu sehen (Anhang) gibt es bei den Einstellungen für den M8 bei den FuseBits das Häkchen EESAVE dieser war nicht angehakt. Nachdem ich dieses mal auf Gut Glück versucht habe funktioniert alles sauber.
Ich habe den Verdacht das Du immer das Programmfile in das EEPROM programmierst. Das also die in der obersten Zeile genannte Datei mit den den unten gezeigten Buttons programmiert wird und zwar gleichermaßen in das EEPROM und in den Programmflash-Speicher. Das wäre natürlich verkehrt. Das müssen zwei verschiedene Dateien sein. Schau Dir auch bitte die Programmbeschreibung unter: http://www.atmel.com/dyn/resources/prod_documents/doc1021.pdf an. Da steht genau wies funktioniert.
>da ich nicht wollte das Du evtl. abhaust ;-) Sehr schmeichelhaft, aber da brauchst Du keine Bedenken haben. Wahrscheinlich schauen die meisten, die einmal anfangen in einem Thread zu antworten immer wieder herein bis das Problem gelöst ist. Ausserdem gibt es dann immer noch andere Mitstreiter die auch gewillt sind zu helfen. >Ich habe es jetzt hin bekommen. Wie im Bild zu sehen (Anhang) gibt es >bei den Einstellungen für den M8 bei den FuseBits das Häkchen EESAVE >dieser war nicht angehakt. Nachdem ich dieses mal auf Gut Glück versucht >habe funktioniert alles sauber. Sehr schön. Na, dann kann die Sylvesterrakete ja starten. :-)
Code #1 > uint8_t myByte; > myByte = eeprom_read_byte(&eeFooByte); // lesen > // myByte hat nun den Wert 123 Wieso 123? Ein leeres (fabrikfrisches) EEPROM enthält 0xFF. myByte wäre hier 255 (0xFF). Du musst beim Tutorial auch den vorhergehenden Abschnitt betrachten: Code #2 > uint8_t eeFooByte EEMEM = 123; Hier wird die Variable eeFooByte zur Compilezeit im EEPROM angelegt und mit dem Wert 123 initialisiert. D.h. nach dem Kompilieren ist eine EEP-datei vorhanden und die musst ins EEPROM übertragen werden, damit Code #1 wie erwartet funktioniert. Referenz: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
Also bis dato habe ich immer nur den Button verwendet. (s. Anhang) Das mit dem EEPROM Program Button war auch mal wieder nur auf Gut Glück. Den betätige ich jetzt nicht mehr. Wie gesagt im Moment beschreibe ich auch nur eine Datei mit der eeprom_write_byte(&eeFooByte, myByte); und lese sie aus. Das wird vom Programm aus gemacht und soll dafür gut sein diesen Wert Spannungsausfallsicher abzuspeichern. (Bei Tastendruck wird der Wert geschrieben)
@ Stefan nochmal. Das ist einleuchtend das man beim ERSTEN mal nachdem man eine EEPROM Variable durch uint8_t eeFooByte EEMEM = 123; angelegt hat dieses über den EEPROM Program Button einspielen/neue .eep Datei anlegen muss. Aber danach muss man das ja nicht mehr machen. Muss ich jetzt ja auch nicht mehr. Konnte es nicht sein das durch das Häkchen EESAVE nichts gespeichert wurde und somit nur flüchtig im EEPROM abgelegt wurde? Und ich deswegen immer wieder diese .eep Datei evtl. neu anelgen musste? Habe es jetzt nicht wieder getestet. Bin froh das es läuft ;-)
Lies dir mal die Bedeutung der Fuse EESAVE im Datenblatt deines µC durch. EESAVE EEPROM memory is preserved through the Chip Erase 1 (unprogrammed, EEPROM not preserved) (aus http://electrons.psychogenic.com/modules/arms/art/14/AVRFusesHOWTOGuide.php) ISP-Software kann vor dem Programmieren des Flash einen sog. Chip Erase machen. Bei vielen ISP-Programmen ist das sogar so voreingestellt. Dadurch wird das EEPROM gelöscht (auf 0xFF gesetzt), wenn die EESAVE Fuse nicht programmiert ist. Wenn du die EESAVE Fuse programmierst (Häkchen im AVR Studio), übersteht der EEPROM Inhalt das Chip Erase.
>Konnte es nicht sein das durch das Häkchen EESAVE nichts >gespeichert wurde und somit nur flüchtig im EEPROM abgelegt wurde? Und >ich deswegen immer wieder diese .eep Datei evtl. neu anelgen musste? Das Häkchen bei EESAVE kontrolliert ob das EEPROM beim löschen des uC mitgelöscht wird oder nicht. Die Flüchtigkeit des EEPROMs lässt sich überhaupt nicht beeinflussen, auch nicht mit dem Häkchen. EEPROMs sind nie flüchtig. ("Flüchtigkeit" von Speicherinhalten hat im Programmierermilieu eine etwas schärfere Definition). Das eep File wird unabhängig von dem Häkchen immer dann angelegt, wenn Du in Deinem Programm solche Zeilen wie
1 | uint8_t eeFooByte EEMEM = 123; |
hast. Die musst Du nicht selbst "anlegen". Du musst nur sicherstellen, das Du, wenn das eep File geändert wurde, das Du in der obersten Zeile auch die eep Datei auswählst und dann "Programm" im "EEPROM" Bereich des Menüs anklickst.
Die Fuse EESAVE kann eine Falle werden. Wenn du bei der Programmentwicklung weitere EEMEM gekennzeichnete Variablen definierst oder welche entfernst, verschieben sich die Positionen der restlichen EEMEM Variablen im EEPROM. Der Compiler erzeugt eine passende neue EEP-datei, aber du lässt den alten Inhalt im EEPROM... man muss also genau wissen, was man preserviert :-)
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.