Forum: Compiler & IDEs leidiges EEPROM schreiben


von Heiko Suesens (Gast)


Angehängte Dateien:

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.

von Walter (Gast)


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?

von Süsens, Heiko (Gast)


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!

von Walter (Gast)


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

von Heiko Suesens (Gast)


Lesenswert?

Hi @Walter,

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

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

von Süsens, Heiko (Gast)


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!

von Günter R. (galileo14)


Angehängte Dateien:

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.

von Peter D. (peda)


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:
1
unsigned long adc_sum;
2
unsigned long offset;
3
4
#define OFFSET_ADDR             (void*)0x10
5
...
6
  eeprom_read_block( &offset, OFFSET_ADDR, sizeof( offset ));
7
...
8
  eeprom_write_block( &adc_sum, OFFSET_ADDR, sizeof( adc_sum ));


Bei mir funktionierts jedenfalls.


Peter

von Süsens, Heiko (Gast)


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!

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.