Hallo! Für einen Datalogger brauche ich 2 MB Platz. Deshalb muss ich wohl einen Flash IC einplanen. Z.B. sind die W25xxxx von Winbond anscheinend verbreitet. Nun habe ich aber gelesen, dass man Flash nur schreiben kann, nachdem eine Seite gelöscht wurde. Allerdings können die Winbond nur minimal 4kB auf einmal löschen. Jetzt bin ich verwirrt... wenn ich also irgendwann mal ein Byte ändern will, muss ich dann tatsächlich erst 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern? Dazu bräuchte ich ja einen ziemlich fetten AVR, der mindestens 5 kB SRAM hat, nämlich 4 kB für die Page zum temporären Speichern + 1 kB für sich selbst. Das kanns ja nicht sein. Gibts da einen Trick?
Jan schrieb: > Jetzt bin ich verwirrt... wenn ich > also irgendwann mal ein Byte ändern will, muss ich dann tatsächlich erst > 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern? Ja. > Das kanns ja nicht sein. Gibts da einen Trick? Flash mit kleinerer Page Größe? EEPROM?
Jan schrieb: > muss ich dann tatsächlich erst > 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern? Ja, so ist das. Jan schrieb: > Das kanns ja nicht sein. Gibts da einen Trick? Oft funktioniert das setzen eines Bits auf 0 auch ohne das Löschen einer Page. Nur für das setzen auf 1, muss die ganze Page gelöscht (also alle Bits der Page auf 1) werden.
:
Bearbeitet durch User
Muss man denn wirklich bei einem Datenlogger einzelne Bytes ändern? Kann man da nicht die Page löschen und neu aufnehmen? Konfiguration, die auf Byte-level verändert werden sollte, sollte am Besten in den EEPROM. Und sonst sollte man beim Flash auch wear-leveling berücksichtigen. Um dein Problem zu lösen könnte man die Daten auch erstmal in eine andere Sektion im Flash kopieren und dann beim Kopieren einzelne Bytes verändern.
Jan schrieb: > Nun habe ich aber gelesen, dass man Flash nur schreiben > kann, nachdem eine Seite gelöscht wurde. Allerdings können die Winbond > nur minimal 4kB auf einmal löschen. Jetzt bin ich verwirrt... wenn ich > also irgendwann mal ein Byte ändern will, muss ich dann tatsächlich erst > 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern? Ja, so ist das halt bei Flash. > Dazu bräuchte ich ja einen ziemlich fetten AVR, der mindestens 5 kB SRAM > hat, nämlich 4 kB für die Page zum temporären Speichern + 1 kB für sich > selbst. Das kanns ja nicht sein. Gibts da einen Trick? Nur einen: einen Flash-Stein mit RAM-Cache verwenden.
c-hater schrieb: > Nur einen: einen Flash-Stein mit RAM-Cache verwenden. Dann kann man auch noch einen Schritt weiter gehen und auf SD-Karten setzen. Die kümmert sich dann auch direkt selbst um Wear-Leveling usw.
Jan schrieb: > Jetzt bin ich verwirrt... wenn ich > also irgendwann mal ein Byte ändern will, Irgendwie erscheint mit dein Konzept etwas merkwürdig. Warum sollte man bei einem Datenlogger bereits gespeicherte Daten im Nachhinein nochmal ändern wollen? Normalerweise schreibt man da doch einfach die Datensätze fortlaufend weg bis man irgendwann mal sagt lösche die gesamte Log. Oder wenn man den gesamten Speicher zyklische verwenden will hat man in der Regel genügend Vorlauf um den ältesten Block bei Zeiten zu löschen um diesen dann wieder verwenden zu können.
Jan schrieb: > Jetzt bin ich verwirrt... wenn ich > also irgendwann mal ein Byte ändern will... ...dann solltest du dich schleunigst an deinen Tisch setzen, Papier und Stift bereithalten und versuchen, zu denken. Oder selbiges wenigstens zu versuchen. So ein serieller Flash kann eben bloß blockweise auf FF gelöscht werden, also solltest du dir einen zu so einem Chip passenden Algorithmus ausdenken. Das ist eigentlich alles. Für einen Datenlogger braucht man überhaupt nicht "irgendwann mal ein Byte" zu ändern. Der Knackpunkt ist eigentlich nur, die aktuelle Schreibposition zu finden. Das kann man so machen, daß man sich für seine zu loggenden Daten einen Record (bzw. struct) ausdenkt, dessen 1. Byte garantiert nicht FF ist und dessen Länge so bemessen ist, daß eine glatte Anzahl solcher Datenstructs in einen Block des seriellen Flashes hineinpassen. Jetzt muß man nach dem Einschalten des Gerätes zunächst erstmal suchen, bei welchem Block des Chips das erste Byte = FF ist. Entweder man sucht ab 0 oder ab letztem Block. Ist Ansichtssache. Das nette an solchen seriellen Flashes ist (zumeist), daß man nicht den ganzen Block lesen muß, sondern auch bei Bedarf nur das jeweils 1. Byte eines Blockes. Damit findet man die aktuelle Schreibposition schneller. Wenn man so einen Block mit FF als erstem Byte gefunden hat, betrachtet man den vorherigen Block und sucht darin die Stelle, wo der erste Datenrecord mit 1. Byte = FF ist. Wenn keiner drin ist, dann nimmt man den nächsten Block als aktuellen Block und löscht vorsorglich dessen Nachfolgeblock. So hat man grundsätzlich immer einen gelöschten Block auf dem Chip, um die aktuelle Schreibposition zu finden. Siehste, und ab da kannst du mit dem Logging anfangen. Wenn ein Block voll ist, wird der nächste Block genommen (der ja per Procedere gelöscht ist) und zugleich dessen Nachfolgeblock gelöscht. Und so geht das beliebig lange immer im Kreise herum. Bist du beim letzten Block des Chips, dann ist der erste Block wieder dran. Eben ne Art Ringpuffer. Klaro? W.S.
Es gibt SPI-SRAM von Microchip: 23K256 z.B. oder 23LC1024. Das kannst Du als Cache nehmen, um das Flash so lange wie möglich im Powerdown-Zustand zu halten. fchk
Andre schrieb: > Dann kann man auch noch einen Schritt weiter gehen und auf SD-Karten > setzen. Die kümmert sich dann auch direkt selbst um Wear-Leveling usw. Ja. Mehr oder weniger... Prinzipiell hast du natürlich vollkommen Recht, leider ist aber bei SD-Karten derartig viel Vollschrott im Umlauf, dass es wirklich schwer fällt, brauchbare Hardware zu kaufen. Kauft man sie dort, wo man sich auf die Eigenschaften verlassen kann, sind sie einfach mal nur sehr teuer. Braucht man nur relativ wenig Speicherplatz, ist es nicht unbedingt der weiseste Schluß, auf SD-Card zu setzen...
W.S. schrieb: > ...dann solltest du dich schleunigst an deinen Tisch setzen, Papier und > Stift bereithalten und versuchen, zu denken. Oder selbiges wenigstens > zu versuchen. Das ist genau die richtige Aufgabe für dich. Zb solltest du erstmal ordentlich Tasten enprellen lernen bevor due andere dumm anmachst. Wer das nichtmal kann sollte nämlich seeehr leise sein ;)
OK dann nehme ich einen EEPROM für die kleinen Statistiken und das Flash für den seriellen Kram, was ich auch auf Tape packen würde. Hindert mich ja nichts dran, das zu kombinieren.
Bei Flash wird immer eine gesamte Seite auf einmal gelöscht, also jedes Byte auf 0xFF gesetzt. Zumindest den Flash den ich kenne, kann man nach dem Löschen beschreiben wie man will. Eine bereits gesetzte Null bekommt man erst dann wieder auf Eins gesetzt, in dem die komplette Seite gelöscht wird. Also Ja, ein Byte zwischendrin ändern geht nicht. Du könntest aber die Seite im Flash kopieren, löschen, die Seite ohne die zu ändernden Daten zurückkopieren und dabei die Daten modifizieren. Brauchst du das bei einem Datenlogger wirklich? Hatten einige Tinys nicht ein EEprom? Dort könnte man die Schreibposition ablegen.
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.