Forum: Mikrocontroller und Digitale Elektronik DCF77 Bit0 ermitteln


von Marc (Gast)


Lesenswert?

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

von A. B. (Gast)


Lesenswert?

Die letzte Sekunde einer jeden Minute "fehlt".

von Dirk B. (dirkb2)


Lesenswert?

Das Bit 59 wird nicht gesendet

von Lurchi (Gast)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

Ahh, tatsache.
Danke euch für den Hinweis

von Wolfgang (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

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?

von Teo D. (teoderix)


Lesenswert?

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....

von Wolfgang (Gast)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

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

von georg (Gast)


Lesenswert?

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

von Marco H. (damarco)


Lesenswert?

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
von Harald W. (wilhelms)


Lesenswert?

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...

von Manfred (Gast)


Lesenswert?

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.

von georg (Gast)


Lesenswert?

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

von Marco H. (damarco)


Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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...

von DG5MPQ (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend zusammen,

hier mal was aus meinen Projekten.
DCF77 auf Serial.
Das funktioniert bei mir schon seit Jahren.

Gruß Thomas
DG5MPQ

von georg (Gast)


Lesenswert?

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

von Alois W. Kudrow (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.