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.
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?
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!
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
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!
@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.
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:
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!