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!
> 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.
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...
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.