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