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
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.
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.
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
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.
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()".
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 :-)
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 :-)
>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.
@ 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
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.
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!
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.