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