Atmega324PA EEPROM

Gast #6010477
Lesenswert?

Hallo,
ich kann mir das Verhalten eines Atmega324PA unter Atmel Studio 7 (in C 
Programmiert)nicht erklären.

Es geht darum Werte ins EEPROM zu speichern.

Mit der eeprom_write_block Funktion kann ich wunderbar char Arrays ins 
EEPROM speichern und auch wieder über eeprom_read_block auslesen.

Ich möchte aber zusätzlich auch ein Zähler als uint_16 abspeichern.

//Deklaration:
uint16_t Ls_ee EEMEM = 0; //Zähler für die Anzahl der Auslösungen


//Funktionsaufruf
void Z_Aktualisierung (void)
{
  uint16_t Zaehlerwert = eeprom_read_word(&Rs_ee); //Zählerstand 
auslesen
  wdt_reset();
  if (Zaehlerwert < 65530)
  {
    Zaehlerwert++;
    cli();
    eeprom_write_word(&Ls_ee, Zaehlerwert);//Zählerstand speichern
    sei();
  }
}

Wird das Programm ausgeführt taucht im EEPROM das Char Array korrekt 
auf, aber auch ein Bereich mit FF, aber keine sich ändernde Zahl:

:10000000FFFF000001E843562900007701E84856
--------Zähler-----Array-----------------

Grüße
Marc
#6014929
Lesenswert?

Hallo Marc.

Ich glaube, man muss mit der Deklaration und vorallem der 
Initialisierung aufpassen. So wie ich das verstehe initialisiert
uint16_t Ls_ee EEMEM = 0;
die Variable NICHT mit Null. Das wäre ja auch blöd, weil dann der Wert 
nicht dauerhaft gespeichert wäre, was man ja mit dem EEPROM erreichen 
will, sondern beim Neustart des Chips würde er wieder mit Null 
überschrieben.
Daher nehem ich an, dass zur Initialisierung ein explizietes Schreiben 
nötig ist. Gelesen hab ich dazu aber noch nichts.

Für Dein Problem würde das heißen, dass Du beim Auslesen den zufällig im 
Speicher stehenden Wert ausliest, und wenn der zufällig größer als 65530 
ist, macht Dein Programm nix.
Warum das mit der anderen Optimierungseinstellung geht, weiß ich nicht.

Gruß
Sebastian
Gast #6014938
Lesenswert?

Sebastian R. schrieb:
> So wie ich das verstehe initialisiert
> uint16_t Ls_ee EEMEM = 0;
> die Variable NICHT mit Null. Das wäre ja auch blöd, weil dann der Wert
> nicht dauerhaft gespeichert wäre, was man ja mit dem EEPROM erreichen
> will, sondern beim Neustart des Chips würde er wieder mit Null
> überschrieben.
> Daher nehem ich an, dass zur Initialisierung ein explizietes Schreiben
> nötig ist. Gelesen hab ich dazu aber noch nichts.

Variablen welche in der EEMEM Section landen, werden initialisiert.
Allerdings muss die Toochain dazu eine *.eep o.ä. Datei erzeugen und 
auch ins EEPROM schreiben.

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