[vz-dev] Timestamp < Sekunde, durch AVR-NET-IO

ITechPro itech_pro at yahoo.de
Fri Dec 31 22:09:52 CET 2010


Hi,

obwohl ich kein Programmierer bin, mir aber das Thema von genaueren
Timestamps (Bruchteil einer Sekunde) durch das e6/AVR-NET-IO wichtig ist,
habe ich mir ein paar laienhafte Gedanken hierzu gemacht:

Was ich bisher in Erfahrung bringen konnte wird beim e6 das aktuelle
Datum in Sekunden seit dem 1.1.1970 00:00:00 UTC [1] in einer
vorzeichenbehafteten 32bit (uint32_t) Variablen vorgehalten, aus der
dann unser timestamp mit den genullten (000&value=) Millisekunden erzeugt
wird. Somit können hiermit sekundengenaue Zeitpunkte
vom 13.12.1901 20:45:52 UTC (negative Werte) bis
zum 19.01.2038 03:14:08 UTC aufgelöst werden.
(ohne Berücksichtigung von korrigierenden Schaltsekunden)

Um also für uns an dieser Stelle eine höhere zeitliche Auflösung zu
erreichen, sehe ich 2 Möglichkeiten:
1) größere Variable definieren und implementieren (64bit)
2) mit 32-Bit Variable kleineren Zeitraum höher aufgelöst erfassen

Nachdem ich nicht weiss ob 1) umsetzbar ist, habe ich mir zu 2)
Nachfolgendes überlegt:
Zeitpunkte in der Vergangenheit könnten wir komplett vernachlässigen.
Somit kann man 1 Bit durch Wegfall des Vorzeichens der Unix time
einsparen. Der dadurch darstellbarer Zeitraum verringert sich somit von
den Jahren 1901-2038 auf 1970-2038.
Ein weiteres Bit durch Halbierung des o.g. Zeitraums (2004-2038)
Ein Weiteres durch weitere Halbierung mit Verschiebung (2004-2021)
Somit könnten nach meinem Verständnis durch die 3 eingesparten Bits
zumindest 8-tel Sekunden (125ms) auflösbar sein, was für unsere Zwecke
wohl ausreichend wäre.

Durch eine weitere Einschränkung und Verschiebung des Zeitraumes
vom 12.04.2008 00:19:12 bis
zum 13.10.2016 21:43:28
könnten es möglicherweise sogar 16-tel Sekunden werden.

Die o.g. Anpassungen könnten resourcenschonend und performant durch
Bit-Operationen umsetzbar sein.

Voraussetzung für all dies ist natürlich die Genauigkeit der internen Uhr
des AVR-NET-IO. Derzeit wird diese nur im ~30min Intervall gegen einem
NTP-Server "gesteppt". Eine Korrektur/Anpassung z.B. über eine "drift"
Variable findet meines Wissens nicht statt. Gibt es hier Erfahrungswerte?

Abschließend müssten wir hierfür dann doch einen eigenen volkszähler fork
von e6 pflegen, da ich derzeit nicht annehme, das derartige Anpassungen/
Veränderungen in den Hauptzweig übernommen würden.

Neben diesen Ansätzen ist es vermutlich auch möglich den Bruchteil einer
Sekunde Anders zu ermitteln, aber darüber weiss ich leider noch weniger.

Habe ich hiermit vollkommenden Blödsinn verzapft, oder habt Ihr
irgendwelche Ideen/Anmerkungen/Korrekturen?

Gruß und einen guten Rutsch
Marcus

[1] http://en.wikipedia.org/wiki/Unix_time





More information about the volkszaehler-dev mailing list