Forum: Mikrocontroller und Digitale Elektronik Daten sequentiell in Datei auf SD-Karte speichern


von M. G. (looking)


Lesenswert?

Ich möchte gerne von einem µC aus Daten fortlaufend in eine Datei auf 
einer SD-Karte schreiben. Die Datei soll am PC lesbar sein (FAT16). 
Damit kein FAT16 mit Schreibmöglichkeit unterstützt werden muss (wegen 
begrenzter Resourcen von Codeflash und RAM auf µC), soll per PC 
(Kartenleser) auf der SD-Karte eine große "leere" Datei angelegt werden, 
sodass der µC einfach in die Sektoren dieser bestehenden Datei 
reinschreiben kann.

Jetzt gibt es das Problem, dass man einen Pointer auf die zuletzt 
geschriebene Stelle nichtflüchtig speichern muss, damit nach dem Aus- 
und wieder Einschalten an der richtigen Stelle weitergeschrieben wird. 
Man könnte sich das z.B. in 4 Bytes im ersten Sektor der Datei 
speichern. Wenn man allerdings z.B. jede Sekunde diese Info dort 
abspeichert, dann wird wohl sehr schnell die zulässige 
Schreibzyklenanzahl überschritten und der Sektor defekt sein. Wie sieht 
das mit der Abnutzung der Flashzellen in einem Sektor genau aus? Der 
Sektor wird ja vermutlich intern erst gelöscht (z.B. Bits auf 0) und 
dann mit dem neuen Bitmuster beschrieben. Wenn ein Bit vor dem Löschen 
schon 0 war und beim neu Beschreiben auch wieder eine 0 bekommt, dann 
müsste es doch dann keine Abnutzung geben? Die Idee wäre, die 4 Bytes 
für die Positionsinfo nicht immer an die gleiche Position im Sektor zu 
schreiben, sondern über mehrere Bytes zu verteilen. Könnte man so das 
Problem mit der begrenzten Schreibzyklenanzahl lösen?

von holger (Gast)


Lesenswert?

>(wegen begrenzter Resourcen von Codeflash und RAM auf µC),

Fehler Nummer eins.
Du wirst mit dieser Lösung nie glücklich werden.

von Peter R. (gelb)


Lesenswert?

Auf atmel.com gibt es bei den AVRs die Application Note AVR101: High 
Endurance EEPROM Storage. Dort wird ein speicherschonender Ringpuffer, 
also das, was du vor hast, genau beschrieben.

Grüße, Peter

von O. D. (odbs)


Lesenswert?

Ähem.

Setzen SD-Karten das "wear levelling" nicht schon intern um? Sonst würde 
mit einem FAT (!) Dateisystem niemand auf Dauer glücklich werden.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Ich hab so etwas in der Art letztes Jahr mal entwickelt - mit einem PIC.

Wie oft hast Du Sachen, die gespeichert werden ?
Wie lange soll das Gerät laufen ?

von Christian J. (elektroniker1968)


Lesenswert?

Jetzt gibt es das Problem, dass man einen Pointer auf die zuletzt
geschriebene Stelle nichtflüchtig speichern muss, damit nach dem Aus-
und wieder Einschalten an der richtigen Stelle weitergeschrieben wird.
---

Die Lösung heisst NVRAM, das ist nichtflüchtig und kann beliebig oft 
wiederbeschrieben werden. Ausserdem kannst Du einen Sektor einer SD so 
oft beschreiben wie Du willst, er wird nie logisch kaputt gehen, die 
Karte ersetzt ihn fortlaufend durch Reservesektoren, die eingeblendet 
werden.

Den Firlefanz mit der SD Karte würde ich mir erst gar nicht antun, zudem 
Du nicht weisst ob der PC die Datei fortlaufend erzeugt hat oder nicht 
doch Sektorsprünge darin sind. Dann müssstest Du die Fat auslesen usw. 
Leider gibt es für PIC keine gescheite Fat Verwaltung, ausser 
Bezahllösungen, die zudem den teuren High Tech oder IAR Compiler 
erfordern, bekanntlich gibt es keinen GCC für PIC und der beliebte CCS 
ist durch die HAL zu keinem anderen kompatibel.

von Wolfgang-G (Gast)


Lesenswert?

Vorschlag, welcher sich bei mir bewährt hat: 512 Bytes sammeln im RAM
des µC (512 Bytes = 1 Sektor) und dann Sektor für Sektor beschreiben. 
Den 1. Sektor für den Dateianfang muss man z. B. mit WINHEX  vorher 
suchen. Man kann damit wochenlang Messwerte auf der SD-Karte sammeln.

>Du nicht weisst ob der PC die Datei fortlaufend erzeugt hat oder nicht
>doch Sektorsprünge darin sind.

Karte formatieren und nur eine Datei anlegen.  Bisher keine Probleme

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
Noch kein Account? Hier anmelden.