www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit dem EEPROM


Autor: Markus Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/eeprom.h>

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

uint8_t InitWert_A = 10;
uint8_t Speicher_A EEMEM = 0;
volatile uint8_t Aktuell_A;

void ausschalten (void) {
   eeprom_write_byte(&Speicher_A, Aktuell_A);
}

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

int main (void) {

Aktuell_A = ADC;                  // Wert vom ADC übergeben

}


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

Autor: Markus Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade einen Fehler gesehen und den Code aktualisiert. Sorry 
für die Unübersichtlichkeit...
#include <avr/eeprom.h>

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

uint8_t InitWert_A = 10;
uint8_t Speicher_A EEMEM = 0;
volatile uint8_t Aktuell_A;

void ausschalten (void) {
   eeprom_write_byte(&Speicher_A, Aktuell_A);
}

void einschalten(void) {
   if (eeprom_read_byte(&Speicher_A) != 0) InitWert_A = eeprom_read_byte(&Speicher_A);
}

int main (void) {

Aktuell_A = ADC;                  // Wert vom ADC übergeben

}

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.