Forum: Mikrocontroller und Digitale Elektronik Problem mit dem EEPROM


von Markus Fischer (Gast)


Lesenswert?

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

von Markus Fischer (Gast)


Lesenswert?

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
}

von Christian T. (shuzz)


Lesenswert?

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

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.