Hallo,
ich möchte mit einem DCF77 empfänger die Uhrzeit auslesen (Atmgega328).
Momentan lasse ich durch den Signal-Pegel den Interrupt auslösen. Dann
messe ich wie lang der Pegel low war und habe somit eine 0 bzw. 1.
Aber wie bekomme ich das Bit0? Also den Anfang des Signals? Es beginnt
zwar immer mit null, aber auch im Signal kommen ja nullen vor. Woher
weiss ich welche die richtige ist?
Marc
Ein Möglichkeit den Anfang der Minute zu erkennen, ist es die Zeit seit
dem letzten Puls zu berücksichtigen. Nach der langen Pause fängt die
Minute an.
Auf die Zeit zu achten kann auch helfen zusätzliche Pulse, die durch
Störungen zu zufälliger Zeit entstehen zu erkennen und ignorieren.
Marc schrieb:> ich möchte mit einem DCF77 empfänger die Uhrzeit auslesen (Atmgega328).> Momentan lasse ich durch den Signal-Pegel den Interrupt auslösen.> ...> Aber wie bekomme ich das Bit0? Also den Anfang des Signals?
Indem du nicht die Pulslängen per Signal-Pegel Interrupt auslöst,
sondern regelmäßig per Timerinerrupt den Signalpegel ausliest und dann
in der Software Puls- und Trägerabsenkungslängen ("Pausen") bestimmst.
Nach einer Pause > 1.4s geht es mit der neuen Minute los.
Dann kannst du auch gleich Störsignale ausfiltern.
Wenn in der 59s auch eine Trägerabsenkung stattfindet, ist die folgende
Sekunde eine Schaltsekunde.
Wolfgang schrieb:> Wenn in der 59s auch eine Trägerabsenkung stattfindet, ist die folgende> Sekunde eine Schaltsekunde.
Das muss dann aber auch mit Bit 19 zusammen passen.
Marc schrieb:> Momentan lasse ich durch den Signal-Pegel den Interrupt auslösen.
Das ist der falsche Weg. Sinnvoller ist ein Timer-Interupt.
Ich habe das so gelöst, dass ich aller 10ms einen TI auslöse, den Pegel
von DCF abfrage und mit dem Zustand vor 10ms vergleiche. Ist der Pegel
gleich, zähle ich eine Variable hoch. Bei Pegeländerung wird der Wert
dieser Variable ausgewertet. Ist er zwischen 5 und 14 ist der DCF-Pegel
0, bei 15-25 ist der Pegel 1. Zusätzlich gibt es noch einen Zählerstand
von 170 bis 230 bei Low-Pegel. Das ist das Zeichen für die 59. Sekunde
und das Programm beginnt mit der Syncronisation der Zeit. Alle anderen
Zählerwerte bedeuten einen Empfangsfehler.
Marc schrieb:> Was ist daran denn falsch? Bzw. was ist an einem Timer-Interrupt besser?
Erstmal nichts, nur wenn du bei gestörten Empfang, alle ms einen Impuls
bekommst, könnte das den Programmablauf erheblich aus dem Tackt
bringen.
Daher wäre da zusätzlich einen Timer einzubinden, event. von Nöten.
Mag hier nicht wirklich zum tragen kommen, aber schön is es nich....
Ich habe noch einmal eine Nachfrage.
Neben dem DCF-Empfänger muss ich ja auch einen normalen Timer laufen
lassen, mit dem ich die Zeit 'darstellen kann', solange ich noch kein
richtiges Signal habe (solange noch kein Empfang da ist), bzw. für die
Zeit zwischen den Minuten. Vom DCF-Empfänger habe ich ja nur jede Minute
die komplette Zeit zusammen. Die Sekunden muss ich ja selber ermitteln.
Nehmt ihr dann den selben Timer dafür oder einen extra?
Marc
Marc schrieb:> Nehmt ihr dann den selben Timer dafür oder einen extra?
Wozu? Wenn du z.B. eine 10ms-Timeinterrupt hast, kannst du damit die
hunderstel Sekunden zählen, usw. usw. Du musst nur darauf achten, dass
der Interrupt auch exakt alle 10 ms erfolgt.
Georg
Das Problem mit der ISR und dem Timer das Störungen dazu führen das die
Flanken Zeit nicht mehr zweifelsfrei gemessen werden kann. Bei
Störungsfreien Empfang mag das Prinzip funktionieren. Den gibt es aber
nicht mehr ! .
Besser ist es das Signal wie erwähnt abzutasten und die Störungen zu
filtern.
Außerdem verschleifen viele Empfänger den Impuls, etwas Toleranz muss
man einplanen.
Marc schrieb:> Aber wie bekomme ich das Bit0?
Früher(tm) hat man dafür ein Monoflop benutzt. Heutzutage braucht
man dafür einen hochkomplizierten Computer...
Harald W. schrieb:> Früher(tm) hat man dafür ein Monoflop benutzt. Heutzutage braucht> man dafür einen hochkomplizierten Computer...
Du willst mit M.B.(l*) in Konkurrenz treten?
Meine DCF Uhr der 70er Jahre war mit 74xx aufgebaut, ist bei Ausfall per
Quarz weitergelaufen und hat leider auch oft genug dummes Zeug
angezeigt.
Der Einsatz eines Prozessors (6502) etwa 1987 hat da einen erheblichen
Fortschritt gebracht. Es steckt etwas Denkarbeit in der Decodierung:
Low-Zeit zählen, damit lassen sich kurze Störimpulse wegfiltern, ich
polle den Port.
Nach Auswertung eines Bits den Empfang sperren, bis das nächste erwartet
wird.
Mathematische Prüfung Minute = Minute + 1
Gelegentlich sehe ich mal Error im Status, aber an eine grob falsche
Zeitanzeige kann ich mich nicht mehr erinnern.
Harald W. schrieb:> Früher(tm) hat man dafür ein Monoflop benutzt
Ach, und das hat auch die 60 Bit in eine Uhrzeit umgewandelt, angezeigt
und ist ohne Empfang mit Quarzgenauigkeit weitergelaufen?
Das ist bloss eine realitätsferne Verklärung der Vergangenheit - eine
häufige Alterserscheinung. Früher waren auch die Sommer immer heiss und
kein Regen und Weihnachten war immer weiss...
Georg
Mit der Methode Abtasten gibt es nur ein Problem. Da dein Timer zum DCF
asynchron läuft eiert dieser aus dem Fenster heraus. Du musst also
schauen das du den Timer oder die Auswertung synchron bekommst.
Im besten funktioniert das mit einen Ringpuffer der 1sec groß ist um die
10ms Werte aufzunehmen. Diesen durchsucht man dann nach dem sync und
kann dann das Signal auswerten. Wenn man es schlau macht kann man sogar
auf die nächsten Bits schließen und muss nicht auf ein 100% gültiges
Signal warten.
Man braucht sowie so nur ein paar Datenpakete um die Uhr zustellen dann
läuft sie ja so weiter ;). In gewissen Abständen prüft man eben nur die
Differenz und stellt nach. Sommer/ Winterzeit muss man mit beachten ;).
Heut zu tage ist ein störungsfreier Empfang kaum noch möglich. Ohne
intelligenter Auswertung wirst du kaum ein gültiges Signal auswerten
können.
georg schrieb:> Harald W. schrieb:>> Früher(tm) hat man dafür ein Monoflop benutzt>> Ach, und das hat auch die 60 Bit in eine Uhrzeit umgewandelt, angezeigt> und ist ohne Empfang mit Quarzgenauigkeit weitergelaufen?
Der TE hat nur nach dem Bit0 gefragt...
Harald W. schrieb:> Früher(tm) hat man dafür ein Monoflop benutzt. Heutzutage braucht> man dafür einen hochkomplizierten Computer...
Und der macht auch den ganzen Rest. Also mit einem Monoflop ein völlig
blödsinniger Vergleich. Dein Hirn hat ja auch nicht nur die Funktion
einer einzigen Nervenzelle (auch wenn du dir Mühe gibst so simple-minded
wie möglich zu erscheinen).
Georg
georg schrieb:> Also mit einem Monoflop ein völlig blödsinniger Vergleich.
Wenn man natürlich beim Zitieren das Wesentliche wegläßt, kann man es
durchaus so aussehen lassen, daß es "blödsinnig" wirkt!
Fast könnte man auf die Idee kommen, du bist Gossen-Journalist;-)
Hier nochmal der Zusammenhang, um was es eigentlich ging:
Harald W. schrieb:>> Aber wie bekomme ich das Bit0?>> Früher(tm) hat man dafür ein Monoflop benutzt.