www.mikrocontroller.net

Forum: Compiler & IDEs Problematik der Zeitermittlung auf dem Mikrocontroller


Autor: tm (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: tm (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Wolfgang Horn (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: tm (Gast)
Datum:

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

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum keinen uC mit integrierter RTC verwenden? Alternativ gibt es 
externe RTC Bausteine...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Wolfgang Horn (Gast)
Datum:

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

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.