Problem mit dem EEPROM

Gast #1621318
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
Gast #1621324
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
}
#1621358
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren