Forum: Mikrocontroller und Digitale Elektronik DCF77 Signal, wie Anfang detektieren?


von nobodyisperfect (Gast)


Lesenswert?

Hallo,

ich habe mir ein DCF77 Modul geholt.
Ich wollte den Ausgang des Signalverstärkers davon an einen Pin hängen 
und dann das Signal mittels interrupt auswerten und in ein Array 
schreiben.

Woher weiß ich aber, dass das erste Bit das im Array steht, wirklich das 
Bit vom Anfang des DCF77 Signals ist.

Ich weiß ja eigentlich nur, dass das 59. Bit immer eine 0 ist.

Gruß nobodyisperfect

von Dennis X. (Gast)


Lesenswert?

Du misst die Zeit, welche zwischen den einzelnen Flanken ist. Dann musst 
du nur noch ständig diese mit der Sync-Zeit vergleichen und du hast den 
Anfang.

von Heinrich Hertz (Gast)


Lesenswert?

nobodyisperfect schrieb:
> Ich weiß ja eigentlich nur, dass das 59. Bit immer eine 0 ist.

Nö,
0-Bits sind kurz,
1-Bits sind lang
das 59.Bit fehlt.

von Nachdenker (Gast)


Lesenswert?

Eben, das 59. Bit fehlt. Von wievielen maximalen Bits, d.h. wann fängt 
nach dem 59. Bit dann Bit 1 an?

Wenn die ganze Sequenz vorliegt und die 59. Stelle eindeutig definiert 
ist, dürfte der Rest doch kein Problem mehr sein.

von Dennis X. (Gast)


Lesenswert?

Heinrich Hertz schrieb:
> 1-Bits sind lang
> das 59.Bit fehlt.

Dieses "Fehlen" + die eigentlichen Zeiten zwischen den Bits ergeben 
einen LOW-Pegel, welcher ein kleines bisschen länger ist wie ein 
normaler LOW-Pegel. Du musst nur dein Programm so schreiben, dass er 
ständig die Zeit isst, und ein Flag setzt, wenn er dies erkannt hat. 
Dann kannst du das Unterprogramm zum Daten einlesen starten.

von Karl H. (kbuchegg)


Lesenswert?

Der Knackpunkt an der ganzen Sache besteht darin, dass du sowas wie eine 
interne Uhr brauchst, mit der du die Signale vergleichst. Und dann 
kannst du feststellen, dass zu einem Zeitpunkt, an dem eigentlich eine 
Flanke hätte vorliegen sollen, keine vorhanden ist und an dieser Stelle 
das DCF Signal daher beginnen muss.

Nur DCF alleine reicht also nicht. Du brauchst eine programminterne 
Zeitsteuerung.

von Ingo (Gast)


Lesenswert?

Ich hab auch immer die Zeit zwischen 2 Flanken gemessen. Funktioniert 
prima. Frage:
wie kann man das Zeitsignal platzsparender Speichern als ein 
riesengroßes 59Byte Array? SpIelt zwar fast keine Rolle, würde mich aber 
trotzdem mal interessieren.


Ingo

von Dennis X. (Gast)


Lesenswert?

Ingo schrieb:
> wie kann man das Zeitsignal platzsparender Speichern als ein
> riesengroßes 59Byte Array?

Also ich hab das glaub damals so gelöst, dass ich eben in eine 16 Bit 
Varaible Teile der Zeit reingespeichert hab und den Rest dann immer in 
eine Seperate. Also hatte ich nach einer Minute so 2-3 Variablen, welche 
ich dann in meiner Hauptschleife ausgewertet hab. Mit einem Array hab 
ich aber nicht gearbeitet.

von Peter D. (peda)


Lesenswert?

Ingo schrieb:
> wie kann man das Zeitsignal platzsparender Speichern als ein
> riesengroßes 59Byte Array?

Das Signal ist doch schnarchlahm, ein ganzes Bit/s.
Es ist also leichtes, jedes Bit in Echtzeit auszuwerten und die 
Variablen zu setzen.
Und am Ende wird die Zeit übernommen, wenn alle Tests gültig sind 
(Parity, Pulsdauer, Pulsperiode, Pulsanzahl).

Es ist auch Unsinn, die Bits auf die µs genau auszumessen. Ein 
Timerinterrupt alle 10ms reicht als Auflösung völlig aus.


Peter

von Ingo (Gast)


Lesenswert?

Nunja, aber ich würde fast meinen, die Umsetzung mit Timer ist 
einfacher, als das Zwitsignal mit 10ms abzutasten. Zumal man ja nur 
einmal das Zeitaignal korrekt empfangen muss (meinetwegen auch 10mal 
hintereinander damit es auch stimmt) aber dann braucht man eigentlich 
nur einmal am Tag die Uhr synchronisieren damit die Zeitzone passt.
Die harte Auswertung von dir ist eigentlich unnötig komliziert, wennauch 
genial.


Ingo

von Ottmar K. (wil1)


Lesenswert?

Hallo nobodyisperfect,

hier ist eine prima Dokumentation zum DCF-Zeitsignal
[http://adrian.dymorz.ch/fileadmin/projects/time/Dokumentation.pdf]
auch diese Seite ist interessant
[http://www.mydarc.de/DK7IO/zeitzeichensender/index.html]
auch beim Erzeuger des DCF-Signals der PTB gibt es Infos
[http://www.ptb.de/cms/fileadmin/internet/fachabteilungen/abteilung_4/4.4_zeit_und_frequenz/pdf/dcf77.pdf]

Jetzt aber zu Deiner ursprünglichen Frage,
>"Woher weiß ich aber, dass das erste Bit das im Array steht, wirklich >das Bit 
vom Anfang des DCF77 Signals ist?"

Du musst einfach die Pulspause zwischen Ende Sekundenpuls 58  und Beginn 
Sekunde "0" detektieren. Das klappt mit einem flankenausgelösten 
Interrupt am einfachsten. Diese Pause dauert mindestens 1800ms
-10%. Ich habe mich mit 1024ms begnügt weil es eben passend war den 
Timerüberlauf 256x4ms zu warten.

Ist diese Pause erkannt, akzeptierst Du nur noch 100ms. bzw. 200ms-Pulse 
(+-10%). Tritt eine "falscher" also zu kurzer oder zu langer Puls auf, 
wird die aktuelle Messung verworfen und wieder auf die Pulspause 
synchronisiert.

Auf die Paritätsbits habe ich verzichtet und vergleiche das aktuelle 
Zeittelegramm mit dem zuletzt vor 1 minute empfangenen auf 
übereinstimmung - 1 Minute.

Im Netz gib es eine Vielzahl weiterer hervorragender Hinweise und Infos 
zum Thema.

Gruss Ottmar

von Nano (Gast)


Lesenswert?

Ingo schrieb:
> wie kann man das Zeitsignal platzsparender Speichern als ein
> riesengroßes 59Byte Array?

Wieso 59 Bytes? Du meinst wohl 59 Bits, also 8 Bytes.

von Dennis X. (Gast)


Lesenswert?

Nano schrieb:
> Wieso 59 Bytes? Du meinst wohl 59 Bits, also 8 Bytes.

char signal[59]

Jetzt setzt er jedes Feld auf '0' oder '1' ;-).
Sowas macht man eben zu Beginn seiner Programmier-Ausbildung ;-)

von HildeK (Gast)


Lesenswert?

Nano schrieb:
> Wieso 59 Bytes? Du meinst wohl 59 Bits, also 8 Bytes.

Nicht mal das, die ersten 19 oder 20 Bits enthalten keine 
Zeitinformation. Also, erst mal in aller Ruhe auf 20 Zählen und nichts 
speichern ...

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.