Atmega324PA EEPROM

Gast #6010477
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
Gast #6011473
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
#6014929
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.