Forum: Mikrocontroller und Digitale Elektronik Atmega324PA EEPROM


von Mat (Gast)


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

von Georg G. (df2au)


Lesenswert?

Du liest Rs_ee und schreibst den neuen Wert nach Ls_ee. Wie soll sich da 
was ändern?

von Mat (Gast)


Lesenswert?

Mat schrieb:
> uint16_t Zaehlerwert = eeprom_read_word(&Rs_ee); //Zählerstand
muss natürlich Ls sein.

Das hat aber nichts geändert.

Ich habe dann im Projekt die Compileroptimierung geändert und damit ging 
es dann Problemlos.

Grüße
Marc

von Sebastian R. (lange_leitung)


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

von Einer K. (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mat schrieb:
> Ich habe dann im Projekt die Compileroptimierung geändert und damit ging
> es dann Problemlos.

Dann hast du ein anderes Problem und solltest ihm auf den Grund gehen.

Compiler optimieren nur das, was sie auch optimieren dürfen. Dazu musst 
du ihnen aber auch sagen, was sie nicht optimieren dürfen (bspw. durch 
"volatile").

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.