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 @Walter, stimmt, habe die Änderung durchgeführt, Danke! Leider hilft mir das bei meinem eigentlichen Problem leider nicht weiter.
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:
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.