Forum: Mikrocontroller und Digitale Elektronik AVR EEPROM Problem mit Ringbuffer


von Steffen (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem mit dem Lesen vom EEPROM, bzw. das Schreiben und 
Lesen ansich funktioniert eigentlich.

Ich habe mir die Application Note "101 High Endurance EEPORM Storage" 
von ATMEL vorgenommen. Ich möchte einfach dadurch halt die möglichen 
Schreibzyklen erhöhen.

Das funktioniert auch soweit gut. Ich kann generell ins EEPROM 
schreiben, Daten Lesen usw.

Mein Problem liegt nun darin, dass ich nach einem Reset, z.B. 
Spannungsversorung aus, die Daten nicht mehr lesen kann. Wenn ich z.B. 
folgenden Ablauf habe
1
void main ( void )
2
{
3
  unsigned char counter= 20;
4
  findCurrentEepromAddr( &EeBufPtrParam1 );
5
  test= EeReadBuffer( EeBufPtrParam1 );
6
7
  while(1)
8
  {    
9
  findCurrentEepromAddr( &EeBufPtrParam1 ); 
10
   EeWriteBuffer( EE_PARAM_1, &EeBufPtrParam1, counter );
11
  }
12
}

wird die 20 ins EEPROM geschrieben. Das habe ich durch auslesen des 
EEPROM mit dem AtmelStuio kontrolliert.

Wenn ich nun die Spannungsversorgung aus- und wieder einschalte, würde 
ich erwarten, dass vor der while-Schleife in der Variable "test" die 20 
drin stehen würde.
Es wird allerdings immer ein 0xFF ausgelesen. Scheinbar wird halt die 
letzte Schreib-/Speicherposition nicht richtig gefunden.

Das Ganze lläuft auf einem ATMEGA48 aktuell.

Hat jemand eine Idee / Anregung, woran es liegen könnte?

Vielen Dank!

Gruß
Steffen

von Uwe (de0508)


Lesenswert?

Steffen ,

eine Anmerkung zum EEprombetrieb, ist eine der BOD Fusebits gesetzt ?
Bei welcher Spannung arbeitet dein AVR µC ?

von Steffen (Gast)


Lesenswert?

Hallo,

der µC läuft auf 5V.

Es ist keine der BOD Fusebits gesetzt.

Gruß
Steffen

von Martin L. (martin_l795)


Lesenswert?

Hab die Application Note mal überflogen. Du meinst, die 20 würde richtig 
geschrieben, das ist also Ok, das ist der Wert der dann im eigentlichen 
Parameter Buffer steht. Wird denn die Position des Parameter Buffers 
auch richtig in den Status Buffer geschrieben? Müsste ja auch im EEPROM 
liegen und per AVR-Studio auslesbar sein.

von Kaj (Gast)


Lesenswert?

Wenn du den Debugvorgang neu startest, wird auch das Programm neu 
geflasht und das EEPROM geloescht! Deswegen bekommst du immer ein 0xFF. 
Da gibts irgendwo einen Haken um das loeschen des EEPROM abzuschalten.

von Martin L. (martin_l795)


Lesenswert?

Dann dürfte aber die 20 auch nicht mehr drin stehen?
Ich hab ja so eher biachen den Verdacht, das er den Statusbuffer 
vergessen hat.

von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

das mit dem EEPROM -löschen hatte ich schon bedacht.

Ich habe das Programm etwas umgebaut. Es wird nun nur ein Wert ins 
EEPROM geschrieben:
1
void main ( void )
2
{
3
  unsigned char counter= 20;
4
  unsigned char write= 0;
5
  findCurrentEepromAddr( &EeBufPtrParam1 );
6
  test= EeReadBuffer( EeBufPtrParam1 );
7
8
  while(1)
9
  {    
10
    if(write == 0)
11
    {
12
      findCurrentEepromAddr( &EeBufPtrParam1 ); 
13
      EeWriteBuffer( EE_PARAM_1, &EeBufPtrParam1, counter );
14
      write= 1;
15
    }
16
  }
17
}

Wenn ich dann das EEPROM auslese erhalte ich die Daten, die ich als 
Textfile angehangen habe.

Gruß
Steffen

von Peter D. (peda)


Lesenswert?

Mit Codepfitzelchen aus unbekannten Aufrufen kann keiner was anfangen.
Poste mal nen compilierbaren Code als Anhang.

von MitLeser (Gast)


Lesenswert?

wann wird die 20 wieder ausglesen ?
Wenn direkt nach dem schreiben wird sie auch drin stehen,
aber wenn das EESAVE nicht gesetzt ist entweder FUSE-mässig oder in den 
Studioeinstellungen (was oben auch Kaj meinte) ist beim Neustart des 
Deubuggers der EEP-Inhalt wieder 0xFF.

von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine Uart-Ausgabe hinzugefügt, damit die Sache mit dem Debugger 
keine Rolle mehr spielt, macht das ganze auch einfacher.

Im Anhang habe ich die Soourcefiles, mit denen ich im Moment diese Tests 
mache.

Gruß
Steffen

von Steffen (Gast)


Lesenswert?

Hallo,

hat jemand vielleicht eine Idee, woran es liegen konnte aufgrund des 
Codes?


Ich habe noch weiter probiert, habe aber leider selbst noch keine Lösung 
gefunden.

Vielen Dank!

Gruß
Steffen

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.