Problem mit dem EEPROM

Gast #1621318
Hallo!

Ich versuche Momentan in einem Programm ein paar Messungen durchzuführen 
und die Werte dann zu speichern um sie nach einem Reset wieder laden zu 
lassen. Das Ganze klappt auch, nur weiß ich nicht wirklich ob das alles 
so simmt, und das Tutorial hierzu ist auch sehr kurz. Hier mal der 
(Pseudo)Code:
1
#include <avr/eeprom.h>
2

3
#define EEMEM  __attribute__ ((section (".eeprom")))
4

5
uint8_t InitWert_A = 10;
6
uint8_t Speicher_A EEMEM = 0;
7
volatile uint8_t Aktuell_A;
8

9
void ausschalten (void) {
10
   eeprom_write_byte(&Speicher_A, Aktuell_A);
11
}
12

13
void einschalten(void) {
14
   if (Speicher_A != 0) InitWert_A = eeprom_read_byte(&Saved_Value_A);
15
}
16

17
int main (void) {
18

19
Aktuell_A = ADC;                  // Wert vom ADC übergeben
20

21
}

Kann man das so machen?

Wie kann ich den InitWert jetzt "von außen" setzen nach dem er durch das 
EEPROM "deaktiviert" wurde in der Einschaltfunktion? Sollte ich da ein 
Flag für die Verwendung des EEPROM Wertes setzen? Ich habe das gefühl, 
dass jedes mal beim neu programmieren das EEPROM "gelöscht" wird; habe 
das aber bei "Auto" im AVR Studio nicht aktiviert. Was passiert da?

Wär super wenn einer mal helfen könnte.

Ich danke euch schonmal.

Markus
Gast #1621324
Ich habe gerade einen Fehler gesehen und den Code aktualisiert. Sorry 
für die Unübersichtlichkeit...
1
#include <avr/eeprom.h>
2

3
#define EEMEM  __attribute__ ((section (".eeprom")))
4

5
uint8_t InitWert_A = 10;
6
uint8_t Speicher_A EEMEM = 0;
7
volatile uint8_t Aktuell_A;
8

9
void ausschalten (void) {
10
   eeprom_write_byte(&Speicher_A, Aktuell_A);
11
}
12

13
void einschalten(void) {
14
   if (eeprom_read_byte(&Speicher_A) != 0) InitWert_A = eeprom_read_byte(&Speicher_A);
15
}
16

17
int main (void) {
18

19
Aktuell_A = ADC;                  // Wert vom ADC übergeben
20

21
}
#1621358
Das EEPROM wird beim programmieren des Chips immer gelöscht da 
normalerweise vom Programmer ein "Chip Erase" Kommando geschickt wird 
bevor die eigentliche Programmierung beginnt. Das Chip Erase macht auch 
das EEPROM platt.

Du kannst das verhindern indem Du die "EESAVE" Fuse setzt, dann wirkt 
Chip Erase nur auf den Flash und lässt das EEPROM in Ruhe.
(Dann musst halt "nur" noch aufpassen dass AVRStudio nicht versucht das 
EEPROM zu beschreiben, aber das hast Du ja nach eigenen Angaben 
abgeschaltet...)


Grüße,

Christian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.