Forum: Mikrocontroller und Digitale Elektronik Strategie zum Langzeit-Loggen


von Rölf (Gast)


Lesenswert?

nabend Leute..

Ich hätte da gerne ein Problem:

Es sind die Laufzeiten zweier Motoren zu loggen. Man will also wissen
wann und wie lange jeder Motor lief, wenn man später die geloggten
Daten abruft.

Ich hatte mir das so gedacht:
Der AVR hängt an einem PC per USART. Man könnte natürlich den PC alles
aufzeichnen lassen, dieser wird jedoch abends ausgeschalten. Daher will
ich alles auf einem DataFlash ablegen. Da die Uhrzeiten relevant sind,
muss auf dem PC die aktuelle Zeit abgespeichert werden, sobald man das
Commando "Logge ab jetzt" zum AVR sendet und dieser autonom
weitermacht.

Da es 2 Motoren sind gibt es für jeden Motor den Zustand Ein(1) und
Aus(0). ALso 2 Bit die man jeweils mit einer Zeit zusammen speichert.
Meines Wissens ist es wohl nur möglich die vom "Logge ab
jetzt"-Zeitpunkt abgelaufenen Sekunden (per Interupt Overflow) in ein
Register hochzuzählen und immer wenn einer der beiden Pumpen den Status
wechselt, sich die Sekunden im Register zusammen mit den Stati der
beiden Pumpen in sagen wie 2 oder 3 Bytes des DataFlash zu legen.
D.h. bei 3 Byte: 2 Bit Pumpen + 22 Bit Zeitinformation (abgelaufene
Sekunden). Mit 22 Bit kommt man also auf 4194303 Sekunden = 48 Tage
maximaler Zeit. Das reicht. Bis dahin soll man mal die Daten abgerufen
haben.
Die weitere Begrenzung ist dann nur vom DataFlash abhängig, aber schon
bei 1MBit kommt man auf:
131072 Byte, also 43690 Byte-Trippel. Wenn ca. 20 mal pro Tag ein
Pumpenstatuswechsel auftritt sind das:
43690/20 = 2184 Tage die man auskommt.

Wenn man die Daten dann abruft, muss sich mein VB-Programm "nur"
darum kümmern, aus den Sekunden auf die Uhrzeiten zurückzurechnen, da
man den Anfangszeitpunkt (mit Datum) ja vorher gespeichert hat.

Das ist so meim Plan sowas zu machen. Ich poste das hier, falls ich
irgendwo groben Mist gemacht habe und mich vielleicht jemand drauf
hinweist.

Evtl. kann man das ja auch bisschen anders lösen? Bin gespannt!

Danke schonmal!

von Karl H. (kbuchegg)


Lesenswert?

> Da die Uhrzeiten relevant sind,
> muss auf dem PC die aktuelle Zeit abgespeichert werden,
> sobald man das Commando "Logge ab jetzt" zum AVR

Würde ich nicht am PC speichern, sondern ebenfalls im AVR

Du hast eine irre Diskrepanz zwischen dem was dein
Datenformat hergibt (48 Tage) und dem was du theoretisch
speichern könntest (2100 Tage). Überleg mal, ob es nicht
einfacher wäre, das ganze Gesocks mit Anfangsdatum + Sekunden
dur eine ganz banale Uhr (TT:MM:YYYY::HH::MM:SS) zu ersetzen
und das auch so zu speichern. Eine Uhr hochzuzählen ist
trivial, die nachträgliche Rechnerei um auf die Daten zu
kommen hingegen ist mehr Aufwand. Den Platz im Speicher
dürftest du ja haben.

von Rahul (Gast)


Lesenswert?

Passt schon.
In meinem Datenlogger schreibe ich ganz am Anfang das Datum und die
Uhrzeit (die der Controller selbst "unterhält").
Du mußt eigentlich nur überwachen, ob deine 22 Bit irgendwann man voll
sind...

von Dirk (Gast)


Lesenswert?

Hi,

du solltest aehnlich wie bei einem Logic Analyzer die Daten
kompremieren.

Timestamp's zum Beispiel nur bei Aenderungen speichern / merkern. Es
gibt verschiedene gute Algorythmen fuer soetwas.

Gruß,
Dirk

von Unbekannter (Gast)


Lesenswert?

Du kannst das auch etwas abwandeln, wenn Du länger speichern willst.

Anstatt drei Bytes, also 22 Bits Zeit und 2 Bits zustand, verwendest Du
2 Bytes, also 14 Bits Zeit und 2 Bits Zustand.

Mit 14 Sekunden-Bits ist die maximale Zeitspanne rund 4 1/2 Stunden. Da
sich der Zustand aber 20 mal am Tag ändert ist die mittlere Zeitspanne
nur ca. 1 Stunde.

Wenn jetzt aber die Zeitspanne zwischen zwei Ereignissen länger als 4,5
Stunden sein sollte, machst Du einfach nach dem Overflow nach 4,5
Stunden einen neuen Eintrag, der exakt gleich ist wie der erste.

Die Anzahl der gleichen Datenblöcke minus 1, gibt also die Dauer in 4,5
Stunden-Abschnitte an. Wenn also keine Veränderungen auftreten, brauchst
Du pro Tag 5,2 Datenpakete, also kannst Du maximal rund 34 Jahre ohne
eine Ereignissänderung aufnehmen, oder rund 9 Jahre mit 20 Änderungen
am Tag.

von Unbekannter (Gast)


Lesenswert?

Achso, wenn Dir das mit dem absoluten Timestamp und Overflow zu
kompliziert ist, kann der Timestamp in einem Ereigniss auch immer nur
die verstrichene Zeit seit dem letzten Ereignis speichern. Also immer
wenn Du ein Datenpaket in das Flash gespeichert hast, wird die interne
Uhr wieder auf Null gesetzt. Bevor ein Überlauf statt findet wird eben
das entsprechende Datenpaket gespeicher und die Uhr wieder auf Null
gesetzt.

So ist die Auswertung vermutlich einfacher. Aber das Prinzip sollte
klar sein.

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.