Forum: Mikrocontroller und Digitale Elektronik Speicher für Datenlogger


von B. S. (bestucki)


Lesenswert?

Ich habe vor, einen kleinen Datenlogger zu bauen. Jetzt habe ich das 
Problem, den richtigen Speicher dafür zu finden. Ich muss, je nach 
Einstellung des Loggers, zwischen 4 und 18 Bytes aufzeichnen, im worst 
case jede Sekunde, maximal aber nach einer Stunde. Es soll dabei 
mindestens einen Monat lang aufgezeichnet werden können, daher sind bei 
18 Bytes jede Sekunde ca. 45MB nötig. Eine serielle Ansteuerung ist 
wünschenswert.

SD-Karte:
Gute und günstige Lösung. Hat jedoch den Nachteil, dass nur Blöcke von 
512 Bytes geschrieben werden können. Im schlimmsten Fall (4 Bytes jede 
Stunde) dauert es 128 Stunden bis genug Daten gesammelt wurden, um einen 
Block zu füllen. Dabei ist mir das Risiko zu hoch, dass in der 
Zwischenzeit die Daten verloren gehen (z.B. Stromausfall). Ich hatte die 
Idee, während dieser Zeit die Daten in einem nichtflüchtigen RAM 
(gepuffertes SRAM oder FRAM) zu sichern. Ausserdem müsste ich einen 
Pegelwandler verwenden, da die restliche Elektronik mit 5V läuft. Eine 
SD-Karte hätte jedoch den Vorteil, dass die Daten schnell auf einen PC 
übertragen werden könnten.

Flash:
Sind eher günstig, aber in diesen Grössen leider nur mit paralleler 
Ansteuerung erhältlich, was sich aber mit Schieberegistern mehr oder 
weniger beheben liesse. Habe Flash-Bausteine mit einer Blockgrösse von 
nur 64B gefunden, das wären dann 16 Stunden (4 Bytes jede Stunde). Das 
ist mir immer noch zu heikel, hätte also das selbe Problem wie bei der 
SD-Karte.

EEPROM:
Sind bei Farnell nur bis 128kB erhältlich, haben aber den Vorteil, dass 
jedes Byte einzeln geschreiben werden kann. Der Speicher reicht im worst 
case nur ca. 2 Stunden (18 Bytes jede Sekunde).

FRAM:
Das selbe Problem wie beim EEPROM. Sind zwar bis 512kB erhältlich, sind 
aber schweineteuer.

Gepuffertes SRAM:
Bei Farnell nur bis 1MB erhältlich (als BGA bis 8MB) und nicht seriell. 
Die Daten bleiben ausserdem nur erhalten, solange die 
Batterie/Kondensator nicht leer ist.


Kennt jemand einen nichtflüchtigen Speicher in dieser Grösse, bei dem 
man jedes Byte einzeln schreiben kann? Wenn möglich seriell. Ich könnte 
mich mit max. 4 Speicherbausteinen anfreunden, mehr halte ich nicht für 
sinnvoll. Ansonsten wird es wohl auf die Lösung mit der SD-Karte und dem 
FRAM hinauslaufen.

Vielen Dank für eure Antworten!

von Hent R. (rhent)


Lesenswert?

Hallo be stucki,

SD Karte:
Du könntest doch zunächst in einen 512 Byte Block schreiben. Wenn neue 
Daten gespeichert werden müssen, liest du den alten Blockstand aus, 
fügst die neuen Daten hinzu und speicherst den aktualisierten Block 
wieder ab. Ist der Block voll, schreibst du in den nächsten.

Wo wäre das Problem nur 4 Byte in einen 512 Block zu schreiben, wenn du 
ne GB Karte hast?

von B. S. (bestucki)


Lesenswert?

> Du könntest doch zunächst in einen 512 Byte Block schreiben. Wenn neue
> Daten gespeichert werden müssen, liest du den alten Blockstand aus,
> fügst die neuen Daten hinzu und speicherst den aktualisierten Block
> wieder ab. Ist der Block voll, schreibst du in den nächsten.
Diese Idee hatte ich auch bereits. Hier ist das Problem, dass unter 
Umständen jede Sekunde aufgezeichnet werden muss und sich damit die 
Lebensdauer der Karte stark verringern würde. Die Zeit zwischen zwei 
Aufzeichnungen ist von den Eingangswerten (die, die aufgezeichnet 
werden) abhängig und nicht voraussehbar. Es wäre natürlich möglich, 
zwischen zwei Schreibzugriffen auf den selben Block eine bestimmte Zeit 
zu warten, damit sich die Zugriffe in Grenzen halten.

> Wo wäre das Problem nur 4 Byte in einen 512 Block zu schreiben, wenn du
> ne GB Karte hast?
1GB / 512 = 2MB

von Jochen (Gast)


Lesenswert?

Wieso kannst du nicht einen Block in dem Ram deines Controllers 
"sammeln" und dann in einem Rutsch schreiben?

von A0 S. (as0)


Lesenswert?

be stucki schrieb:
> 1GB / 512 = 2MB

512 was? Germknödel? Hat unser Professor immer gefragt.

Eine 1GB Karte hat demnach 2M 512B Blöcke, oder? Ein Monat hat 2,592M 
Sekunden. Demnach käme man mit einer 2GB Karte sogar noch ohne SDHC aus 
und könnte jede Sekunde deine maximal 18 Bytes speichern (oder auch bis 
zu 512). Wenn ich keinen Denkfehler drin hab ;)

mfg

von H.Joachim S. (crazyhorse)


Lesenswert?

Das wäre auch meine Idee gewesen, im RAM puffern und dann ab auf die 
Karte.
Falls dir das nicht sicher genug ist (Versorgungsausfälle) kann man die 
auch mit einer kleinen Batterie stützen. Oder auch grössere Datenmengen 
als 512Byte in einem externen Speicher sammeln (batteriegestützer 
SPI/I2C-RAM oder gleich einen FRAM.
Aber der interne RAM sollte genügen.

von void (Gast)


Lesenswert?

> 1GB / 512 = 2MB

falsch gerechnet.

1GB / (512B/Block) = 2.1E6 Blöcke

bei 1 Block (à 512B) pro Sekunde
 -> 2 Millionen Sekunden = 23 Tage

von Schlumpf (Gast)


Lesenswert?

ganz abgefahrene Idee...

Ich weiss ja nicht, wieviel Aufand du in die Prozessor-Geschichte 
stecken willst, aber wenn dein Datenlogger irgendwie Zugang zum Netz 
hätte, dann könntest alle paar Minuten eine Textdatei auf irgendeinem 
Netzlaufwerk (oder sogar Webspace) per FTP mit deinen gesammelten 
Messwerten aktualisieren..

von B. S. (bestucki)


Lesenswert?

Ja, meine "Rechnung" ist schlecht. Ich wollte damit sagen, dass ich 2M 
Blöcke zur Verfügung habe und diese so nicht für einen Monat reichen 
werden.

Jochen schrieb:
> Wieso kannst du nicht einen Block in dem Ram deines Controllers
> "sammeln" und dann in einem Rutsch schreiben?
be stucki schrieb:
> Im schlimmsten Fall (4 Bytes jede Stunde) dauert es 128 Stunden bis
> genug Daten gesammelt wurden, um einen Block zu füllen. Dabei ist mir
> das Risiko zu hoch, dass in der Zwischenzeit die Daten verloren gehen.

A0 S0 schrieb:
> Demnach käme man mit einer 2GB Karte sogar noch ohne SDHC aus
> und könnte jede Sekunde deine maximal 18 Bytes speichern
Ja das stimmt, ist zwar die reinste Speicherverschwendung aber so würde 
es gehen.

H.joachim Seifert schrieb:
> Falls dir das nicht sicher genug ist (Versorgungsausfälle) kann man die
> auch mit einer kleinen Batterie stützen. Oder auch grössere Datenmengen
> als 512Byte in einem externen Speicher sammeln (batteriegestützer
> SPI/I2C-RAM oder gleich einen FRAM.
be stucki schrieb:
> Ich hatte die Idee, während dieser Zeit die Daten in einem
> nichtflüchtigen RAM (gepuffertes SRAM oder FRAM) zu sichern.

Schlumpf schrieb:
> aber wenn dein Datenlogger irgendwie Zugang zum Netz hätte
Hat er nicht und wird auch nicht möglich sein, da auch ein mobiler 
Einsatz möglich sein soll. Ausgelesen wird er über eine 
USB-Schnittstelle oder wenn eine SD-Karte verwendet wird, nur diese 
ausgetauscht.

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

ich setze seit vielen Jahren statische RAMs mit Batterie ein, 
Zuverlässigkeitsprobleme gibt es keine. Ich habe zwar schon 
Speicherkarten zurückbekommen, die wegen leerer Lithium-Batterie oder 
nicht mehr ladbarem Akku defekt waren - aber die waren mehr als 20 Jahre 
im Einsatz.

Das geht sowohl allein damit oder als Puffer, bis ins Flash geschrieben 
wird.

Gruss Reinhard

von Praktiker (Gast)


Lesenswert?

be stucki schrieb:
> Gute und günstige Lösung. Hat jedoch den Nachteil, dass nur Blöcke von
> 512 Bytes geschrieben werden können. Im schlimmsten Fall (4 Bytes jede
> Stunde) dauert es 128 Stunden bis genug Daten gesammelt wurden, um einen
> Block zu füllen.

Wo ist das Problem? Warum sammelst du die Daten nicht in der Karte. Dann 
schreibst du den 512 Byte Block jedes mal neu, wenn 4 Byte dazukommen. 
Wenn du die SD-Karte 5 Jahre im Dauereinsatz hattest, tauscht du sie 
einfach aus. Die Kosten sind erheblich geringer, als 1/4-Stunde 
zusätzlicher Entwicklungsaufwand.

p.s. Warum mißt du eigentlich so selten. Oft ist es günstiger mit 
höherer Rate aufzuzeichnen und hinterher die Daten durch ein Filter zu 
jagen (falls aufeinanderfolgende Punkte irgendetwas miteinander zu tun 
haben)

von Chris (Gast)


Lesenswert?

Ich benutze gerne SPI Flash/Sram/Fram als Software Implementation und 
eine
SD-Karte am HW-USI/SPI Port und kopiere dann die Daten von einem 
Speicher
in den anderen.

von Christian B. (casandro)


Lesenswert?

Wenn Du wirklich nur so wenige Daten hast, kannst Du die auch einfach 
im Flash des Mikrocontrollers speichern. Zur Not speicherst Du die 
einzelnen Bytes erst mal im EEPROM und kopierst die dann in den Flash.

Oder Du versorgst Den Mikrocontroller einfach über einen Elko. Der hält 
noch genügend Spannung auch wenn der Mikrocontoller nicht mehr läuft.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Es gibt doch GoldCaps. Daher würde ich die 512Bytes einfach in das RAM 
des Controllers schreiben. Bei Stromausfall überlebt der Controller und 
sein RAM durch die gespeicherte Energie im GoldCap. Wenn der Controller 
im Sleep ist (1µA) kann er an 1F 2 Wochen überleben, bevor die Daten 
flöten gehen. Sollte reichen. Also SD-Karte dran und gut ist.

von spess53 (Gast)


Lesenswert?

Hi

>Hat jedoch den Nachteil, dass nur Blöcke von
>512 Bytes geschrieben werden können. Im schlimmsten Fall (4 Bytes jede
>Stunde) dauert es 128 Stunden bis genug Daten gesammelt wurden, um einen
>Block zu füllen.

Also bei mir sind das 128 Sekunden.

MfG Spess

von Bernd (Gast)


Lesenswert?

spess53 schrieb:
> Im schlimmsten Fall (4 Bytes jede
>>Stunde) dauert es 128 Stunden bis genug Daten gesammelt wurden, um einen
>>Block zu füllen.
>
> Also bei mir sind das 128 Sekunden.
>
> MfG Spess

bei mir sind es 128h

von Higg G. (higg)


Lesenswert?

>Im schlimmsten Fall (4 Bytes jede
>Stunde) dauert es 128 Stunden bis genug Daten gesammelt wurden, um einen
>Block zu füllen.

Sammle die Daten im RAM des Controllers, und spätestens nach einer 
vorgegebenen Zeit schreibst du sie auf die Karte, egal wie viel bisher 
zusammengekommen ist. Die Zeitspanne musst du halt wählen und sollte 
nicht bei 1 Sekunde sonder eher im Minuten oder Stundenbereich sein. Die 
restlichen Bytes des 512er Blocks ignorierst du dann einfach. Dann
a) reichen 1GB ewig
b) wirst du lange brauchen um die sd-karte zu schrotten. und wenn doch 
-> ne neue rein
c) wirst du am schnellsten zum Ziel kommen

von Tach (Gast)


Lesenswert?

Wie wäre es mit einem uC der die 512Byte im RAM noch übrig hat.
Zusätzlich ne Pufferbatterie wo diesen bei Ausfall der 
Versorgugnsspannung stützt.
Er müsste dann nur erkennen dass die Versorgungsspannung weggebrochen 
ist, die Daten auf die SD-Karte schreiben und dann geht er in den 
Deep-Sleep-Mode o.ä....

von Pete K. (pete77)


Lesenswert?

Um welche Anwendung handelt es sich, wo jede Sekunde sich ein Messwert 
signifikant ändert?

Denke auch daran, dass die Daten in irgendeiner Form weiterverarbeitet 
werden müssen.

Wäre wirklich schön, etwas über den Anwendungsfall zu wissen.

von amateur (Gast)


Lesenswert?

Spendier Deiner Lösung einen Hi-Cap, den Du zusätzlich noch überwachen 
kannst. Dann gibt es keinen "Stromausfall", notfalls kannst Du die eine, 
angefangene Seite, ja kurz vor dem Schlappmachen noch in die SD-Karte 
schubsen.
Eine SD-Karte würde ich Dir, in der Hauptsache, aus den folgenden 
Gründen empfehlen:
1. Kostengründe.
2. Leichte Auslesbarkeit vom PC aus.
3. Ausreichende Speicherkapazität.
4. Fertige Bibliotheken für die meisten Vielfüsser.

von Pete K. (pete77)


Lesenswert?

Microchip hat auch serielles Flash mit bis zu 64MBit. Endurance 100000 
Zyklen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn Du einen µC mit FRAM verwendest, wie beispielsweise einen 
MSP430FR57xx, dann hast Du einerseits das Pegelanpassungsproblem für den 
Betrieb der SD-Karte nicht, und musst Dir andererseits keine Gedanken um 
irgendwelche Batteriepufferungen machen, so daß Du die Daten für einen 
Block der SD-Karte problemlos im "RAM" des µC sammeln kannst.

Du musst nur darauf achten, daß der Startup-Code den verwendeten 
Speicherblock nicht bei Reset initialisiert, und daß Du einen ebenso 
resetfesten Schreibzeiger auf diesen Speicherblock vorsiehst.

von Sam P. (Gast)


Lesenswert?

Man kann bei Flash einen Block durchaus mehrmals beschreiben, ohne ihn 
zwischendurch zu löschen. Man kann dabei aber nur 1-Bits zu 0-Bits 
machen, effektiv also nur unbeschriebene Bereiche überschreiben.

Als einfach einen Block nur einmal löschen und dann fleissig Bytes 
anhängen bis er voll ist. Problem gelöst.

von amateur (Gast)


Lesenswert?

@Sam

Stimmt, aber manche brauchen die Kombinationen: ...F, ...FF, ...FFF usw. 
und so.

von B. S. (bestucki)


Lesenswert?

Vielen Dank für die vielen Antworten! Ihr habt mir alle sehr 
weitergeholfen.

Sam P. schrieb:
> Man kann bei Flash einen Block durchaus mehrmals beschreiben, ohne ihn
> zwischendurch zu löschen. Man kann dabei aber nur 1-Bits zu 0-Bits
> machen, effektiv also nur unbeschriebene Bereiche überschreiben.
> Als einfach einen Block nur einmal löschen und dann fleissig Bytes
> anhängen bis er voll ist. Problem gelöst.
Dies ist wohl die einfachste Lösung. Das funktioniert mit der SD-Karte 
sicher auch, ohne dass die Lebenszeit der Karte allzusehr verkürzt wird, 
oder? Dass der restliche Speicher mit Einsen gefüllt ist, spielt keine 
Rolle, da die Datenblockgrösse jederzeit bekannt ist (aufgrund des 
Datenformats).


Kurz zum Anwendungsfall:

Einganswerte: 4x Temperatur, 2x analoger Eingang, 8x digitaler Eingang
Ausgangswerte: 4x Relaisausgang, 4x Trasistorausgang (OC)
Welche Signale aufgezeichnet werden sollen, kann konfiguriert werden. 
Der Zustand der Ausgangswerte kann in Abhängigkeit der Eingangswerte 
konfiguriert werden.

Diese Werte (und ein Fehlercode, wenn dann ein Fehler auftritt) werden 
alle aufgezeichnet. Es sind folgende Aufzeichnungsmodi vorgesehen:
- Jeder Wert wird nach ??s aufgezeichnet
- Die Werte werden nur aufgezeichnet, wenn sie sich um einen bestimmten 
Wert geändert haben.
- Wenn der Wert während ??s nicht aufgezeichnet wurde, wird er 
aufgezeichnet.
Diese Modi sind frei konfigurierbar und können miteinander kombiniert 
werden.

Das ganze wird erweiterbar aufgegleist, so dass später weitere Signale 
oder auch Schnittstellen aufgezeichnet werden können. Dabei möchte ich 
bei der Speichergrösse natürlich eine Reserve haben. Zudem könnte es 
sein, dass die kleinste Zeiteinheit (aktuell 1s) heruntergesetzt wird.

Das ganze dient dazu, um das thermische Verhalten von Hardware (später 
evt. auch Mechaniken) über eine längere Zeit zu loggen. Um nicht 
eingeschränkt zu sein, habe ich noch einige digitale und analoge 
Eingänge, sowie digitale Ausgänge, die z.B. eine Hardware ausschalten 
wenn sie zu warm wird, hinzugefügt. Dass die Temperatur dabei sehr 
dynamisch als auch statisch sein kann, brauche ich wohl nicht zu 
erwähnen.

von B. S. (bestucki)


Lesenswert?

Das Projekt hat nun eine Weile geruht, nun gehts weiter. Ich habe mich 
für eine Kombination aus SD-Karte und einem FRAM entschieden. Dies aus 
dem Grund, weil noch andere Informationen dauerhaft gespeichert werden 
müssen, sich aber relativ häufig ändern können (ca. 300 - 400 Bytes). 
Ausserdem ist der Schaltungsaufwand minimal. Ich werde den FM24C16B-G 
von Ramtron verwenden (2kB, I2C, 5V).

von Tim R. (mugen)


Lesenswert?

Ich persönlich würde das verwenden was gut auf dem Markt vorhanden ist 
und keinesfalls eine Sonderlösung darstellt. Schau dir mal das serielle 
Flash SST25VF064C von Microchip an. Ist preislich sehr interessant und 
ist sogar bei Reichelt erhältlich:

SST25VF064C

von B. S. (bestucki)


Lesenswert?

> Ich persönlich würde das verwenden was gut auf dem Markt vorhanden ist
> und keinesfalls eine Sonderlösung darstellt
Es werden ca. 3 - 4 Schaltungen hergestellt. Daher ist das egal.

> Schau dir mal das serielle
> Flash SST25VF064C von Microchip an. Ist preislich sehr interessant und
> ist sogar bei Reichelt erhältlich:
Ich benötige min. 45MB, dein Bautsein hat 8MB, also müsse ich 6 ICs 
verwenden. Kosten aber bei Farnell 5.20CHF/Stück. Bei Reichelt in die 
Schweiz bestellen ist auch nicht gerade günstig. Zum Vergleich: Eine 
32GB SD-Karte kostet ca. 40CHF.

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.