mikrocontroller.net

Forum: Compiler & IDEs EEPROM schreiben AVR Studio


Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig.

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe strickt nach Anleitung gearbeitet:
//...
    uint8_t myByte;
 
    myByte = eeprom_read_byte(&eeFooByte); // lesen
    // myByte hat nun den Wert 123
//...
    myByte = 99;
    eeprom_write_byte(&eeFooByte, myByte); // schreiben
    // der Wert 99 wird im EEPROM an die Adresse der
    // 'Variablen' eeFooByte geschrieben
//...
    myByte = eeprom_read_byte(&eeFooByteArray1[1]); 
    // myByte hat nun den Wert 3
//...
 

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 ?

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...
an. Da steht genau wies funktioniert.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Markus P. (sebastianwurst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/...)

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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Erklärung und guten Rutsch !!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.