Forum: Projekte & Code [Bascom/AVR] Uhr und DCF


von Alex D. (allu)



Lesenswert?

Hallo,

anbei einige Codeschnipsel in Bascom für eine Uhr mit  Einstellung per 
DCF-Signal. Es 3 zusammengebaute Schnipsel: CTC-Timer, Uhr und DCF.

Der Quarz kann in weiten Bereichen frei gewählt werden, der Compiler 
berechnet daraus die 20msec-Einstellung für den CTC-Timer. Die nächste 
Stufe generiert daraus 1sec-Schritte.

Da ein Quarz am AVR, bezogen auf Uhrengenauigkeit, unzureichend ist, 
lässt sich das DCF-Programm auf dauernd  "Dcf_mode = _uhr_nachstellen" 
konfigurieren.

Wenn die Uhr  an einem TCXO  läuft, genügt einmal einstellen "Dcf_mode = 
_dcf_abschalten".
Die Sommer und Winterzeit-Umstellung wird  auch ohne DCF berücksichtigt.

Ist der Schalter "Testumschaltung" geschlossen, wird anstelle des Datums 
die Lange der DCF-Pulse  bezogen auf den Schwellwert angezeigt. Eine 
Pause wird mit einem "P" signalisiert. Die 0/1-Anzeige liegt optimal 
symmetrisch zu"<>". Mit "Dcf_bit_schwelle " lässt sich das verändern.
Zwei Empfänger habe ich getestet, einen uralten Conrad-Empfänger 
(Dcf_bit_schwelle = 42) und einen Pollin-Empfänger  (Dcf_bit_schwelle = 
43).

Pro Sekunde werden alle Teilstrings für eine LCD-Anzeige neu berechnet. 
Mit diesen lassen sich verschiedene Anzeigenformate nach Wunsch 
zusammensetzen. Die Bereitstellung alle Strings dauert bei 7,3728 Mhz 
nur 33µsec.

Uhr und DCF-Empfang verbrauchen im Schnitt weniger als 5msec pro 
Sekunde. Da bleibt noch jede Menge Zeit für das LCD und sonstiges.

Das "Hauptprogramm" ist nur zum Testen gedacht und grob gestrickt.

Gruss  Alex

von Paul B. (paul_baumann)


Lesenswert?

Alex D. schrieb:
> Da ein Quarz am AVR, bezogen auf Uhrengenauigkeit, unzureichend ist...

Hm, ich habe 2 Uhren mit jeweils 4MHz-Quarzen und Atmega8 bzw. 
Attiny2313.
Die sind so genau, daß ich nur Sommer/Winterzeit umstellen muß.

Vielleicht liegt die Ungenauigkeit in der Methode des Berechnens:
Const _irq_teiler_max = Int((_xtal * _irq_abstand /(1000000000)) + 0.5)

Hier kommt doch durch das 0.5 am Ende immer irgendetwas "Wackeliges"
heraus, oder täusche ich mich?

MfG Paul

von Alex D. (allu)


Lesenswert?

Paul Baumann schrieb:
> Hier kommt doch durch das 0.5 am Ende immer irgendetwas "Wackeliges"
> heraus, oder täusche ich mich?

Nein und ja, nicht jede Quarzferquenz ergibt ganzzahlige Teiler. Die 
+0,5 dient in Verbindung mit dem INT() dient zur Annäherung an den 
gewünschten Wert. Bei ständigem DCF-Berieb sollte das nicht stören.

Ich verwende einen 12,8MHz TCXO (ergibt einen ganzzahligen Wert) mit 
einmaliger Einstellung beim Einschalten.

Paul Baumann schrieb:
> Hm, ich habe 2 Uhren mit jeweils 4MHz-Quarzen

Hast Du die Quarze auf die richtige Frequenz nachgezogen oder ging das 
ohne? Bei mir war das nicht der Fall, ohne nachziehen ging die Uhr 
mehrere Sekunden am Tag falsch.

Gruss  Alex

von Paul B. (paul_baumann)


Lesenswert?

Alex D. schrieb:
> Hast Du die Quarze auf die richtige Frequenz nachgezogen oder ging das
> ohne?

Ich habe mir die heruntergeteilte Frequenz zum Messen mit einem 
Frequenzmesser auf einen Portpin ausgegeben und mit dem Wert für den
CTC-Modus bzw. dem Vorladewert für den Timer "gespielt", bis es
exakt stimmte.

Die eine Uhr habe ich nicht hier, m.E. ist da noch ein At90S2313 drin,
da ging glaube ich der CTC-Modus noch nicht zu nutzen und ich mußte
den Timer vorladen.

MfG Paul

von Alex D. (allu)


Lesenswert?

Paul Baumann schrieb:
> Ich habe mir die heruntergeteilte Frequenz zum Messen mit einem
> Frequenzmesser auf einen Portpin ausgegeben und mit dem Wert für den
> CTC-Modus bzw. dem Vorladewert für den Timer "gespielt", bis es
> exakt stimmte.

Ok, also abgeglichen, dann stimmt meine Welt wieder.

Gruss  Alex

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.