mikrocontroller.net

Forum: Compiler & IDEs EEPROM - Verhalten beim Beschreiben


Autor: Jack X539 (br3w3ry)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin zusammen,

ATXmega256A3U @32 Mhz
Atmel Studio 7
JTAG - ICE
header avr/eeprom.h

Optimiazation steht auf "Optimize for size"


ich beschreibe meinen EEPROM mittels eeprom_write_block(&buffer... zwei 
mal hintereinander (Daten kommen über UART).

Wenn ich die Daten im Betrieb mittels eeprom_read_block(... auslese und 
ausgebe, stehen falsche Daten drin.

Als ich aber Breakpoints an eeprom_write_block&buffer... gesetzt habe um 
zu sehen, was für Daten in buffer stehen (waren die richtigen) hat die 
Ausgabe gepasst...
Also liegt es vermutlich am Beschreiben des eeproms...

Kennt jemand das Problem und die dazugehörige Lösung?


Grüße

Autor: tja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lies doch mal über JTAG den EEPROM aus und überprüfe ob die stimmen - 
wenn nein, dann ist doch beim Schreiben was schief gelaufen!

Autor: Jack X539 (br3w3ry)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für den Tipp!
Habe das überprüft und tatsächlich steht im EEPROM nach dem Schreiben 
nichts drin...

Woran könnte das liegen?
Wenn ich den EEPROM dummy mäßig beschreibe (hier ein '!') in der 
Initialisierung funktioniert das.

Wenn ich den gleichen Aufruf an der selben Stelle mache, wo der UART 
schreibt klappt es NICHT.

// dummycode

char test[10];
test[0] = '!';

eeprom_write_block (&test , (void*) 0x440, 1 );

Autor: tja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm - komisch. Bist du da in einer ISR? Weiß zwar nicht, ob es damit 
etwas zu tun haben kann, aber es wäre zumindest ein Unterschied.

Autor: Jack X539 (br3w3ry)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne gar nicht.

Wird in der main aufgerufen und ist verschachtelt in 2 Funktionen und 
einer switch case Anweisung wo dann in EEPROM geschrieben wird (im 
richtigen "case").

Autor: tja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schonmal probiert in deiner Initialisierung mehrmals die 
eeprom_write_block Funktion aufzurufen? Das Schreiben in das EEPROM 
braucht eine gewisse Zeit. Ich weiß jetzt auf Anhieb nicht, ob die 
Funktion blockt. Wenn du nun mehrmals hintereinander schreibst, ohne 
Pause, dann kann es vielleicht passieren, dass Zugriffe unterdrückt 
werden.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
tja schrieb:
> Ich weiß jetzt auf Anhieb nicht, ob die
> Funktion blockt.

Die Doku weiß es.

Oliver

Autor: Jack X539 (br3w3ry)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver S. schrieb:
>> Ich weiß jetzt auf Anhieb nicht, ob die
>> Funktion blockt.
>
> Die Doku weiß es.

Moin zusammen,

vielen Dank für eure Hilfe.
RTFM --> AVR Libc Reference Manual --> <avr/eeprom.h>: EEPROM handling

#define eeprom_is_ready() \

Returns
1 if EEPROM is ready for a new read/write operation, 0 if not.

Man darf den EEPROM nicht hintereinander beschreiben... wenn du muss man 
mit dem Makro "eeprom_is_ready()" warten bis eine "1" geschrieben wird.
Das war der Fehler. Funktioniert jetzt einwandfrei.

http://www.atmel.com/webdoc/avrlibcreferencemanual...

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jack X. schrieb:
> Man darf den EEPROM nicht hintereinander beschreiben... wenn du muss man
> mit dem Makro "eeprom_is_ready()" warten bis eine "1" geschrieben wird.
> Das war der Fehler. Funktioniert jetzt einwandfrei.

Erstaunlich. Denn in der verlinkten Doku steht auch:

All of the read/write functions first make sure the EEPROM is ready to 
be accessed. Ist ja auch logisch. Gerade bei eeprom_write_block geht das 
ja gar nicht anders. Da können ja viele Bytes geschrieben werden, also 
muss in der Funktion sowieso vor jedem Byte gewartet werden, bis es 
geschrieben ist und das nächste angenommen werden kann.

: Bearbeitet durch User

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.

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