mikrocontroller.net

Forum: Compiler & IDEs leidiges EEPROM schreiben


Autor: Heiko Suesens (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
vielleicht kann hier mir jemand helfen, da ich schon den Wald vor lauter 
Bäume nicht mehr sehe.
Ich versuche aus dem Programm heraus eine Struktur ins EEPROM zu 
schreiben, was mir aber beim besten Willen nicht gelingen will.
Als erstes wird eine Struktur aus dem EEPROM geladen, funktioniert noch. 
Schreibe ich nun ins EEPROM, steht mitten im EEPROM irgendwo eine 0x00 
und die Adresse 0x0000 wird mit 0x00 überschrieben.
Im AVR-Studio im Simulatorbetrieb funktioniert auch das Schreiben des 
EEPROM, nur im AVR ATmega168 halt nicht.
Programmteil ist im Anhang.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat zwar nicht mit deinem Problem zu tun, erhöht aber die Übersicht 
ungemein:

die ganzen casts solltest Du rausschmeißen, sind zu nicht gut außer 
mögliche Programmierfehler zu verstecken.

braucht man das
do {} while (!(eeprom_is_ready()));
überhaupt?

Autor: Süsens, Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @Walter,
wenn ich die casts nicht drinstehen habe, bringt mir der Compiler 
dauernd Warnungen und das nervt, da ich schon andere Warnungen eingebaut 
habe (Studio-Debug eingestellt,...), auf die ich nicht verzichten will. 
Wenn nun ständige Warnungen kommen, muß ich immer erst schauen, welche 
sind das.
Die do/while ist zur Sicherheit eingebaut, da in WinAVR so beschrieben, 
hat aber auch keine Änderung gebracht!

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dafür gibts aber doch void *

wenn der Parameter des UP so deklariert ist, kannst du einen
Pointer auf irgendwas übergeben ohne das der Compiler nörgelt

Autor: Heiko Suesens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @Walter,

stimmt, habe die Änderung durchgeführt, Danke!

Leider hilft mir das bei meinem eigentlichen Problem leider nicht 
weiter.

Autor: Süsens, Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

schade eigentlich, keine Antwort zur Problemlösung!

Ich dachte, da dieses Thema schon des öfteren behandelt wurde, das mich 
die Anzahl der Lösungsanbietungen erschlagen werden.

Aber nicht eine einzige Antwort ?!

Hat denn keiner den "eeprom_write_block" eingesetzt?

Vielleicht werde ich den "write_block" mal auf "write_byte" ändern!

Autor: Günter R. (galileo14)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Heiko:

Dein Programm ist recht aufwendig und unübersichtlich deklariert. 
Benötigt man die EEMEM-Dklarationen in Deinem Fall überhaupt? Du hast 
doch Variablen im RAM und willst deren Inhalt blockweise ins bzw. vom 
EEPROM befördern; das geht doch mit eeprom_read_block und 
eeprom_write_block rechte einfach.

Ich habe Dir mal ein Programm-Fragment beigelegt, in dem ich Adressen 
speichere und lese. Vielleicht hilft das.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde nicht direkt aufs EEPROM schreiben, sondern die Struktur im 
RAM ablegen und dann nur auf Anforderung zurückschreiben, kann ne ganze 
Menge Schreibzyklen einsparen:
unsigned long adc_sum;
unsigned long offset;

#define OFFSET_ADDR             (void*)0x10
...
  eeprom_read_block( &offset, OFFSET_ADDR, sizeof( offset ));
...
  eeprom_write_block( &adc_sum, OFFSET_ADDR, sizeof( adc_sum ));


Bei mir funktionierts jedenfalls.


Peter

Autor: Süsens, Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter, Günter,

ich bin der Meinung, genau so zu verfahren, wie Ihr das dokumentiert 
habt.

Ich definiere 4 Strukturen im EEPROM, die ersten beiden Strukturen 
werden mit Werten vorbelegt (Grundwerte/Werkseinstellung), die anderen 
beiden sind mit 0 vorbelegt. Zusätzlich werden die beiden Strukturen 
"Impuls_Structs" und "Alarm_Structs" im RAM definiert. Dann lese ich die 
"Save_***_Structs" in den Speicher, wenn das erste Feld der Struktur == 
0 ist, wird nochmals die Werkseinstellung aus dem EEPROM geladen. Das 
funktioniert auch soweit. Nachdem der Benutzer nun einige Einstellungen 
vorgenommen hat, soll die "Impuls_Structs" aus dem RAM mit den neuen 
Werten ins EEPROM gesichert werden. Und genau hier passiert der Fehler, 
da einfach auf EEPROM Adresse 0 ein Wert 0 und irgendwo auf Adresse > 
0x100 eine 0 geschrieben wird. Ich hatte die Addressierung in Verdacht, 
aber mit dem Studio funktioniert auch das Schreiben vernünftig.
Ich werde mir mal ein paar Zeiger bauen, und die Struktur Adresse für 
Adresse mit "eeprom_write_byte" übertragen.

Trotzdem Danke!

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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