Forum: Compiler & IDEs EEPROM schreiben AVR Studio


von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Markus P. (sebastianwurst)


Lesenswert?

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 ?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Richtig.

von Markus P. (sebastianwurst)


Lesenswert?

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 ?

von Markus P. (sebastianwurst)


Lesenswert?

> 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.

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

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 ?

von Huch (Gast)


Lesenswert?

>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.

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

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.

von Huch (Gast)


Lesenswert?

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.

von Huch (Gast)


Lesenswert?

>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. :-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

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)

von Markus P. (sebastianwurst)


Lesenswert?

@ 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 ;-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Huch (Gast)


Lesenswert?

>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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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 :-)

von Markus P. (sebastianwurst)


Lesenswert?

Vielen Dank für die Erklärung und guten Rutsch !!!!

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.