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.
Jens schrieb: > Das ist der falsche Weg. Sinnvoller ist ein Timer-Interupt. Was ist daran denn falsch? Bzw. was ist an einem Timer-Interrupt besser?
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....
Dirk B. schrieb: > Das muss dann aber auch mit Bit 19 zusammen passen. So wird es sein - das wird die Software von DCF77 schon hin kriegen.
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.
:
Bearbeitet durch User
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...
Guten Abend zusammen, hier mal was aus meinen Projekten. DCF77 auf Serial. Das funktioniert bei mir schon seit Jahren. Gruß Thomas DG5MPQ
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.