Forum: Mikrocontroller und Digitale Elektronik Arduino - Serial Logging - Datenverlust während der Speicherung


von Ben Z. (mrben)


Lesenswert?

Guten Morgen und ein frohes neues Jahr,
ich möchte für eine offline Datenauswertung die Daten einer IMU mit 
einer hohen Frequenz (10 ms) abtasten und auf einer SD-Karte speichern.
Dafür schicke ich die Daten von einem Arduino Due über den seriellen Bus 
alle 10 ms einen String an einen Arduino Uno.

Am Arduino Uno ist das SD-Modul angeschlossen. Der Uno puffert immer 512 
Byte und speichert den Datenblock auf der SD-Karte sobald genügend Daten 
gesammelt sind.

Mein Problem ist, dass die Speicherung ca. 1 Sekunde dauert und in 
dieser Zeit die Daten verloren gehen.
Bisher habe ich keine sinnvolle Variante gefunden in dieser Zeit die 
Daten weiter zu puffern um den Datenverlust zu vermeiden.
Welche Möglichkeiten habe ich?

Vielen Dank und beste Grüße
Ben

von Axel S. (a-za-z0-9)


Lesenswert?

Ben Z. schrieb:
> Mein Problem ist, dass die Speicherung ca. 1 Sekunde dauert und in
> dieser Zeit die Daten verloren gehen.

Dann stellst du dich wohl ungeschickt an.

> Welche Möglichkeiten habe ich?

Lern (richtig) programmieren. Der UART kann einen Interrupt 
auslösen, wenn ein neues Zeichen angekommen ist. Und im 
Interrupt-Handler kann man dieses Zeichen abholen und in den Buffer 
legen. Auch wenn die SD Karte gerade Daten wegschreibt.

von Falk B. (falk)


Lesenswert?

Ben Z. schrieb:
> Guten Morgen und ein frohes neues Jahr,
> ich möchte für eine offline Datenauswertung die Daten einer IMU mit
> einer hohen Frequenz (10 ms) abtasten

Das ist eher langsam.

> und auf einer SD-Karte speichern.
> Dafür schicke ich die Daten von einem Arduino Due über den seriellen Bus
> alle 10 ms einen String an einen Arduino Uno.

Das ist Käse. Sowas macht EIN AVR/Adruino locker.

> Am Arduino Uno ist das SD-Modul angeschlossen. Der Uno puffert immer 512
> Byte und speichert den Datenblock auf der SD-Karte sobald genügend Daten
> gesammelt sind.

Das kann ein Arduino allein, ert Recht ein Due mit seiner 32 Bit CPU. 
Das vereinfaht das Ganze zusätzlich.

> Mein Problem ist, dass die Speicherung ca. 1 Sekunde dauert und in
> dieser Zeit die Daten verloren gehen.

Dann machst du massiv was falsch.

> Bisher habe ich keine sinnvolle Variante gefunden in dieser Zeit die
> Daten weiter zu puffern um den Datenverlust zu vermeiden.
> Welche Möglichkeiten habe ich?

Man braucht so oder so einen FIFO. Die Datenerfassung muss in einem 
Interrupt erfogen, denn der wird mit Priorität ausgeführt. Das Speichern 
auf SD-Karte erfolgt mittels periodischem Aufruf in der Hauptschleife, 
welche aber problemlos durch den Interrupt unterbrochen werden kann.
Ich hab mal einen DMX512 Rekorder/Player gebaut, der hat mit 22kB/s 
gelesen/geschrieben und nebenbei den DMX512 Datenstrom erzeugt bzw. 
gelesen. VOn diesen Datenraten bist du WEIT entfernt. Und das war nur 
ein kleiner AVR mit 16 MHz + externer SRAM.

von Zoidberg (Gast)


Lesenswert?

Um dem Prozess des Lernens auf die Sprünge zu helfen:

Ja, das Stichwort FIFO im irq befüllen musst du dir angucken. In dem 
Fall vielleicht nicht mal einen Ringspeicher sondern ein ping-pong 
Buffer für die 512 Byte. Wenn dein Sektor zum wegschreiben voll ist 
umschalten auf einen zweiten und da die Daten rein, den alten an die 
Karte.
So ein Konzept ist sowiso unerlässlich und da solltest du dich 
reinwühlen.


Eine Sekunde ist wirklich lange. Du musst deine Datei ja nicht jedesmal 
neu auf der Karte suchen, öffnen und schließen. Merk dir den Handle und 
mache ein file.flush() nach dem speichern.


Funktioniert dein SD-Modul denn nicht am due? Warum die die Daten noch 
mal verschickst verstehe ich nämlich auch nicht so ganz.

von Axel S. (a-za-z0-9)


Lesenswert?

Zoidberg schrieb:
> Funktioniert dein SD-Modul denn nicht am due? Warum die die Daten noch
> mal verschickst verstehe ich nämlich auch nicht so ganz.

Das ist ein vergleichsweise unwichtiges Detail. Ich gehe mal davon aus, 
daß er das ganze Arduino-Style programmiert hat mit einer Schleife, in 
der er den UART pollt und wenn der Buffer auf die Karte geschrieben 
wird, die Schleife so lange stalled, daß der UART überläuft. Klassischer 
Anfängerfehler, wenn man noch nie von Interrupts gehört hat.

Das Problem hätte er mit dieser Art "Programmierung" genauso, wenn die 
SD-Karte direkt am Due hinge.

von Zoidberg (Gast)


Lesenswert?

Das kann sein. Ich glaube das ist aber auch mit verhälnismäßig wenig 
gebashe geklärt worden.

Wenn du eine FIFO-Klasse hast, könnte man die natürlich für die 
Messwerte/ADC Daten benutzen. Das kann man sich ja auch in 512 Byte 
Blöcke geteilt vorstellen.
Oder halt Zeichenweise in einen Schreibpuffer packen. Ggf. wartet deine 
Klasse ja auch selber bis ein Sektor voll ist mit wegschreiben wenn 
nicht geschlossen wird.
Ich weiß nur nicht ob die Arduino Klasse das macht, da müsste jemand 
anderes etwas zu sagen.

Es ist manchmal lehrreich, sich in die Gedanken und Probleme von 
jemandem ohne Vorbelastung zu versetzen.

Dafür sind natürlich Feedback und Gegenfragen vom TO hilfreich.

von Falk B. (falk)


Lesenswert?

Beitrag "Re: Arduino Nano, SD Card, PCM"

Das ist zwar "nur" Lesen, zeigt aber, was auch normaler Arduino-Style 
alles kann. Beim Schreiben ist es im Prinzip das Gleiche, allerdings hat 
man da bei SD-Karten das Problem, daß die ab und zu mal einige hundert 
Millisekunden eine Pause machen dürfen, wenn sie Sektoren löschen etc. 
Dann braucht man für diese Zeit einen ausreichend großen FIFO.

von Ben Z. (mrben)


Lesenswert?

Guten Abend zusammen,
erstmal vielen Dank für die konstruktiven Beiträge.
Ich habe meine Hausaufgaben gemacht und programmieren gelernt ;)

Ich habe den Abruf der seriellen Daten als Interrupt umgesetzt und einen 
Ringspeicher eingebaut. Jetzt verliere ich auch keine Daten mehr.

Anschließend habe ich auch noch die Variante ausprobiert nur den Arduino 
Due zu verwenden. und wie hier richtig vermutet wurde klappt das 
reibungslos.
Als ich mich entschlossen hatte einen zweiten Arduino zu verwenden, habe 
ich noch eine Library ohne Datenpuffer verwendet. Jetzt verwende ich 
eine alternative Library (SDFat) die selbstständig puffert.

Vielen Dank für die Hilfe!

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.