Hi, ich interessiere mich für generelle Lösungsmöglichkeiten der
Bereitstellung einer Uhrzeit auf Mikrocontrollern. Ich habe sehr wenig
zu diesem Thema gefunden, obwohl es doch eigentlich eins ehr häufig
auftretendes Problem sein sollte. Mich würde interessieren, wie euere
Lösungsansätze sind.
Folgende Möglichkeiten habe ich recherchiert:
- Auswertung des Zeitsignals mittels DCF-Hardware
- Implementierung einer Uhr in Software mittels Timer-Interrupts
Wie löst ihr das Problem? Soweit ich weiß gibt es auch keine Uhr unter
FreeRTOS oder??
@ tm (Gast)
>Bereitstellung einer Uhrzeit auf Mikrocontrollern. Ich habe sehr wenig>zu diesem Thema gefunden,
Dann hast du schlecht gesucht.
AVR - Die genaue Sekunde / RTC
Danke mal für den Link! Da habe ich mich vermutlich etwas schlecht
ausgedrückt. Ich suche eigentlich eine reine Softwarelösung. Ist sowas
überhaupt ratsam wenn man ne einigermaßen gescheite Uhr braucht? Also
mit Softwarelösung meine ich anhand der Taktfrequenz berechnen wie oft
ein Timerinterrupt ausgelöst wird, um dort dann die Sekunden zu zählen.
tm schrieb:> Ich suche eigentlich eine reine Softwarelösung.
Hm. So ganz ohne Mikrocontroller, nur Software? Das wird schwierig.
Also lies den link nochmal richtig bis zum Ende. Mit weniger Hardware
als einem Mikrocontroller und einem Quarz geht es nun mal nicht.
Oliver
tm schrieb:> Also> mit Softwarelösung meine ich anhand der Taktfrequenz berechnen wie oft> ein Timerinterrupt ausgelöst wird, um dort dann die Sekunden zu zählen.
Hi, tm,
wenn das Dein Lastenheft ist, dann würde ich für mein Pflichtenheft,
meine Zusage, was ich erreichen könnte, noch fragen:
1. Ist eine Anbindung des errechneten oder vorbestimmten Zeitpunkts an
UTC oder eine andere genormte Zeitskala notwendig?
2. Wenn ja, wie groß darf der Fehler werden?
Momentan denke ich an
a) einen internen Teiler an einem Quarzgenerator. Ggf. ein Quarzofen.
b) eine Anbindung über DCF oder GPS.
c) Ggf Ermittlung der Differenzen zwischen Quarz und UTC und deren
Berücksichtigung.
Ciao
Wolfgang Horn
Die Genauigkeit der SW-Lösung mit Timerinterrupt ist nur vom Quarz
abhängig.
Typische MC-Quarze sind aber ab Werk nicht so genau, wie Uhrenquarze,
dafür aber hoch konstant.
Man muß also die Frequenz mit einem genauen Frequenzmesser messen und
diesen Wert in die Rechnung im Interrupt eintragen. Dann erreicht man
wenige Sekunden pro Jahr.
Alternativ die Uhr mehrere Wochen laufen lassen und aus der Abweichung
in Sekunden den genauen Wert errechnen.
Die Berechnung könnte auch die Software machen. Man stellt die Uhr
einmal und dann nach mehreren Wochen ein zweites mal. Aus der Abweichung
beim 2. Stellen berechnet dann die SW den Korrekturwert.
Ist ein Stromausfall zu überbrücken, erlauben viele MCs den Anschluß
eines Uhrenquarzes (32kHz). Dann brauchen sie zum Zeit zählen nur wenige
µA, d.h. mit einem Goldcap 1F lassen sich einige Wochen überbrücken.
Peter
Danke für Euere Antworten,
@Wolfgang:
Eine Anbindung an eine externe Zeitskale (UTC) ist gewünscht. Der Fehler
einer Uhr summiert sich ja ständig auf. Daher sollte ich mir Gedanken
machen welche Gangabweichung auf welchen Zeitraum ich mindestens
erreichen möchte. Nur einige Sekunden pro Tag wären großartig. Im Moment
erreiche ich mit einem Timerinterrupt nur etwa acht Minuten pro 12
Stunden. Das könnte mit der Quarzgenauigkeit zu tun haben.
@Peter:
> Typische MC-Quarze sind aber ab Werk nicht so genau, wie Uhrenquarze,
dafür aber hoch konstant.
Was meinst du mit "genau", wenn nicht "konstant"? Vermutlich dass sie in
einer anderen Frequenz schwingen als eingestellt oder? Wenn ja bezieht
sich diese Abweichung auf meine SW-seitige Einstellung oder schon auf
den Quarz selbst, dass er z.B. nicht mit 12,000MHz schwingt wie
angegeben sondern mit 12,345Mhz?
> Alternativ die Uhr mehrere Wochen laufen lassen und aus der Abweichung
in Sekunden den genauen Wert errechnen.
Ich habe meinen Timerinterrupt 15h laufen lassen und eine Gangabweichung
von -8,73ms/Sekunde ermittelt. (Wenn ich annehme dass meine Referenzuhr
genau ging). Wie müsste ich jetzt diesen Wert einrechnen? Wäre es
möglich pro Timerinterrupt einen Korrekturwert darauf zu addieren? Weil
eigentlich müsste das dann aufgrund von Rundungsfehlern etc immernoch
wegdriften oder?
> Die Berechnung könnte auch die Software machen. Man stellt die Uhr
einmal und dann nach mehreren Wochen ein zweites mal. Aus der Abweichung
beim 2. Stellen berechnet dann die SW den Korrekturwert.
Das klingt sehr interessant, ich habe gehört dass die Quarze
insbesondere bei großen Temperaturunterschieden ihr Schwingungsverhalten
verändern können. Da wäre so eine dynamische Berechnung des
Korrekturwertes schon sinnvoll.
tm schrieb:> erreichen möchte. Nur einige Sekunden pro Tag wären großartig. Im Moment> erreiche ich mit einem Timerinterrupt nur etwa acht Minuten pro 12> Stunden. Das könnte mit der Quarzgenauigkeit zu tun haben.
Das sind 0.5%
Für einen Quarz ist das zuviel.
Das weißt auf einen Softwarefehler hin
> Vermutlich dass sie in> einer anderen Frequenz schwingen als eingestellt oder?
Exakt.
Allerdings halten sie dann diese falsche Frequenz einigermassen
konstant.
> den Quarz selbst, dass er z.B. nicht mit 12,000MHz schwingt wie> angegeben sondern mit 12,345Mhz?
Der Quarz selber.
Allerdings ist die Abweichung nicht so gross.
Das sind ein paar hundert Herz bei 12Mhz
Sonst könnte man ja auch gleich einen SChätzprügel anstelle des Quarzes
nehmen
tm schrieb:> Ich habe meinen Timerinterrupt 15h laufen lassen und eine Gangabweichung> von -8,73ms/Sekunde ermittelt. (Wenn ich annehme dass meine Referenzuhr> genau ging). Wie müsste ich jetzt diesen Wert einrechnen?
Du rechnest dir aus, wieviele Sekunden dein Testzeitraum tatsächlich
umfasst, wieviele deine Uhe gezählt hat und daraus kannst du dann
ausrechnen, wie schnell dein Quarz wirklich schwingt. Und damit rechnet
man dann die Teilerkette noch einmal neu durch.
> eigentlich müsste das dann aufgrund von Rundungsfehlern etc immernoch> wegdriften oder?
Du willst dein Programm so umändern, dass sich keine Rundungsfehler
aufsummieren.
Details dazu finden sich im weiter oben verlinkten Artikel.
Einfach mal lesen und darüber nachdenken was du da gelesen hast und was
das alles bedeutet.
> Das klingt sehr interessant, ich habe gehört dass die Quarze> insbesondere bei großen Temperaturunterschieden ihr Schwingungsverhalten> verändern können. Da wäre so eine dynamische Berechnung des> Korrekturwertes schon sinnvoll.
Da wird gar nichts dynamisch nachgestellt.
In einem normalen Wohnraum ändert sich die Temperatur nicht so dermassen
dramatisch, dass das gross ins Gewicht fallen würde. Mit einem
Mittelwert aus ein paar Tagperioden und ein paar Nachtperioden bist du
gut dabei. VOn Zeit zu Zeit wird man die Uhr neu einstellen müssen.
Wobei Zeit zu Zeit sich in der Größenordnung von Monaten bewegt. Für den
Hausgebrauch gut genug.
tm schrieb:> Nur einige Sekunden pro Tag wären großartig.
Hi, tm,
einige Sekunden pro Tag?
Pro Tag 86400 Sekunden, Quarz mit einem Temperaturkoeffizienten von
10e-7 sind billige Handelsware.
Einige Sekunden pro Tag, das ist Frage des Abgleichs und der
Kalibrierung.
Bei meinem Atmega würde ich den Timer2 benutzen in seiner Funktion als
asynchronen Uhrenzähler. Der läuft sogar weiter, wenn Du den gnazen
Prozessor in Power Down schaltest.
Ciao
Wolfgang Horn