www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit atmega128: Ringspeicher-Datei


Autor: FAT-Mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ATMega128 ist in der Lage, externes RAM bis 60k anzusprechen. Papp 
einfach eins dran.

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Idee von MagIO ist gut :)

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)...

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.