Forum: Mikrocontroller und Digitale Elektronik Umgang mit EEPROM


von Roman (Gast)


Lesenswert?

Hallo zusammen

Ich habe eine Frage zum Umgang mit dem EEPROM in meinem Atmega8, welche 
mir die im Netz verfügbaren Tutorials nicht beantworten konnten.

Ich möchte mit hilfe des Makros "EEMEM" gewisse Parameterwerte in meinen 
EEPROM speichern. Ich möchte aber für eine Parameteränderung nicht immer 
den uC neu programmieren, sondern den neuen Parameterwert per UART 
übergeben.

Jetzt ist meine Frage: Wenn ich z.B. eine Variable definiere

uint8_t Frequenz EEMEM = 10;

dann wird doch diese Variable bei jedem Neustart des Controllers wieder 
auf den Wert 10 gesetzt. Ich will aber, dass diese Variable den Wert 
annimmt, welchen ich mit dem UART zuletzt gesendet habe.

Kann mir jemand sagen wie ich das realisieren kann?

lG
Roman

von Georg G. (df2au)


Lesenswert?

Im EEPROM ein Flag einbauen "Werte wurden geändert". Beim Start das Flag 
abfragen und nur, wenn es nicht gesetzt ist, explizit die Standardwerte 
ins EEPROM schreiben.

von Peter (Gast)


Lesenswert?

Roman schrieb:
> Kann mir jemand sagen wie ich das realisieren kann?

Nach dem PowerUp den Wert aus dem EEProm holen und der Variable zuweisen

uint8_t Frequenz EEMEM = 10;
...
EEMEM = getEEPROMdata(25);

wobei getEEPROMdata durch deine EEPROM-Lese-Funktion zu ersetzen ist und 
die 25 die Speicherstelle im EEPROM repräsentiert an der der Wert liegt.

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Peter schrieb:
> uint8_t Frequenz EEMEM = 10;
> ...
> EEMEM = getEEPROMdata(25);

mit Verlaub, ich glaube das ist Quatsch
-> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

von Karl H. (kbuchegg)


Lesenswert?

Roman schrieb:

> Jetzt ist meine Frage: Wenn ich z.B. eine Variable definiere
>
> uint8_t Frequenz EEMEM = 10;
>
> dann wird doch diese Variable bei jedem Neustart des Controllers wieder
> auf den Wert 10 gesetzt.

Nö.
Wie kommst du da drauf?
Das EEMEM verändert alles.

von ich (Gast)


Lesenswert?

Christopher B. schrieb:
> Peter schrieb:
>> uint8_t Frequenz EEMEM = 10;
>> ...
>> EEMEM = getEEPROMdata(25);
>
> mit Verlaub, ich glaube das ist Quatsch
> -> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Mit Verlaub, ich denke, im Tut steht genau das drin. Nur daß dort die 
Funktionen ausführlich erklärt und benannt sind.
Peter schrieb noch dazu:
> wobei getEEPROMdata durch deine EEPROM-Lese-Funktion zu ersetzen ist

Also er hat nur das Prinzip erklärt und hat nicht gesagt, daß die 
gewünschte Funktion auch immer "getEEPROMdata()" heißt.
Wenn du die Funktion selbst programmierst, kannst du sie nennen, wie du 
willst, also auch "getEEPROMdata()".

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Also wenn er die avr/eeprom.h eingebunden hat, dann wird
1
 EEMEM = get...
wegen
1
 #define  EEMEM   __attribute__((section(".eeprom")))
übersetzt zu
1
 __attribure__((section(".eeprom"))) = get...
und es würde mich wundern, wenn das keinen fehler wirft

richtig müsste es heißen
1
uint8_t Frequenz EEMEM = 10;
2
3
// Bei Programmstart
4
uint8_t meineFrequenz = eeprom_read_byte(&Frequenz);
5
6
...
7
// Bei Uart empfang
8
eeprom_update_byte(&Frequenz, meineFrequenz);

zumindest denke ich das so :-)

von ich (Gast)


Lesenswert?

Christopher B. schrieb:
>> EEMEM = getEEPROMdata(25);

Du hast Recht, das EEMEM in dieser Zeile ist Quatsch, da muß natürlich 
eine RAM-Variable rein.
Ich dachte, du meinst den Namen der Read-Funktion...
Okay, Irrtum geklärt :-)

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Oh, sorry. Nein das meinte ich nicht.
Naja hat sich ja geklärt

von Joachim .. (joachim_01)


Lesenswert?

>Wenn ich z.B. eine Variable definiere
>
>uint8_t Frequenz EEMEM = 10;
>
>dann wird doch diese Variable bei jedem Neustart des Controllers wieder
>auf den Wert 10 gesetzt. Ich will aber, dass diese Variable den Wert
>annimmt, welchen ich mit dem UART zuletzt gesendet habe.

Wenn ich das recht sehe liegt dein Problem auf der Anwenderebene.

Kannst du nicht einfach die Variable bei Programmstart aus dem EEPROM 
holen und bei bedarf per UART ändern und wieder ins Flash schreiben? Ich 
versteh das Problem nicht richtig.

Ich hatte hier so ein ähnlichen Fall mit nem Display das beim 
Einschalten immer auf volle Helligkeit ging. Als erstes hole ich die 
Helligkeit aus dem EEPROM und wenn sie mir nicht gefällt ändere ich sie 
per UART/Touch-Tastatur und schreibe sie wieder zurück.

von Roman (Gast)


Lesenswert?

@ Karl Heinz

Das verstehe ich jetzt nicht ganz. Warum sollte der Controller bei einem 
Neustart die Variable "Parameter" im EEPROM nicht jedes mal auf den Wert 
10 setzen? Prüft er etwa ob diese Variable im EEPROM schon existiert und 
wenn ja, dann ignoriert er die Zeile mit der Zuweisung?

Wenn ja, dann hätte sich mein Problem gelöst und ich brauche kein Flag 
oder sonstiges.

lG
Roman

von Karl H. (kbuchegg)


Lesenswert?

Roman schrieb:
> @ Karl Heinz
>
> Das verstehe ich jetzt nicht ganz. Warum sollte der Controller bei einem
> Neustart die Variable "Parameter" im EEPROM nicht jedes mal auf den Wert
> 10 setzen?

Weil es eine EEPROM Variable ist.

Die wird vom C-System überhaupt nicht angegriffen und wie eine normale 
Variable behandelt.
Die existiert nur deswegen im Programm, damit in der EEPROM Belegung 
entsprechender Platz reserviert wird und du nicht mit Adressen in Form 
von Zahlenwerten im Programm hantieren musst. Mehr nicht.

Wenn du auf die Variable zugreifen willst, dann musst du das über die 
Spezialfunktionen machen. Aber ansonsten, für alles andere, hält sich 
der Compiler von dieser Variablen raus.

> Wenn ja, dann hätte sich mein Problem gelöst und ich brauche kein Flag
> oder sonstiges.

Du brauchst auch so kein Flag.
Das EEPROM verändert sich nur, wenn du explizit darauf schreibst, oder 
wenn du deinem Brennprogramm sagst, es möge die Initialisierung (die der 
Compiler aus dem C-Code extrahiert und in eine eigene Datei geschrieben 
hat) explizit ins EEPROM brennen.
Abgesehen davon verändert das EEPROM seine Werte nicht.
Insbesondere wird die im Programm angegebene Initalisierung NICHT beim 
Programmstart erneut ins EEPROM geschrieben. Diese Initialisierungen 
werden vom Compiler aussortiert, in eine eigene Datei geschrieben und du 
hast die Möglichkeit, mit deinem Brennprogramm diese Initialisierungen 
ins EEPROM schreiben zu lassen. Aber das ist deine Entscheidung ob du 
das machen willst. Tust du das nicht, dann verändert sich das EEPROM 
auch nicht.

von Roman (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> die Initialisierung (die der
> Compiler aus dem C-Code extrahiert und in eine eigene Datei geschrieben
> hat) explizit ins EEPROM brennen.

Das war der entscheidende Punkt, der mir noch nicht klar war.

Danke Karl Heinz!

von Karl H. (kbuchegg)


Lesenswert?

:-)

Alles andere würde das EEPROM ja auch reichlich sinnlos machen.

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.