[Bascom/AVR] Uhr und DCF

OP #3909244
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
Angehängte Dateien:
#3909684
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
OP #3909714
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
#3909866
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren