Auf mit einem atmega128 will ich Daten loggen und auf eine SD-Karte speichern. Das FAT32-Projekt, welches hier auf der Homepage zum Download bereit steht, habe ich bereits erfolgreich getestet. Nun zu meinem Problem. Der Logger empfängt permanent Daten, soll jedoch nicht alle Daten mittlogen. Es wird ein Triggersignal ausgelöst und jetzt sollen alle Daten ab dem Zeitpunkt 15 min vor Triggersignal bis Triggersignal auf die Karte geloggt werden. Die lässt sich recht einfach mit einem Ringspeicher lösen, das Problem ist jedoch, dass der interes Speicher des Atmegas nicht ausreichend groß ist. Meine Idee ist daher, die Log-Datei als Ringspeicher zu missbrauchen. Das soll stell ich mir ungefähr so vor: Der Logger wird gestartet, die Daten werden auf der SD-Karte Zeile für Zeile gespeichert. Nach 15Min wird nun die erste Zeile gelöscht und in der letzten Zeile die neuen Daten angehängt. So habe ich immer die letzten 15Min in meinem Log-File und beim Triggerevent wird einfach die Datei geschlossen. Ich habe mir zwar schon einige Funktionen aus dem Projekt angeschaut und einiges ausprobiert, bin bis jetzt aber noch nicht weiter gekommen. Gibt es irgendwo die Möglichkeit den Dateianfang festzulegen
Hallo, da muss der Logger in die Zukunft sehen können :) > ...jetzt sollen alle Daten ab dem > Zeitpunkt 15 min vor Triggersignal.. Wieviele Daten fallen denn an?
Ich würde nicht auf FAT-Level runter gehen! Einfach eine Datei erzeugen, die groß genug ist für die 15Min. SD formatieren und diese Datei als erstes drauf kopieren. Dann ist sie 100% in aufeinander folgenden Sektoren. Dann braucht man nur noch auf die Sektoren zugreifen. Ein Sektor wird immer im RAM aufgefüllt mit den Messwerten. Ist er voll, dann wird er gespeichert. Die Sektoradresse geht dann also immer rundum. Man muss weder File öffnen, noch schließen. Lediglich den aktuellen Startsektor muss man sich noch merken. Vielleicht im 1. Sektor, der dann nicht mehr mit Messwerten überschrieben wird.
Der ATMega128 ist in der Lage, externes RAM bis 60k anzusprechen. Papp einfach eins dran.
Sofern möglich würde ich mit 3 Dateien arbeiten: Datei 1 und 2 werden nacheinander mit jeweils 15 Min befüllt. Wenn 2 voll ist, wird 1 gelöscht und neu begonnen. Das wird bis zum Triggerimpuls wiederholt. Die Daten sind dann in der kleineren Datei + das Ende der Größeren. In Datei 3 werden die 15 Min nach dem Triggerimuls gespeichert. Vorteil: Das funktioniert auch mit großen Datenmengen und fragmentierter Speicherkarte Nachteil: Eine gewisse "Nachbearbeitung" ist notwendig, die Daten sollten syncron aufgezeichnet werden um exakt 15 min erkennen zu können
Ich weiß, dass die Idee gut ist ;o) Ich hab mir so ein paar Funktionen erstellt, mit denen ein swap-File nicht mehr per FAT benutzt wird. Es funktioniert einfach über Adressen. Aus der Adresse wird der Sektor errechnet (Adresse >> 9) und der Sektor wird geladen. Der Zugriff ist auf diese Weise erheblich schneller, als über die normalen Funktionen mit FAT Unterstützung, die ja immer auch in Directory und Cluster-Tabellen rumwerkeln müssen. Das umkopieren in eine andere Datei (diesmal mit FAT funktionen) geht ja auch bei dem Ansatz.
Klingt gut. Zu beachten ist aber immer, dass es sich um Flash Speicher handelt, dieser ist nicht unendlich oft beschreibbar. Wenn man immer auf den gleichen Sektoren rumschreibt, ist man darauf angewiesen, dass der Hersteller der Karte ordentliche Trennung von physikalischen und logischen Sektoren macht (weare-leveling)...
Auch das ist einfach zu umgehen. Man macht einfach die swap-datei so groß wie möglich und begrenzt sie nicht auf die hier eigentlich nur benötigten 15min (wie groß/klein das auch immer sein mag). Damit läuft der Ringbuffer erst mal durch z.B. 1GB bevor er wieder mit dem ersten Sektor anfängt.
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.