Moin,
ich habe folgendendes kurioses Problem. Vielleicht hat jemand eine Idee.
Seit mehreren Tagen mache ich Messungen mit nem ATmega32 und speichere
sie auf einen Flash-Speicher SST25VF064C. Das funktioniert auch
wunderbar. Über einen Befehl kann ich die Werte auslesen und aufm
PC-Bildschirm schön angucken.
Bisher funktionierte das auch super, da hat er ununterbrochen ca. 10
Tage aufgezeichnet und auch ausgelesen. Jetzt plötzlich hört er nach 2
Tagen der aufgezeichneten Werte auf, diese auszulesen. Vorhanden müssen
sie ja sein, da sie ja das letzte Mal angezeigt wurden und gelöscht
wurden sie auch nicht, da ja sonst auch die angezeigten Werte nicht mehr
angezeigt werden dürften.
Ich habe nichts geändert, es wurde in der Zeit (als es noch
funktionierte) bis jetzt, das Gerät nicht mal angefasst. Reset habe ich
schon gemacht. Er bleibt immer an der gleichen Stelle stehen.
Hat jemand eine Idee, woran das liegen könnte?
Zebra schrieb:> Jetzt plötzlich hört er nach 2 Tagen der aufgezeichneten Werte auf,> diese auszulesen.
Warum? Wie stellst du das fest?
Gib doch mal die fehlenden Informationen, so kann ja wohl kaum einer was
sinnvolles sagen.... :-/
Wieviele Daten sind abgespeichert?
Wer schreibt, wer liest aus?
Wer hat die Hardware gemacht? Gibt es einen Plan?
Wer hat die software gemacht? Wie sieht die aus?
ja, also ich hatte erstmal keinen Quellcode mit reingeballert, weil ich
wenn der Code falsch wäre, hätte es ja nie funktioniert mit dem
Auslesen, oder?
also der Logger ist seit ca. 2 Wochen in Betrieb und funktionierte
wunderbar. Seit dem 4.10. loggt der stündlich 3x 16 Temperaturen mit.
Das Auslesen über RS232 mit TeraTerm kann auch während der Messung
geschehen. Habe also immer mal zwischendurch die Werte ausgelesen, als
Kontrolle. Es wurden auch immer alle Werte korrekt angezeigt, vom 4.10.
bis zum 14.10. Heute wollte ich die alten Werte plus die neuen vom
Wochenende erneut auslesen. Nun zeigt er mir die Werte aber nur noch bis
zum 06.10. an. Danach endet der Auslesevorgang, so als wären keine Daten
mehr aufgezeichnet. Aber es wurden ja schon alle bis mindestens zum
14.10. aufgezeichnet. Die Frage ist also, warum hört er immer am 6.10.
auf?
Ja es gibt einen Schaltplan, aber an dem dürfte es ja eigentlich nicht
liegen, da es ja bisher immer funktioniert hat.
Kann es sein, dass der Speicher vielleicht irgendwie beschädigt ist,
oder so?!
Die Hardware und Software ist parallel entwickelt worden, im Rahmen
einer Masterarbeit. Der Logger arbeitet immer noch korrekt weiter,
misst, speichert ab und das Auslesen funktioniert ja auch, wie es soll,
nur bricht er einfach irgendwann ab.
Sagt mir, was ihr noch als Infos benötigt...den kompletten Schaltplan
bzw. Code kann ich leider nicht zur Verfügung stellen, ihr kennt das
ja...aber Ausschnitte schon, aber hilft das weiter? Ich meine isses
wahrscheinlich, dass es ein Bug im Programm ist oder eher irgendwas
zerschossen ist?!
Zebra schrieb:> ja, also ich hatte erstmal keinen Quellcode mit reingeballert, weil ich> wenn der Code falsch wäre, hätte es ja nie funktioniert mit dem> Auslesen, oder?
Kommt drauf an...
Fehler beim Page-Program: zu viel (> 256 Bytes) oder zu früh (während
des Löschens) oder nicht ab einer Seitengrenze und dann zuviel
geschrieben, Seite nicht gelöscht oder eine defekte Seite im Flash, an
einem zu tiefen Absinken der Spannung während des Schreibens/Lesens, an
Störungen auf den SPI-Leitungen, an nicht mehr/richtig engestellter
Block Protection oder Reset/Hold, u.U. daran das versucht wird
gleichzeitig zu schreiben und zu lesen...
Zebra schrieb:> Danach endet der Auslesevorgang, so als wären keine Daten> mehr aufgezeichnet.
Es gibt keinen Zustand "keine Daten". Es ist immer irgendwas im Speicher
und wenns 0xFF ist.
Du brauchst ein Protokoll, wie freie und belegte Bereiche als solche
gekennzeichnet werden. Im Prinzip, wie es z.B. ein FAT32 oder NTFS
macht.
Peter
Ich hab das schonmal gesacht, aber wiederhol mich gern
also du kannst mit log2(n) zugriffen feststellen wie weit deine karte
mit n sektoren schon voll ist, das kannst du bei jedem boot machen oder
auch staendig, es sind nur max 20 zugriffe
dabei wird jeweils in der mitte eines speicherbereiches gelesen,
wenn der eintrag voll ist, weisst du dass die erste haelfte voll ist,
und halbierst die zweite haelfte wieder und faengst damit von vorn an
wenn der mittlere eintrag jedoch leer ist, weisst du, dass die komplette
zweite haelfte leer ist und suchst in der ersten haelfte, indem du die
wieder halbierst und wieder in der mitte guckst,
das machst du ein paar mal,
bis dein bereich nur noch 1 sektor gross ist und dann hast du ihn
gefunden
ist das klar geworden??
musst natuerlich die beschriebenen sektoren markieren zb indem das erste
bit auf 1 ist oder so