Hallo,
ich möchte auf einem 24lc256 Messwerte abspeichern, die aus jeweils der Uhrzeit und dann noch 2 Byte an Daten bestehen; also gesamt 6 byte groß sind. Dazu verwende ich folgenden Code:
Soweit funktioniert das auch, allerdings werden anscheinend nicht alle Werte sauber geschrieben oder gelesen. Wenn ich mir die Werte byteweise ausgeben lasse erhalte ich folgende Ausgabe (alle Werte wurden zum Test mit 0 beschrieben):
0 0 0 0 0 0
...
0 0 0 0 0 0
0 0 255 255 255 255
0 0 0 0 0 0
...
0 0 0 0 0 0
0 0 255 255 255 255
0 0 0 0 0 0
...
0 0 0 0 0 0
0 0 255 255 255 255
0 0 0 0 0 0
...
0 0 0 0 0 0
Ich habe am Anfang vermutet, dass vielleicht bestimmt Speicherzellen kaputt sind, aber egal in welchem Bereich auf dem EEPROM ich meine Daten schreibe/lese bekomme ich die selben Ergebnisse. Auch dass der Abstand zwischen den Fehlern immer gleich ist, finde ich seltsam.
Keine Lösung, nur 'ne Rückfrage zu einer Vermutung:
Beim Aufruf der Schreib-Funktion übergibst du eine Adresse im INT-Format, sendest dann 2x INT ans EEPROM als Adresse (MSB+LSB). Müsste man dort bei write(...) nicht auf "Byte" casten?
Auch später bei Read?
(Das Thema interessiert mich nämlich für einige Versuche in den nächsten Wochen)
RudiDL5:
Keine Lösung, nur 'ne Rückfrage zu einer Vermutung:
Beim Aufruf der Schreib-Funktion übergibst du eine Adresse im INT-Format, sendest dann 2x INT ans EEPROM als Adresse (MSB+LSB). Müsste man dort bei write(...) nicht auf "Byte" casten?
(Das Thema interessiert mich nämlich für einige Versuche in den nächsten Wochen)
Ich rufe den Schreibbefehl so auf (wobei ich den Code nicht selber geschrieben hab, sondern irgendwoher kopiert habe; die Frage mit dem int habe ich mir auch schon gestellt, aber falls das falsch sein sollte dürfte es ja bei mir nicht 31 von 32 mal funktionieren...):
wobei in NowLong die aktuelle Zeit steht
unsigned char byteArray[6];
// convert time from an unsigned long int to a 4-byte array
byteArray[0] = (int)((NowLong >> 24) & 0xFF) ;
byteArray[1] = (int)((NowLong >> 16) & 0xFF) ;
byteArray[2] = (int)((NowLong >> 8) & 0XFF);
byteArray[3] = (int)((NowLong & 0XFF));
byteArray[4] = powerByte(NEU);
byteArray[5] = powerByte(ALT);
LC256_writeEntry(pos, byteArray);
dürfte es ja bei mir nicht 31 von 32 mal funktionieren
Ist ein Argument, ich kanns halt (noch) nicht selbst testen, weil es erst in ein paar Wochen auf dem Plan steht. Aber ich verfolge das gerne, war ja auch nur 'ne Vermutung.
Vorteil:
Die Lib hat Methoden um Strukturen/Objekte zu schreiben.
Sieht nicht schlecht aus, aber eigentlich wollte ich für diese vermeintliche Kleinigkeit kein library verwenden, da ich eh schon Speicherplatzprobleme habe...
Soooo groß ist die LIB von "combie" ja auch wieder nicht (habe ich übrigens für mich schon gesichert...) aber wenn du eh schon knapp mit dem Speicher bist - dann bleibt dir wohl auf Dauer nichts anderes übrig als das Programm zu optimieren. Allein schon bei for(int i = 0; i < 6; i++) würde ich selbst nur "byte" als Zähler nehmen, spart schon einige Bytes, so etwas ist an anderen Stellen sicherlich auch noch mehrfach vorhanden und summiert sich.
Sieht nicht schlecht aus, aber eigentlich wollte ich für diese vermeintliche Kleinigkeit kein library verwenden, da ich eh schon Speicherplatzprobleme habe...
Dann solltest du auch verstehen, wie solche EEProms funktionieren.
Meine Glaskugel sagt:
Du schreibst über Pagegrenzen hinweg.
Du schreibst also an ganz andere Adressen, als du eigentlich glaubst.
Nachtrag:
Dieses Problem wird bei I2C und SPI Eeproms auftreten
Ich habe meine Daten jetzt einfach um 2 byte vergrößert und damit passen jetzt immer genau 8 Werte in eine Page und ich muss nicht über Seitengrenzen hinausschreiben.