Arduino Forum

International => Deutsch => Topic started by: udoklein on Dec 01, 2012, 07:40 pm

Title: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 01, 2012, 07:40 pm
Wie versprochen ist Ausbaustufe 1 meiner DCF77 Uhr fertig. Das Projekt findet Ihr hier: http://blog.blinkenlight.net/2012/12/01/dcf77-project/ (http://blog.blinkenlight.net/2012/12/01/dcf77-project/) und Ausbaustufe 1 hier: http://blog.blinkenlight.net/binary-clock/ (http://blog.blinkenlight.net/binary-clock/). In der jetzigen Ausbaustufe ist die Rauschunterdrückung schon ganz brauchbar.

Ich würde mich freuen wenn Forumsteilnehmer die bisher mit DCF77 Uhren Empfangsprobleme hatten ausprobieren würden ob mein Code bei Ihnen bessere Ergebnisse liefert.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 03, 2012, 04:04 pm

Ich würde mich freuen wenn Forumsteilnehmer die bisher mit DCF77 Uhren Empfangsprobleme hatten ausprobieren würden ob mein Code bei Ihnen bessere Ergebnisse liefert.


Viele Forenteilnehmer scheinen hier ja nicht gerade auf Deinen Filter für verbesserte DCF77-Auswertung gewartet zu haben.
Bei der "grossen" Resonanz!

Ich habe noch irgendwo zwei verschiedene DCF-Module herumliegen, eins mit Push-Pull-Ausgang und eins mit Open-Collector-Ausgang. Ich habe mit DCF77 zwar keine großen Probleme, finde die Fragestellung aber interessant - und: DCF Empfangsstörungen lassen sich ja leicht simulieren, einfach irgendein Schaltnetzteil näher als zwei Meter an das Modul bringen und fertig. Da braucht man heute ja gar keinen Röhrenmonitor, moderne LCD-Monitore stören DCF genauso wie Handyladegeräte, Steckernetzteile, Computer, Energiesparlampen und vieles andere mehr.

Hast Du die Parameter Deines Filters denn schon optimiert? Oder sind die momentan "einfach so" gewählt?

50 samples mit 1ms Zeitabstand? Oder sollte man eventuell auch mal mit 100 samples und 0,5ms Zeitabstand testen?

Gesamte Sampling-Zeit 50ms, oder könnte man vielleicht auch 100ms lang Werte sampeln und filtern?

Anyway, ich werde jedenfalls mal was testen und melde mich dann.
Wäre ja irgendwie schade, wenn es gar kein Feedback dazu gibt.


Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 03, 2012, 05:08 pm
Das mit der Resonanz ist so eine Sache. Gelesen haben den Artikel schon einige. Zumindest hat mein Blog Gestern fast 600 Page Hits bekommen. Ich würde sage: alle schreibfaul außer Dir ;)

Empfangsstörungen kann ich problemlos selber simulieren. Die Frage ist ob jemand mit dieser Version bessere Ergebnisse hat als vorher.

Was den Filter angeht: ja, er ist optimiert. Die nächste Ausbaustufe wird allerdings ***sehr*** viel besser. Ich fange nur mit diesem an weil der leichter zu verstehen ist. Ich bin jedenfalls mal auf Deine Ergebnisse gespannt.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 03, 2012, 09:21 pm

Die Frage ist ob jemand mit dieser Version bessere Ergebnisse hat als vorher.


Vorher?
Gab's schon vorher eine andere Filterfunktion von Dir?
Wenn ja, kenne ich diese nicht.
Oder "vorher" im Vergleich zu "kein Filter"?

Also hier mein Test. Testaufbau:
Arduino Uno
Pollin DCF-Modul mit Push-Pull Ausgang
Conrad DCF-Modul mit Open Collector Ausgang

Störungen: Bei mir auf dem Tisch neben dem Computer, auf dem dieselben beiden DCF-Module noch im Sommer störungsfrei liefen, kann ich jetzt leider erhebliche Störungen beim DCF-Empfang feststellen. OK, im Keller läuft nun die Heizung, aber momentan kann ich mir den hohen Störpegel nicht erklären, auf demselben Tisch auf dem im Sommer alles fehlerfrei lief. Vielleicht hat sich einer der Nachbarn Powerline-Adapter gekauft und sein Stromnetz funkt nun Störungen. Keine Ahnung, was los ist.

Pollin DCF-Modul: Zickt bei der Inbetriebnahme - mehr dazu später.

Conrad DCF-Modul: Inbetriebnahme des Moduls möglich, aber starke DCF-Störungen im Signal, wie es original vom Modul geliefert wird. Auswertung mit der DCF-Library völlig unmöglich. Das DCFPulseLength Testprogramm zeigt extrem kurze Impulse am Ausgang an. Gefiltert mit Deinem Exponentialfilter: Die vom DCFPulseLength Testprogramm gelieferten Impulse sehen zwar nicht aus wie die von einem einwandfreien DCF-Signal, es sind schon Schwankungen der Impulsbreiten sichtbar. Aber offenbar alles im Bereich von +/-50ms, so dass das Zeittelegramm fehlerfrei ausgewertet werden kann.

Also ich kann nur sagen: Dein DCF-Filter funktioniert spitzenmäßig, jedenfalls zusammen mit dem Conrad DCF-Modul!


Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MaFu on Dec 04, 2012, 01:32 pm
Ich hab auch das Conrad-Modul. Wenn ichs zeitlich schaffe (und schlechtes Wetter ist, ansonsten bin ich nicht da) werde ich am Wochenende Deinen Filter testen.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 04, 2012, 01:56 pm
[Nachtrag zum Pollin-DCF-Modul]
Also mein Pollin-Modul funktioniert auch noch, ich konnte es inzwischen testen. Das Modul verhält sich jedoch insbesondere bei Störungen des DCF-Empfangs komplett anders als das Conrad-Modul. Mein Problem mit der Inbetriebnahme gestern abend hängt offenbar damit zusammen: Das Pollin-Modul liefert bei sehr starken Empfangsstörungen überhaupt kein Signal mehr am Ausgang! Da ich gestern abend einen zeitweise gestörten Empfang hatte, konnte ich es daher nicht im Betrieb nehmen, keine Ahnung ob zwischen Frankfurt und S-H gestern abend ein Gewitter das DCF-Signal beeinträchtigt hat.

Jedenfalls scheint das Pollin-Modul bereits einen eigenen Signal-Filter eingebaut zu haben, denn durch schwache Empfangsstörungen läßt es sich (im Gegensatz zum Conrad-Modul) überhaupt nicht aus dem Tritt bringen.

Meine Störungssimulation:
Eine eingeschaltete Energiesparlampe, die ich mehr oder weniger nah an die Empfangsschaltung stelle.

Keine Störungen:
Pollin-Modul: keine Störungen
Conrad-Modul: keine Störungen

Schwache Störungen:
Pollin-Modul: keine Störungen
Conrad-Modul: schwache Störungen

Mittelstarke Störungen:
Pollin-Modul: keine Störungen
Conrad-Modul: mittelstarke Störungen

Extrem starke Störungen:
Pollin-Modul: keine Signal am Ausgang mehr vorhanden
Conrad-Modul: extrem starke Störungen

In einem ganz kleinen Bereich zwischen "mittelstarke Störungen" und "extrem starke Störungen" liefert das Pollin-Modul noch kurzfristig ein wirres Gezappel am Signalausgang, mit dem aber auch Dein Filter nichts mehr anfangen kann. Dann ist das Pollin-Modul tot, kein auswertbares DCF-Signal, dann bleibt der Ausgang auf LOW.

Also ist mein Fazit:

Das Pollin DCF-Modul hat einen eigenen Störfilter eingebaut, der Störungen in gewissem Maße herausfiltert und für ein einwandfreies Signal sorgt. Werden die Störungen aber zu groß, geht der Ausgang am Pollin-Modul auf "Wahnsinns-Gezappel" (nur in einem kleinen Bereich) oder "ständig LOW" (Normalfall) und gibt gar kein Signal mehr aus. Eine Filterung mit Deinem Filter bringt überhaupt nichts, auch nicht in dem kleinen "Wahnsinns-Gezappel" Bereich, das ist dann bereits vollständig Datenmüll.

Das Conrad DCF-Modul liefert Empfangsstörungen mit einem ziemlichen Gezappel am Signalausgang weiter. Dieses Gezappel am Signalausgang des Conrad-Moduls läßt sich mit Deinem Filter sehr gut auf ein einwandfreies DCF-Signal filtern. Und das auch noch in einem Bereich an Störungen, in dem das Pollin-Modul schon nichts mehr liefert.

Also: Dein Filter bringt beim Pollin-Modul angewendet gar nichts. Aber "Dein Filter plus Conrad-Modul" liefert super-gute Ergebnisse, und auch noch bei einem so hohen Störpegel ein einwandfreies Signal, bei dem das Pollin-Modul schon längst aus dem Empfang ausgestiegen ist. Also Dein Filter ist besser als der im Pollin-Modul eingebaute Filter, und liefert mit dem Conrad-Modul hier bei mir die besten Empfangsergebnisse in stark gestörter Umgebung.






Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: klik on Dec 04, 2012, 03:10 pm
Also auch ich habe sehnsüchtig auf den Filter gewartet, da auch mich Empfangsprobleme plagen.

Sobald es meine Zeit zuläßt werde ich den Filter zusammen mit meinem Reichelt Modul testen.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: maverick1509 on Dec 04, 2012, 07:47 pm
Hallo,
also ich hab auch noch ein Pollin Modul welches ich jetzt mal angeschlossen habe.
Kann aber noch nichts mit der Ausgabe anfangen
was bedeutet denn beispielsweise das:
Cycle, Pulse:  977, 411 X 
Cycle, Pulse:  560, 390 X 
Cycle, Pulse:  538, 966 X 
Cycle, Pulse: 1659, 1207 X 
Cycle, Pulse: 1357, 1927 X 
Cycle, Pulse: 2075, 410 X m
Cycle, Pulse:  560, 350 X 
Cycle, Pulse:  497, 430 X 
Cycle, Pulse:  580, 351 X 
Cycle, Pulse:  499, 2840 X 
Cycle, Pulse: 3416, 5157 X m
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 04, 2012, 09:22 pm

Kann aber noch nichts mit der Ausgabe anfangen
was bedeutet denn beispielsweise das:
Cycle, Pulse:  977, 411 X 
Cycle, Pulse:  560, 390 X 
Cycle, Pulse:  538, 966 X 
Cycle, Pulse: 1659, 1207 X 
Cycle, Pulse: 1357, 1927 X 
Cycle, Pulse: 2075, 410 X m
Cycle, Pulse:  560, 350 X 
Cycle, Pulse:  497, 430 X 
Cycle, Pulse:  580, 351 X 
Cycle, Pulse:  499, 2840 X 
Cycle, Pulse: 3416, 5157 X m


Das bedeutet, dass es mit DCF-Empfang Essig ist.

Das DCF-Funkprotololl besteht pro Minute aus 59 Sekundenimpulsen mit einer Zyklendauer von einer Sekunde (Cycle 1000 ms) und darin enthaltenen Bit-Pulsen von 100 oder 200 ms Dauer.

Bei einem perfekten Empfang mit einem perfekten Modul in einer perfekten Welt sähe der Empfang bei 59 Sekunden in der Minute so aus:
Cycle, Pulse:  1000, 100 .
Cycle, Pulse:  1000, 200 X 
Cycle, Pulse:  1000, 100 . 
Cycle, Pulse:  1000, 100 . 

Also immer Zyklendauer 1000 ms und Impulse von 100 oder 200 ms. Punkt steht für 0-Bit und X für 1-Bit.

In der Praxis siehst Du das natürlich NIE!
Aber solange die Zyklendauer "in der Nähe von 1000" ist und die Impulse immer schwischen 50 und 250ms liegen, ist der Empfang wohl OK.

Und der sechzigste Impuls ist der Minutenimpuls, der ist doppelt so lang, weil kein Bit-Impuls gesendet wird.

Was Du da oben zeigst, sieht nach einem sehr gestörten Empfang aus.

DCF-Empfang wird übrigens durch alle möglichen elektrischen Geräte gestört, als da wären Computer, Monitor, Steckernetzgeräte, Energiesparlampen etc.

Also wenn Dein Arduino-Board nur mit dem kurzen USB-Kabel am Computer angeschlossen ist, das mit dem Board mitgeliefert wurde, wirst Du damit nicht aus dem Störnebel von PC und Monitor rauskommen. Probier mal mit einer 3m USB-Verlängerung und lege das DCF-Modul beim Testen mindestens 2m weg von PC, Monitor und anderen elektrischen Gerätschaften.


Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: bello12 on Dec 04, 2012, 09:36 pm
Hallo,
Also bei mir sieht es mit Filter genauso aus Cycle und Puls irgend ein wirrwarr.
Aber ohne Filter, also Sketch aus Beispieldatei, läuft ohne probleme.
DCF Modul ist von ELV.
gruß bello12
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: uwefed on Dec 04, 2012, 10:30 pm

Und der sechzigste Impuls ist der Minutenimpuls, der ist doppelt so lang, weil kein Bit-Impuls gesendet wird.

Soviel ich weiß fehlt der Impuls für die 59.Sekunde und der erste Impuls nacher (Minutenimpuls) ist immer 0,1Sekunde lang.
http://www.ptb.de/cms/fileadmin/internet/fachabteilungen/abteilung_4/4.4_zeit_und_frequenz/4.42/dcf77.pdf Seite 8.
Grüße Uwe
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 04, 2012, 10:45 pm

Also bei mir sieht es mit Filter genauso aus Cycle und Puls irgend ein wirrwarr.
Aber ohne Filter, also Sketch aus Beispieldatei, läuft ohne probleme.


Ich hab's ja kommen sehen, als ich mir das alles durchgelesen habe: Alles wunderbar kommentiert mit dem Filter, aber es sind keine ausführlichen Hinweise zur Schaltung dabei. Und wer nicht versteht, wie es läuft, hat eine mehr als 50%-Chance, es falsch zu machen.

Steht aber alles im Quelltext:
> const uint8_t dcf77_sample_pin = 19; // A5
> const uint8_t dcf77_analog_sample_pin = 5;

Der "Sample Pin" ist derjenige, auf dem die Samples von der DCF-Uhr eingelesen werden.
Das DCF-Modul gehört bei diesem Sketch an den Analog A5 Pin.

> const uint8_t filtered_dcf77_pin = 2;
Der "Filtered Pin" ist in dem Fall ein "Hilfs-Pin", der unbeschaltet bleibt!

Tatsächlich wird dieser Pin im Sketch sogar als OUTPUT deklariert:
> pinMode(filtered_dcf77_pin, OUTPUT);

An Pin2 wird bei dem Filter-Sketch nichts angeschlossen, sondern an dem Pin wird das gefilterte Signal AUSGEGEBEN, so dass die DCF-Library von dort das gefilterte Signal bekommen kann, SO ALS OB dort ein DCF-Modul angeschlossen wäre!

Das hat Udo so gemacht, weil ihr dann eine unveränderte DCF-Library verwenden könnt und er das Filter nicht in eine veränderte Library einbauen musste, sondern damit er das Filter in den Sketch packen konnte.

Also achtet bitte mal drauf, was ihr wo angeschlossen habt!

Wer wirre Eingangswerte bekommt, der holt sich die Eingangswerte wahrscheinlich vom offenen und unbeschalteten A5 Eingang ab. Und damit kann kein Filter was anfangen.



Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 05, 2012, 12:47 am
@jurs: erst mal besten Dank für Deine detailierte Analyse.

Was das Polling Modul vs. Conrad Modul angeht. Vermutlich (ich kann es nicht überprüfen) hat das Pollin Modul einen Tiefpassfilter am Ausgang. Beliebt sind 20Hz Tiefpassfilter. Und wenn da nicht viel sehr viel Mühe reinging, dann sind die Grenzfrequenz und die Filtersteilheit eher Pi mal Daumen bestimmt. Das reicht bei gutem Empfang ja auch und man muß keinen Mikrocontroller für die digitale Filterung spendieren.

Das Conrad Modul hingegen hat laut Datenblatt 300Hz Bandbreite. Deshalb muß es zappeliger sein. Als Konsequenz davon hat man dann aber überhaupt die Möglichkeit die Filterung selber zu erledigen und den Filter dann optimal zu rechnen. Da ich nur das Conrad Modul hier habe dachte ich, die anderen billigen Module verzichten (aus Kostengründen) auch auf den Tiefpass. Dem ist aber offensichtlich nicht so. --> Meine Konstruktion funktioniert zwangsläufig besser mit dem scheinbar schlechteren Modul von Conrad.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: maverick1509 on Dec 05, 2012, 07:43 am
So hab das Modul einfach mal über Nacht dran gelassen (mit 1,5m Kabel neben dem Rechner ans Fenster gestellt).
Heute Morgen zeigt es mir die korrekte Zeit und das Datum an.
Zumindest funktioniert das Pollin Modul.

Cycle, Pulse:  998,  92 . 
Cycle, Pulse: 1000,  90 . 
Cycle, Pulse:  997,  90 . 

DCF sync good
5.12.2012  07:38:00
5.12.2012  07:38:01



Gruß
Bernward
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: johannes_franke on Dec 05, 2012, 08:44 am
Hi, ist eigentlich keine Schreibfaulheit, versprochen! Ich bin über Hackaday.com auf Deinen Thread gekommen, und den Artikel gab es erst heute.
Auf jeden Fall ein nettes Projekt, das mich sehr interessiert, weil bei mir von drei DCF77-Uhren zwei einfach nicht funktionieren. Und es ist etwas frustrierend, dass sie keinerlei Auskunft darüber geben, wieso nicht. Eine Empfangsanzeige (db) wäre für den Zweck nicht schlecht. Vielleicht kann man mit Deiner Lösung die Signalqualität in der jeweiligen Ecke ermitteln, wo die nicht funktionierenden Uhren stehen und eine bessere Position / Ausrichtung finden.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 05, 2012, 09:48 am
Hallo zusammen,
ich verfolge das hier und finde es vielversprechend.

Ich hatte da vor langer zeit mal eine Idee, die so wie ich meine sicher sehr interessant wäre für viele.
Oft hört man das Bastler eine Uhr machen wollen und Probleme mit der Zeit haben.
"Brauch ich eine RTC"
"Wo bekomme ich die Zeit her" (Netz, DCF77, GPS)
Meine Idee war ein Shield mit einem kleinen Mikrocontroller und einer RTC und einem Anschluss und Platz für ein DCF77 Modul.
Der Mikrocontroller wertet das DCF77-Signal aus (mit diesem Filter vielleicht 8-) ) und schreibt diese Zeit in die RTC.
Über I2C oder so kann dann der Arduino einfach die Zeit abfragen mit vielleicht noch ein paar Bits in denen steht
woher denn jetzt die Zeit kommt (also war der Sync erfolgreich?)

Fände ich zumindest Praktisch.
Leider bin ich noch nicht weit genug um so was um zu setzen.
Vielleicht versuche ich das doch nochmal an zu gehen
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: maverick1509 on Dec 05, 2012, 10:37 am
Was ich nicht ganz verstehe, warum haben die Module (Pollin, Conrad....) so eine große Ferritantenne
und einen relativ schlechten Empfang.
Jeder Funkwecker von Aldi, Lidl oder wie auch immer für 10€ kann das besser, und mit viel geringerer Baugröße.
Warum?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: klik on Dec 05, 2012, 05:12 pm
Wie versprochen mein Update zum Nutzen in Verbindung mit dem Reichelt DCF77 Modul.

Der praktische Nutzen ist hier eher gering, da auch dieses Modul offensichtlich eine sehr starke Vorfilterung macht.
Spikes auf dem Signal habe ich praktisch gar nicht, allerdings ist die Bandbreite der gültigen Pulsbreiten extrem groß.

Laut Datenblatt
0: 100 +30 -60 ms
1: 200 +30 -60 ms

Dies zu ergründen hat mir dieser Versuch auf jeden Fall schon mal geholfen.
Jetzt muß ich wohl eine Anpassung der DCF77 Lib für das Reichelt-Modul machen, damit diese Pulse auch korrekt verarbeitet werden.

Des weiteren ist der direkte Anschluß am Analogpin suboptimal, da der Eingangswiderstand beim Sampling offenbar für das Modul zu klein ist und der Spannungshub somit recht klein ist. (Der Analogeingang liest Werte um 800 und 1000 für Low und High.)

Zum Schluß noch herzlichen Dank für diese gute Arbeit, die mich zumindest in der Theorie deutlich weitergebracht hat, und mir sicherlich an anderer Stelle noch helfen kann.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 05, 2012, 05:58 pm
@maverick: das Conrad Modul hat keinen schlechten Empfang. Es hat eine große Bandrbreite und nimmt deshalb Störungen stärker auf. Das ist normal. Die von Dir genannten Wecker haben keinen besseren Empfang als das Conrad Modul, wie kommst Du zu der Annahme, daß dem so wäre? Was sie haben ist ein Tiefpassfilter und eine sehr simple "Fehlererkennung". Ich bekomme mit dem Conrad Modul und dem Prototyp jedenfalls bessere Ergebnisse als mit den genannten Weckern.

@klik: beim Blinkenlighty hängt auf dem Pin noch eine LED, deshalb ist der Analogeingang in meinem Fall die Beste Lösung. Wenn er bei Dir unbelastet ist, dann ist digitales Auswerten auf jeden Fall besser.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 05, 2012, 06:10 pm

Was das Polling Modul vs. Conrad Modul angeht. Vermutlich (ich kann es nicht überprüfen) hat das Pollin Modul einen Tiefpassfilter am Ausgang. Beliebt sind 20Hz Tiefpassfilter. Und wenn da nicht viel sehr viel Mühe reinging, dann sind die Grenzfrequenz und die Filtersteilheit eher Pi mal Daumen bestimmt. Das reicht bei gutem Empfang ja auch und man muß keinen Mikrocontroller für die digitale Filterung spendieren.


Ich tüftele mal an einem DCF-Modul-Vergleichsprogramm, mit dem man zwei DCF-Module an zwei verschiedenen Pins gleichzeitig betreiben kann und die Software wertet die Unterschiede der beiden Module aus. Ich muß mal schauen, wie das am besten ausgewertet und dargestellt werden kann.

Bei ersten Versuchen in diese Richtung sieht es jedenfalls danach aus, als wenn ich es nicht aufrecht erhalten kann, dass das Pollin-Modul bei nur mäßigen Störungen gar kein Gezappel am Ausgang liefert. Es hat bei mäßigen Störungen nur weniger Gezappel am Ausgang als das Conrad-Modul. Was aber bestehen bleibt: Beim Conrad-Modul zappelt es um so mehr am Ausgang, je mehr Störungen auftreten, und das Pollin-Modul stellt sich einfach tot und läßt den Ausgang auf Ground, wenn die Störungen zu groß werden.

Das DCF-Modul-Vergleichsprogramm kann ich dann sicher auch leicht um Deinen Filter erweitern, dann kann man statt zwei DCF-Module einfach das ungefilterte und das gefilterte Signal direkt miteinander vergleichen. Mal schauen, da fällt mir bestimmt noch was ein.


Das Conrad Modul hingegen hat laut Datenblatt "300Hz Bandbreite". Deshalb muß es zappeliger sein.


Ich glaube, da liegt ein Irrtum vor. Die Angabe von "300Hz Bandbreite" bei so einem Modul bezieht sich mit Sicherheit nicht auf den Ausgang, sondern auf die Bandbreite des Eingangs. Im Datenblatt des Conrad-Moduls konnte ich dazu gar nichts finden, im Datenblatt des Pollin-Moduls wird es völlig klar:
- Empfangsfrequenz KHz typisch 77,5
- Frequenztoleranz (Antenne) Hz Minimal -300  Maximal +300
Das ist einfach die Frequenzabstimmung des Eingangskreises aus Ferritantenne und Kondensator.
Empfangsbereich des Moduls von 77,2 bis 77,8 KHz Empfangsfrequenz (77,5 KHz +/-300 Hz)
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 05, 2012, 06:27 pm
Hmmm, bei Gelegenheit schaue ich mal per FFT nach wie hoch die Bandbreite denn jetzt wirklich ist. Ich hatte jedenfalls irgendwo in einem Datenblatt dazu was von 300Hz Bandbreite gelesen. Ich finde das nur nicht mehr. Die Wahrheit zeigt am Ende aber sowieso nur eine Messung.

Klar, daß ein digitaler Ausgang keine "Bandbreite" hat. Die Frage ist aber wie denn das Signal intern aufbereitet wird. Beim C Modul vermutlich nur per Trigger und bei den Pollins per RC + Trigger. So zumindest meine Vermutung. Wenn die Vermutung stimmt, dann muß das C Modul zappeliger sein.

Sag bescheid wenn Du vor mir was rauskriegst.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 05, 2012, 08:29 pm

Klar, daß ein digitaler Ausgang keine "Bandbreite" hat. Die Frage ist aber wie denn das Signal intern aufbereitet wird. Beim C Modul vermutlich nur per Trigger und bei den Pollins per RC + Trigger. So zumindest meine Vermutung. Wenn die Vermutung stimmt, dann muß das C Modul zappeliger sein.

Sag bescheid wenn Du vor mir was rauskriegst.


So ich habe hier mal eine erste Version meines DCF-Modul-Testprogramms am Laufen.
Direkter Vergleich Pollin vs. Conrad DCF-Modul.

Die Auswertung erfolgt "traditionell", also zu kurze (<50 ms) Impulse werden verworfen, Impulse von 50...150 ms als 0-Bit und Impulse von 150...250 ms als 1-Bit interpretiert.

Anbei die Datenausgabe, normalerweise je Modul eine Zeile pro Sekunde.
Anbei 61 Sekunden Auswertung, von einem Minuten-Sync zum nächsten Minuten-Sync.

Erklärung der sechs Spalten wie folgt:

1. Spalte: P/C
Impuls vom Pollin oder Conrad DCF-Modul

2. Spalte: 0/1
Impuls wurde als 0-Bit oder 1-Bit decodiert

3. Spalte: Millisekunden des gültigen Impulses
Traditionelle Auswertung, 50...150 ms bei 0-Bit, 150...250 ms bei 1-Bit

4. Spalte: Anzahl der zu kurzen Impulse zwischen zwei gültigen Impulsen
Kurze Impulse unter 50 ms werden verworfen, die Zahl der verworfenen Impulse aufaddiert
und als Summe hier angezeigt, wenn der nächste gültige Impuls als Zeile ausgegeben wird

5. Spalte: millis()-Timer von Arduino beim Beenden des Impulses, nur die letzten 5 Stellen angezeigt
Die beiden ersten Ziffern der fünfstelligen Zahl kann man als Sekundenwerte interpretieren

6. Spalte: SYNC
Falls länger als 1500 ms kein gültiger Impuls empfangen wurde, wird beim Anzeigen
des nächsten gültigen Impulses SYNC angezeigt. Normalerweise sollte das nur beim
Minutenimpuls alle 60 Sekunden passieren. Wenn es "Zwischendurch" passiert, dann
ist aufgrund von Empfangsstörungen ein Impuls bei der Auswertung verlorgengegangen.
(In diesem Fall nicht, Störlevel gering)

Also
P/C 0/1 xxx yy millis() SYNC
mit xxx= Dauer des gültigen Impulses
yy= Anzahl der verworfenen zu kurzen Impulse vor diesem gültigen Impuls
millis()= die letzten fünf Stellen des millis()-Timers
SYNC= Falls 1500ms lang vorher kein gültiger Impuls empfangen wurde

Code: [Select]

P 0 108   0  79416 SYNC
C 0 150   5  79464 SYNC
P 1 212   0  80522
C 1 213   1  80544
P 0 107   0  81417
C 0 118   2  81438
P 0 103   0  82415
C 0 130   2  82458
P 1 209   0  83517
C 1 241   1  83558
P 0 110   0  84416
C 0 142   1  84457
P 0 116   0  85426
C 0 114   1  85438
P 1 203   0  86514
C 1 207   2  86535
P 1 204   0  87517
C 1 236   7  87560
P 0 111   0  88418
C 0 120   2  88440
P 0 103   0  89415
C 0 114   5  89443
P 1 209   0  90516
C 1 205   2  90529
P 0 101   0  91413
C 0  83  10  91424
P 0 102   0  92412
C 0 116   1  92437
P 0 107   0  93415
C 0 112   2  93433
P 0 108   0  94417
C 0 120   1  94435
P 0 115   0  95421
C 0 126   5  95448
P 0 107   0  96418
C 0 125   1  96455
P 1 212   0  97521
C 1 241   2  97568
P 0 105   0  98413
C 0 149   2  98469
P 1 215   0  99520
C 1 249   1  99555
P 0 112   0    419
C 0 131   5    458
P 0 103   0   1409
C 0 143   2   1454
P 1 206   0   2515
C 1 221   4   2537
P 0 108   0   3419
C 0 112   2   3440
P 1 211   0   4519
C 1 215   2   4532
P 0 107   0   5412
C 0 108   6   5425
P 1 210   0   6521
C 1 230   1   6569
P 1 210   0   7515
C 1 243   1   7555
P 1 208   0   8517
C 1 213   3   8535
P 0 113   0   9420
C 0 114   2   9429
P 0 111   0  10419
C 0 134   0  10448
P 1 206   0  11514
C 1 219   3  11543
P 1 207   0  12518
C 1 225   3  12546
P 0 112   0  13419
C 0 115   3  13444
P 1 206   0  14514
C 1 198   3  14527
P 1 216   0  15523
C 1 227   3  15546
P 0 104   0  16415
C 0 138   1  16459
P 1 207   0  17514
C 1 215   0  17534
P 0 103   0  18412
C 0  93   0  18421
P 0 103   0  19412
C 0 104   3  19438
P 0 107   0  20417
C 0 102   3  20439
P 1 206   0  21517
C 1 218   2  21544
P 1 204   0  22513
C 1 233   4  22555
P 0 106   0  23414
C 0 123   2  23448
P 0 116   0  24419
C 0 121   2  24430
P 1 213   0  25517
C 1 244   0  25557
P 0 109   0  26415
C 0 116   3  26436
P 0 109   0  27415
C 0 150   1  27466
P 1 207   0  28514
C 1 239   6  28552
P 0 108   0  29417
C 0 142   1  29472
P 1 205   0  30516
C 1 227   1  30540
P 0 101   0  31412
C 0 136   9  31458
P 0 109   0  32414
C 0 123   2  32444
P 1 210   0  33516
C 1 216   4  33534
P 0 107   0  34413
C 0 129   2  34452
P 0 106   0  35414
C 0 112   1  35431
P 0 107   0  36412
C 0 134   7  36451
P 0 109   0  37419
C 0 121   3  37443
P 0 110   0  39418 SYNC
C 0 129   2  39461 SYNC


Drei Dinge kann man an der Auswertung sehr schön sehen:

1. Das Conrad-Modul hinkt immer etwas hinterher!

Wenn das Pollin-Modul seinen Impuls bereits als "fertig eingelesen" anzeigt, braucht das Conrad-Modul immer noch ca. 10 bis 50 ms extra, bevor der Pegel denselben Status annimmt.

2. Die Conrad-Impulse sind im Schnitt länger als die Impulse des Pollin-Moduls!

3. Bei geringen Störpegeln wie zum Zeitpunkt dieser Auswertung liefert das Pollin-Modul noch ein völlig fehlerfreies Ausgangssignal. Die vierte Spalte mit der Anzahl der verworfenen zu kurzen Impulse zwischen zwei ausgewerteten Impulsen ist beim Pollin-Modul hier immer bei 0, während das Conrad-Modul da meist eine einstellige Zahl von Fehlimpulsen als Störzappler am Ausgang stehen hat.

Bei Gelegenheit werde ich das Programm nochmal um Deinen Filter erweitern und etwas allgemeiner halten, so dass man nicht nur zwei verschiedene Module gegeneinander testen kann, sondern auch beim selben Modul den ungefilterten gegen den gefilterten Ausgang darstellen kann.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 05, 2012, 11:20 pm
Merkwürdig. Wenn das C Modul ungefiltert wäre sollte es vor dem Pollin Modul anschlagen. Kannst Du die Modulanschlüsse mal vertauschen und schauen ob das C Modul immer noch hintendran ist?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 06, 2012, 07:54 am

Merkwürdig. Wenn das C Modul ungefiltert wäre sollte es vor dem Pollin Modul anschlagen. Kannst Du die Modulanschlüsse mal vertauschen und schauen ob das C Modul immer noch hintendran ist?


Anbei mal ein Datenauszug einer Minute, wo ich mitten in der Minute die Anschlüsse Pin2 und Pin3 der beiden Module am Arduino-Board vertauscht habe.

Code: [Select]

A 0 107   0  18886 SYNC
B 0 124   3  18916 SYNC
A 0 112   0  19890
B 0 128   4  19916
A 0 117   0  20893
B 0 131   5  20920
A 1 208   0  21986
B 1 212   2  22001
A 0 107   0  22883
B 0 112   0  22907
A 0 103   0  23883
B 0 134   1  23913
A 1 205   0  24986
B 1 222   2  25031
A 0 103   0  25884
B 0 113   2  25909
A 1 204   0  26983
B 1 197   3  26990
A 0 108   0  27888
A 0 100   0  28881
B 0 118  24  28908 SYNC
A 0 112   0  29887
B 0 117   3  29917
A 1 212   0  30988
B 1 204   1  30991
A 0 102   0  31883
B 0 118   8  31910
A 1 208   0  32985
A 0 105   0  33887
A 0 104   0  34884
B 0 123  19  34913 SYNC
A 0 113   0  35887
B 1 229   1  36007
A 1 202   0  36986
B 1 212   4  37010
A 0 105   0  37883
B 0 114   2  37903
A 1 202   0  38984
B 1 234   1  39028
A 1 210   0  39987
B 1 218   2  40007
A 0 101   0  40882
B 0  94   5  40898
A 0 115   0  41895
B 0 126   1  41931
A 0 111   0  42888
B 0 101   2  42896
A 1 210   0  43991
B 1 241   1  44029
A 0 110   0  44887
B 0 130   2  44938
A 0 108   0  45884
B 0 144   2  45933
A 0 112   0  46888
B 0 128   4  46910
A 1 207   0  47989
A 1 205   0  48984
A 1 207   0  49985
A 0 100   0  50880
B 0  77   3  52853 SYNC
B 1 205   1  53983
B 0 110   0  54888
B 1 211   0  55988
B 1 201   0  56982
A 1 209   0  57004 SYNC
B 0 106   0  57883
A 0 121   0  57908
B 0 106   0  58883
A 0 107   0  58895
B 0 103   0  59885
A 0  97   0  59897
B 0 107   0  60884
A 0 122   0  60911
B 0 108   0  61885
A 0 125   0  61919
B 1 203   0  62984
A 1 204   0  62995
B 0 109   0  63883
A 0 144   0  63931
B 1 209   0  64986
A 1 205   0  64996
B 0 102   0  65883
A 0 109   0  65896
B 0 103   0  66880
A 0 124   0  66913
B 1 209   0  67988
A 1 207   1  68006
B 0 111   0  68886
A 0 113   0  68897
B 1 202   0  69984
A 1 193   0  69992
B 0 107   0  70886
A 0  94   0  70895
B 0 112   0  71890
A 0 120   0  71914
B 1 208   0  72983
A 0  93   0  73671 SYNC
B 0 105   0  73882
A 1 158   1  73932
B 0 102   0  74881
A 0 104   6  74905
B 0 107   0  75883
A 0 117   2  75908
B 1 202   0  76984
A 1 210   0  77008
B 0 111   0  78889 SYNC
A 0 134   0  78919 SYNC


18xxx ... 46xxx => A=Pollin, B=Conrad
47xxx ... 57xxx => 10 Sekunden für das händische Umstecken der Arduino-Anschlüsse
58xxx ... 78xxx => A=Conrad, B=Pollin

Das ist schon so: Die Conrad-Impulse dauern im Schnitt länger und sie sind später zuende als die Pollin-Pulse. Das kann natürlich auch an der Beschaltung liegen.

Das Pollin-Modul betreibe ich nur an 3.3V vom Uno-Board, da es laut Spezifikation nur bis max 3.5 V betrieben werden soll. Das Conrad-Modul hängt an 5 V mit einem 10K PullUp-Widerstand.
Pegel des Pollin-Moduls also 3.3 V und Pegel des Conrad-Moduls 5 V am Arduino-Eingang.

Jedenfalls bei dieser Beschaltung produziert das Conrad-Modul bei leichten Empfangsstörungen schon kurze Störimpulse am Ausgang, bei einem Störpegel, bei dem das Pollin-Modul noch völlig fehlerfreie Impulse am Ausgang liefert. In Sekunde 28xxx, 34xxx und 73xxx hat das Conrad-Modul sogar je einen Empfangsfehler (die Empfangsfehler während ich die Module umgesteckt habe außen vor).

Trotz des bei leichten Empfangsstörungen besseren Ausgangssignals scheint das Pollin-Modul keinen Filter eingebaut zu haben, der extra Zeit benötigt, sondern im Gegenteil: Beim Durchgang durch das Conrad-Modul scheint das Signal eher ein paar mehr Millisekunden extra zu benötigen als beim Durchgang durch das Pollin-Modul.

Ich bohre mein Testprogramm nochmal ein bisschen weiter auf, es fehlt noch
- Erkennung gedrehter Bits (wenn beide Module verschiedene Bits in derselben Sekunde auswerten)
- Möglichkeit zum Testen mit Deinem Filter gegen ein ungefiltertes Signal

Noch ein beobachteter Unterschied zwischen Pollin- und Conrad-Modul: Unterschiedliche Zeit bis zur Impuls-Synchronisation nach einer Störung. Wenn ich mal durch Einschalten einer Energiesparlampe in 60 cm Entfernung von den Antennen eine plötzlich auftretende, starke Empfangsstörung simuliere, dann verhalten sich die Module wie folgt:
- Pollin: Der Impuls kommt noch einige Sekunden lang normal, danach gar nichts mehr
- Conrad: Impulse am Ausgang werden sofort zappelig, wenn die starke Störung kommt

Beim Abschalten der starken Störung beobachte ich folgendes Verhalten:
- Pollin: Es dauert nach dem Entfernen der Störung ca. 15 Sekunden, bis wieder Impulse kommen
- Conrad: Sofort nach dem Entfernen der Störung wieder normale Impulsausgabe

Es sieht für mich so aus, als wenn das Conrad-Modul am Ausgang genau das anzeigt, was gerade empfangen wird. Das Ausgangssignal wird nur vom gerade aktuellen Eingangssignal beeinflußt.

Und das Pollin-Modul scheint einen Speicher zu haben, mit Hilfe dessen das Timing vergangener Impulse mit dazu herangezogen wird, um den aktuellen Impuls zu bewerten und auf den Ausgang zu geben. D.h. die Flankenanstiege vor 1, 2, 3, 4, 5 etc. Sekunden führen jeweils eine Sekunde später auch unmittelbar zum Flankenanstieg am Ausgang, wenn ein Flankenanstieg empfangen wird. Und das Modul muß dann quasi anhand des Signals nur noch entscheiden, ob die Flanke nach 100 oder 200 ms wieder runtergeht. Der Start des Signals wird dagegen nicht nur direkt vom aktuellen Empfang gesteuert, sondern auch vom Empfang 1, 2, 3, 4, 5 Sekunden davor, rein über eine Fortschreibung des Timings, wann der Impuls in den Sekunden davor anfing.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: mkl0815 on Dec 06, 2012, 11:51 am
@jurs: Könntest Du evtl. Dein Testprogramm zur Vergfügung stellen. Es wäre sicher für einige interessant, wie Du den Vergleich / die Auswertung umgesetzt hast.
Mario (ist einer der Interessierten :) )
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 06, 2012, 12:11 pm

@jurs: Könntest Du evtl. Dein Testprogramm zur Vergfügung stellen. Es wäre sicher für einige interessant, wie Du den Vergleich / die Auswertung umgesetzt hast.
Mario (ist einer der Interessierten :) )


Eigentlich schrieb ich ja, dass ich es erst noch fertigstellen möchte, aber wem unkommentiertes Programmlisting reicht, mit der Funktionsbeschreibung aus diesem Thread, für den kann ich es auch jetzt schon mal posten.

Wie gesagt, bisher nur "Standardauswertung" (alle Impulse <50ms als Störimpulse betrachten), Udos Filter ist noch nicht eingebaut, so dass nur zwei DCF-Module gegeneinander verglichen werden können, momentan aber nicht auch ein Modul mit seinem gefilterten Ausgang. Das kommt erst noch.

So wie der Code unten eingefügt ist:
Ausgang DCF-Modul A an Pin-2
Ausgang DCF-Modul B an Pin-3
(PullUp-Widerstände bei den Modulen nicht vergessen, die einen benötigen)

Ach ja: Ich habe keine zusätzliche LED als Empfangskontrolle angeschlossen, es blinkt nur die Pin13 LED, im Code könnt ihr Umstellen, ob sie im Takt des Modul-A oder des Modul-B blinken soll.

Code: [Select]


#define DCF_A_MODULE 2
#define DCF_B_MODULE 3
#define LED 13

char error[]="SYNC";
char noerror[]="";

void setup() {
Serial.begin(9600);
Serial.println();
pinMode(DCF_A_MODULE, INPUT);
pinMode(DCF_B_MODULE, INPUT);
pinMode(LED, OUTPUT);
}


boolean
  BdcfState,AdcfState,
  lastBdcfState=false,
  lastAdcfState=false;

long
  looptime,
  lastBdcfH,lastBdcfL,
  lastAdcfH,lastAdcfL,
  BdcfShortPulses,AdcfShortPulses,
  BdcfLastPulse,AdcfLastPulse,
  BdcfHighcycle,
  AdcfHighcycle;

void loop() {
  looptime=millis()%100000L; // last 5 digits
  AdcfState=digitalRead(DCF_A_MODULE);
  BdcfState=digitalRead(DCF_B_MODULE);
  digitalWrite(LED,BdcfState);
  CheckForHighCycle(looptime, AdcfState, lastAdcfState, AdcfHighcycle, lastAdcfH, lastAdcfL, AdcfShortPulses);
  CheckForHighCycle(looptime, BdcfState, lastBdcfState, BdcfHighcycle, lastBdcfH, lastBdcfL, BdcfShortPulses);
  printIfValidPulse('A', looptime, AdcfHighcycle, AdcfLastPulse, AdcfShortPulses);
  printIfValidPulse('B', looptime, BdcfHighcycle, BdcfLastPulse, BdcfShortPulses);
}

void printIfValidPulse(char c, long ltime, long &Highcycle, long &LastPulse, long &ShortPulses)
{
  char *msg;
  char buf[32];
  int bitval;
  if ((Highcycle>=50)&&(Highcycle<=250))
  {
   if (looptime>LastPulse+1500) msg=error; else msg=noerror;
   LastPulse=looptime;
   if (Highcycle>150) bitval=1; else bitval=0;
   sprintf(buf,"%c %d %3ld %3ld %05ld %s", c,bitval, Highcycle, ShortPulses,looptime,msg);
   Serial.println(buf);
   Highcycle=0;
   ShortPulses=0;
}
}

void CheckForHighCycle(long looptime, boolean &State, boolean &lastState, long &Highcycle, long &lastH, long &lastL, long &ShortPulses)
{
  if (State!=lastState)
  {
    if (State==LOW)
    {
      Highcycle=looptime-lastH;
      if (Highcycle<50) ShortPulses++;
      lastL=looptime;
    }
    else lastH=looptime;
    lastState=State;
  }
}


Soweit ich das überblicke, gibt es handelsüblich vier DCF-Module in Deutschland:
- Conrad-DCF-Modul
- Pollin-DCF-Modul
- ELV-DCF-Modul
- Reichelt-DCF-Modul

Hast Du auch zwei verschiedene Module zum Testen?
Oder möchtest Du sogar zwei identische Module gegeneinander testen?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 06, 2012, 06:37 pm
@Jurs: das was Du beschreibst deutet darauf hin, daß das Pollin Modul bei 1 Hz mit dem Signal phasenverriegelt. Das ist genau das, was ich in der nächsten Ausbaustufe auch tun werde. Die Preisfrage ist was das Modul danach damit anfängt. Auf jeden Fall ist das ein guter Ansatz.

So wird man den Phasenfehler / die Phasenverschiebung durch einen einfachen Tiefpassfilter los.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: mkl0815 on Dec 06, 2012, 08:58 pm

Hast Du auch zwei verschiedene Module zum Testen?
Oder möchtest Du sogar zwei identische Module gegeneinander testen?

Aktuell habe ich gerade einen alten Conrad-Wecker beim Wickel, dem ich mal versuchen werde das DCF-Modul zu entlocken. Die Schaltung ist auf der Platine recht gut separiert und läuft mit 3V (2xAA Batterie). Zum MC des Weckers gehen 2 Leiterbahnen. Die größte Herausforderung wird wohl, an die 0,2mm Leiterbahnen einen Draht zu löten :-)
Dann kann ich anfangen zu testen. Ich werde auf jeden Fall berichten.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 07, 2012, 01:20 pm

@Jurs: das was Du beschreibst deutet darauf hin, daß das Pollin Modul bei 1 Hz mit dem Signal phasenverriegelt.


OK, dann habe ich wieder einen Fachbegriff zu einem Sachverhalt gelernt, den ich mühsam per Wortschwall umschrieben habe:
Phasenverriegeltes Signal

But anyway, jetzt wo ich anfange, das Signal und das mit Deinem Filter gefilterte Signal mal etwas näher auszuwerten (nur per Arduino-Sketch, ein Oszilloskop habe ich nicht), kommen mir bei Deinem Filter doch immer mehr Zweifel, auch beim Conrad-Modul.

Mal eine kurze Rückfrage zu diesem Bild:
http://blinkenlightblog.files.wordpress.com/2012/11/c05_simple_pulse_train_noise_60_1000.png

Hast Du ein Oszilloskop und mit Deinem Conrad-Modul tatsächlich bei DCF-Störungen einen solchen Signalverlauf am Ausgang per Oszilloskop zu sehen bekommen?

Oder ist das ein rein von Dir angenommener Signalverlauf bei Störungen, der nicht mit einem Oszilloskop an einem realen DCF-Modul verifiziert wurde?

Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: sth77 on Dec 07, 2012, 01:41 pm

Hast Du ein Oszilloskop und mit Deinem Conrad-Modul tatsächlich bei DCF-Störungen einen solchen Signalverlauf am Ausgang per Oszilloskop zu sehen bekommen?

Oder ist das ein rein von Dir angenommener Signalverlauf bei Störungen, der nicht mit einem Oszilloskop an einem realen DCF-Modul verifiziert wurde?


Hallo, ich bin fleißiger Mitleser, allerdings beruflich bedingt noch nicht viel zum Testen meiner DCF-Module (von Pollin und Conrad) gekommen. Ein 2-Kanal-50MHz-Oszilloskop hätte ich, wenn es konkrete Signalverläufe (z.B. beide Module an jeweils einem Kanal) darzustellen gilt, könnte ich die wohl auch liefern.

Meine damaligen Erkenntnisse habe ich hier festgehalten: http://sth77.blogspot.de/2012/06/projekt-analoguhr-teil-3.html Auf den viel zu kleinen Bildern erkennt man den Signalverlauf nicht besonders gut, das Video im Vollbildmodus scheint mir da besser geeignet.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 09, 2012, 01:10 pm

Hallo, ich bin fleißiger Mitleser, allerdings beruflich bedingt noch nicht viel zum Testen meiner DCF-Module (von Pollin und Conrad) gekommen. Ein 2-Kanal-50MHz-Oszilloskop hätte ich, wenn es konkrete Signalverläufe (z.B. beide Module an jeweils einem Kanal) darzustellen gilt, könnte ich die wohl auch liefern.

Meine damaligen Erkenntnisse habe ich hier festgehalten: http://sth77.blogspot.de/2012/06/projekt-analoguhr-teil-3.html Auf den viel zu kleinen Bildern erkennt man den Signalverlauf nicht besonders gut, das Video im Vollbildmodus scheint mir da besser geeignet.


Hallo, danke fürs Posten! Die von Dir gezeigten Signalverläufe passen eher zu dem, was mein Conrad-Modul auch liefert:

- Einschwingfehler bzw. "Prellen": Beim Wechsel des Pegels kann es sein,  dass ganz kurze Zeit danach der Pegel noch ein- oder mehrmals ganz kurz zurückschwingt und den Pegel mehrmals wechselt, bevor der Pegelwechsel endgültig vollzogen ist.

- Spikes: Kurze, oft nur einzelne Störungen während ein Pegel gesetzt ist, die nach wenigen Millisekunden wieder verschwinden

Das von Udo in Bild http://blinkenlightblog.files.wordpress.com/2012/11/c05_simple_pulse_train_noise_60_1000.png gezeigte Störverhalten, mit ständigen und extrem kurzfristigen Pegelwechseln als ein dem Signal überlagertes "stochastisches Rauschen mit hoher Frequenz" kann ich für keines meiner Module nachvollziehen.

Anyway, wer selber Testen möchte, für den habe ich mein DCF-Modul-Testprogramm nochmal etwas weiter aufgebohrt.

Mit demselben Sketch kann man nun durch Setzen eines #define Statements sowohl zwei DCF-Module anschließen und deren Signale gegeneinander vergleichen. Oder man kann ein DCF-Signal vom DCF-Modul gegen das per Softwarefilter gefilterte Signal vergleichen.

Folgende Daten werden angezeigt (erste vier Spalten):
A/B: Signale der beiden DCF-Module, oder ein DCF-Modul und dessen gefiltertes Signal
0/1: Es wurde ein 0-Bit oder 1-Bit erkannt
xxx: Zahl zwischen 50 und 250 mit der erkannten Dauer des Bits
Die vierte Spalte gibt die Anzahl der fehlerhaften (<50ms) Impulse an, die zuvor seit dem letzten gültigen Bit aufaddiert wurden

Folgende Fehler im Signalverlauf werden angezeigt:
- Summe der kurzen Pegelfehler (<50ms Pegelwechsel) zwischen zwei korrekten Impulsen (50 ... 250 ms)
- Bitfehler '#': Derselbe Eingang liefert zwei Bits nacheinander, das Bit des anderen Eingangs fehlt dazwischen
- Bitfehler '*':  Ein Eingang liefert innerhalb von weniger als 500ms ein anderes Bit als der andere Eingang
 (wobei aber nicht sicher ist, dass der mit * gekennzeichnete Eingang tatsächlich das falsche Bit geliefert hat)
- SYNC-Fehler: Ein Eingang liefert für mehr als 1500 ms überhaupt kein Bit (normal beim Minuten-Marker zur vollen Minute)

Die fünfstellige Zahl sind die letzten fünf Ziffern des millis() Timers

Beispiel:
B 0 124   0 24197
A 0 139   0 25168
B 1 178   0 25257*
A 1 218   1 26236
A 0 122   8 27148#
B 0 121   0 27197 SYNC
A 0 128   0 28149
B 0 129   0 28199

Erklärung:
In Sekunde 25xxx hat das B-Modul ein 1-Bit geliefert, aber das A-Modul ein 0-Bit, daher Bitfehler *

Bei Timer 27148 hat das A-Modul zweimal hintereinander gefeuert, daher Bitfehler #

Bei Timer 27197 tritt ein Sync-Fehler an Modul B auf, da das vorherige Bit von Modul B älter als 1500ms ist
(Modul B hatte davor zuletzt bei Timer 25257 gefeuert, und in Sekunde 26xxx gar nicht)

Na ja, das ist das beste, was ich als Auswertung herausholen konnte. Die Messung und Ausgabe der Werte verfälscht natürlich immer etwas das, was eigentlich genauestens vermessen werden soll. So dauert die Formatierung mit "printf" recht lange, Pegelwechsel werden also automatisch etwas "entprellt", ohne dass dies gewollt ist. Dadurch sieht das Signal des Conrad-Moduls etwas besser aus als es tatsächlich ist.

So wie das Programm unten einkopiert ist, dient es zum Testen von Udos Exponentialfilter.
Einfach DCF-Modul an Pin-2 hängen und Sketch laufen lassen mit Ausgabe über den seriellen Monitor.

Was man deutlich sieht: Der Exponentialfilter verzögert das DCF-Signal am gefilterten (B) Ausgang um ca. 50 ms.

Eine Verbesserung des Signals durch den Filter kann ich allerdings nicht feststellen, weder an einem mittelstark noch an einem stark gestörten Signal. Sobald der Störpegel hoch genug ist, dass die "High"-Pegel von Störsignalen zerhackt werden, so dass das Conrad-Modul keine einwandfreien Signale mehr liefert, ist auch das gefilterte Signal fehlerhaft (Sync-Fehler beim ungefilterten und beim gefilterten Signal in derselben Sekunde).

Nur sehr selten läßt sich durch das Filter eine gute Fehlerkorrektur erkennen wie hier:
A 0  70   1 68087
B 0  70   0 68137
A 0  51   0 69069
A 0 108   0 69186#
B 1 165   0 69233*
A 0  89   0 70087
B 0  90   0 70138

In Sekunde 69xxx feuert das Conrad-Modul zwei gültige Bits (51 und 108ms lang) in derselben Sekunde (Bitfehler #), aber das gefilterte Signal gibt nur ein einziges Bit aus, und zwar ein langes 1-Bit statt zweier kurzer 0-Bits, daher Bitfehler * angezeigt. Da man weiß, dass im DCF-Protokoll nur ein Bit pro Sekunde übertragen wird, kann man also davon ausgehen, dass das am gefilterten Ausgang(B) gelieferte 1-Bit korrekt ist und die zwei davor am A-Ausgang signalisierten 0-Bits falsch.

Im Schnitt ist auf dem gefilterten Signal zwar weniger Gezappel durch weniger Flankenwechsel, aber dabei gehen praktisch genau so viele Bits von Sekundenpulsen verloren wie bei der Auswertung des ungefilterten Signals. Denn das Gezappel durch Flankenwechsel tritt bei gestörtem Signal nicht gleichverteilt über das gesamte Signal auf, sondern bevorzugt um die Zeit herum, um die tatsächlich ein Flankenwechsel stattfindet. Und das läßt sich eigentlich auch durch ein einfaches Entprellen des Signals von wenigen ms gut herausfiltern.


Was ergeben Eure Tests?

Also meine anfängliche Euphorie über den Exponentialfilter und dass damit das Signal viel besser aussieht, konnte ich durch meine Messungen nun nicht mehr bestätigen. Zwar sind gefilterte Signale immer mindestens 50 ms lang, während ungefilterte Signale oft sehr zappelig sein können, aber da die Zappeligkeit fast nur um den eigentlichen Flankenwechsel herum auftritt, ist eigentlich auch das Originalsignal gut auswertbar.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 09, 2012, 01:11 pm
Hier das Testprogramm zum vorherigen Beitrag:

Code: [Select]


/*************************************************************************
Testprogramm zum Testen von DCF-Modulen und DCF-Softwarefiltern

Es können entweder zwei DCF-Module gegeneinander getestet werden
Dazu die zwei Dateneingänge mit den Pins DCF_A_MODULE und DCF_B_MODULE verbinden
und die Zeile "#define B_IS_FILTERED_A" auskommentieren

Oder es kann ein DCF-Modul gegen einen Softwarefilter getestet werden
Beispielhaft ist der hier vorgestellte Filter eingebaut:
http://arduino.cc/forum/index.php?topic=135153.0
Dazu das DCF-Modul an den Pin DCF_A_MODULE anschliessen und
die Zeile "#define B_IS_FILTERED_A" in den Code einfügen
(Der Pin DCF_B_MODULE bleibt dann frei.)
 
**************************************************************************/

// Pin fuer DATA-Ausgang des DCF-Moduls
#define DCF_A_MODULE 2

// Pin fuer DATA-Ausgang des zweiten DCF-Moduls oder den Software-Filter
#define DCF_B_MODULE 3

// die nachfolgende Zeile auskommentieren, wenn zwei Module getestet werden sollen
#define B_IS_FILTERED_A
// (wenn "#define B_IS_FILTERED_A" gesetzt ist, den Pin für das DCF_B_MODULE freilassen!)

// legt fest, an welchem Pin eine LED blinken soll
#define LED 13

#ifdef B_IS_FILTERED_A
 #include <MsTimer2.h>
#endif

char error[]="SYNC";
char noerror[]="";

void setup() {
 Serial.begin(9600);
 Serial.println();
 pinMode(DCF_A_MODULE, INPUT);
 pinMode(DCF_B_MODULE, INPUT);
 pinMode(LED, OUTPUT);
#ifdef B_IS_FILTERED_A
 pinMode(DCF_B_MODULE, OUTPUT);
 MsTimer2::set(1, low_pass_filter);
 MsTimer2::start();
#endif
}

#ifdef B_IS_FILTERED_A
void low_pass_filter() {
   // http://en.wikipedia.org/wiki/Low-pass_filter#Continuous-time_low-pass_filters
   // I will use fixed point arithmetics with 5 decimals
   const uint16_t decimal_offset = 10000;
   static uint32_t smoothed = 0*decimal_offset;
   const uint32_t input = digitalRead(DCF_A_MODULE) * decimal_offset;
//    const uint32_t input = analogRead(dcf77_analog_sample_pin)>200? decimal_offset: 0;
   // compute N such that the smoothed signal will always reach 50% of
   // the input after at most 50 samples (=50ms).
   // N = 1 / (1- 2^-(1/50)) = 72.635907286
   const uint16_t N = 72;
   smoothed = ((N-1) * smoothed + input) / N;
   // introduce some hysteresis
   static uint8_t square_wave_output = 0;
   if ((square_wave_output == 0) == (smoothed >= decimal_offset/2)) {
       // smoothed value more >= 50% away from output
       // ==> switch output
       square_wave_output = 1-square_wave_output;
       // ==> max the smoothed value in order to introduce some
       //     hysteresis, this also ensures that there is no
       //     "infinite memory"
       smoothed = square_wave_output? decimal_offset: 0;
     digitalWrite(DCF_B_MODULE, square_wave_output);   //changed jurs
   }
}
#endif


boolean
 BdcfState,AdcfState,
 lastBdcfState=false,
 lastAdcfState=false;

byte
 AdcfBitval,BdcfBitval;

long
 looptime,
 lastAdcfH,lastAdcfL,
 lastBdcfH,lastBdcfL,
 AdcfShortPulses,BdcfShortPulses,
 AdcfLastPulse,BdcfLastPulse,
 AdcfHighcycle, BdcfHighcycle;

void loop() {
//  looptime=millis()%100000L; // last 5 digits
 looptime=millis();
 AdcfState=digitalRead(DCF_A_MODULE);
 BdcfState=digitalRead(DCF_B_MODULE);
 digitalWrite(LED,BdcfState);
 CheckForHighCycle(looptime, AdcfState, lastAdcfState, AdcfHighcycle, lastAdcfH, lastAdcfL, AdcfShortPulses);
 CheckForHighCycle(looptime, BdcfState, lastBdcfState, BdcfHighcycle, lastBdcfH, lastBdcfL, BdcfShortPulses);
 printIfValidPulse('A', looptime, AdcfHighcycle, AdcfLastPulse, AdcfShortPulses, AdcfBitval, BdcfBitval, BdcfLastPulse);
 printIfValidPulse('B', looptime, BdcfHighcycle, BdcfLastPulse, BdcfShortPulses, BdcfBitval, AdcfBitval, AdcfLastPulse);
}

void printIfValidPulse(char c, long ltime, long &Highcycle, long &LastPulse, long &ShortPulses, byte &Bitval, byte OtherBitval, long LastOtherPulse)
{
 char *msg;
 char bitError;
 char buf[32];
 if ((Highcycle>=50)&&(Highcycle<=250))
 {
  // Falls mehr als 1500 ms kein Impuls ==> SYNC (Minutenimpuls oder Sync-Error)
  if (looptime>LastPulse+1500) msg=error; else msg=noerror;
  // > 150 ms HIGH => 1-Bit, 50...150 ms HIGH => 0-Bit
  if (Highcycle>150) Bitval=1; else Bitval=0;
  // Biterror falls innerhalb der letzten 500 ms ein anderes Bit am anderen Eingang gemeldet wurde
  bitError=' ';
  // Biterror erkennen, falls weniger als 500 ms vorher ein anderes Bit am anderen Eingang erkannt wurde
  if ((looptime<LastOtherPulse+500)&&(Bitval!=OtherBitval)) bitError='*';
  // Biterror erkennen, falls der letzte Pulse vom selben Eingang kam
  if (LastPulse>LastOtherPulse) bitError='#';

  LastPulse=looptime;
  sprintf(buf,"%c %d %3ld %3ld %05ld%c%s", c, Bitval, Highcycle, ShortPulses,looptime%100000L,bitError,msg);
  Serial.println(buf);
  Highcycle=0;
  ShortPulses=0;
}
}

void CheckForHighCycle(long looptime, boolean &State, boolean &lastState, long &Highcycle, long &lastH, long &lastL, long &ShortPulses)
{
 if (State!=lastState)
 {
   if (State==LOW)
   {
     Highcycle=looptime-lastH;
     if (Highcycle<50) ShortPulses++;
     lastL=looptime;
   }
   else lastH=looptime;
   lastState=State;
 }
}


Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: And1G on Dec 10, 2012, 12:46 am
Interessanter Beitrag! Bin aber leider ebenfalls aus Zeitgründen noch nicht zum Testen gekommen. Hoffentlich schaffe ich das noch vor den nächsten Semesterferien  :smiley-eek-blue:

Aber eine Frage kommt mir doch auf:
Du tastest mit einer Frequenz von 1 kHz ab. Fehlt da nicht noch irgendeine Form von analogem Tiefpass vor der digitalisierung, damit höherfrequente Störungen nicht in den niederfrequenten Teil des Spektrums rutschen?
Soetwas haben wir jedenfalls zum Thema Analog-Digitalwandlung in Verbindung mit digitaler Regelung in einer Vorlesung gehört...
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: mkl0815 on Dec 10, 2012, 10:54 am
Ich habe am Wochenende auch mal den DCF-Empfänger aus dem Conrad-Wecker ausgeschnitten. Die beiden Leiterbahnen die zum MC des Weckers gingen habe ich auf zwei digitale Eingänge gelegt. Einer liefert eine 1, der andere eine 0, daher vermute ich mal Signal und invertiertes Signal. Allerdings habe ich bisher noch keinerlei Änderungen an den Ausgängen feststellen können, ich muss mir noch eine bessere Position für den Aufbau suchen, zur Zeit sind da zu viele Netzteile und Monitore in der näheren Umgebung.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: sth77 on Dec 10, 2012, 11:08 am

Die beiden Leiterbahnen die zum MC des Weckers gingen habe ich auf zwei digitale Eingänge gelegt. Einer liefert eine 1, der andere eine 0, daher vermute ich mal Signal und invertiertes Signal. Allerdings habe ich bisher noch keinerlei Änderungen an den Ausgängen feststellen können, ich muss mir noch eine bessere Position für den Aufbau suchen, zur Zeit sind da zu viele Netzteile und Monitore in der näheren Umgebung.

Es ist zwar richtig, dass die DCF-Module von Conrad auch einen invertierten ausgang haben, so recht kann ich mir das bei einer Funkuhr jedoch nicht vorstellen. Da halte ich es eher für einen Eingang, um das Modul zu Stromsparzwecken ein- und ausschalten zu können.
Die Wikipedia schreibt im Funkuhr-Artikel dazu:
Quote
Obwohl das Zeitsignal kontinuierlich gesendet wird, wird es aus Stromspargründen oft nur ab und zu zum Nachstellen abgefragt. Bei Uhren, die mit größeren Zellen betrieben werden, ist ein Empfang jede volle Stunde üblich, bei Armbanduhren mit Knopfzellen oder mit Solarzellen nur einmal pro Tag, meistens zwischen 2:00 und 4:00 Uhr morgens.

Einen entsprechenden Eingang haben bspw. auch die Pollin-Module.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: mkl0815 on Dec 10, 2012, 12:13 pm
Hmm, guter Tipp. Bei den Pollin-Modulen wird der ON/OFF Eingang glaub ich auf Masse gezogen, um das Modul zu aktivieren. Ich werde das heute Abend mal testen.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 10, 2012, 07:08 pm
Quote

Du tastest mit einer Frequenz von 1 kHz ab. Fehlt da nicht noch irgendeine Form von analogem Tiefpass vor der digitalisierung, damit höherfrequente Störungen nicht in den niederfrequenten Teil des Spektrums rutschen?


Wieso sollte es einen analogen Tiefpass brauchen? Der exponentielle Filter ist doch ein Tiefpass. "Analoge" Filter sind nicht auf magische Weise besser.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: And1G on Dec 10, 2012, 07:50 pm
Kann der Digitale Filter denn die Aliaseffekte ausgleichen, die BEIM Abtasten entstehen?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 11, 2012, 06:06 pm
And1G: ich dachte Du hast eine Vorlesung zu dem Thema gehört. Wieso fragst Du dann mich? Und vor allem wieso stellst Du Dich dumm? Selbstverständlich kann überhaupt kein Filter Alias Effekte ausgleichen die ins Passband rutschen. Die Frage ist nur: treten die tatsächlich auf? in meinem Fall also: gibt es Überlagerungen die nahe bei 500 Hz oder einer Oberwelle davon sind? Bei einem Empfänger der eine Bandbreite von wohel eher <300 Hz hat? Ich würde sagen nein. Wenn Du aber anderer Meinung bist, dann belege das doch bitte etwas genauer. Auf die Begründung bin ich mal gespannt.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: And1G on Dec 11, 2012, 08:34 pm
Warum ich frage? Na weil meine bisherigen Kenntnisse etwas anderes sagen als das was du realisiert hast. Da wundert man sich und stellt dann halt eine Frage, ganz normaler Vorgang. Es hätte ja durchaus sein können, dass irgendetwas da zwischendurch eingekoppelt wird.
Kein Grund sich gleich angegriffen zu fühlen oder so genervt zu reagieren.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Dec 11, 2012, 08:46 pm
Dir ist aber schon klar, daß meine Implementation funktioniert? Von daher ist die Frage

Quote
Kann der Digitale Filter denn die Aliaseffekte ausgleichen, die BEIM Abtasten entstehen?


schon etwas offensiv. Dass dich das wundert war aus der Frage nicht zu ersehen. Die hat sich vom Ton eher angehört wie: "Du hast nur Glück und weisst vermutlich nicht was Du tust". Hast Du Dir die Quellen auf meiner Seite angesehen. Ich habe die gelesen und ausreichend weit verstanden.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 16, 2012, 01:20 pm
Ich habe mal eine blöde Frage.
Ich experimentiere gerade mit dem Filter rum und hätte aber gerne den I2C frei.
Deshalb wollte ich den Eingangspin für das DCF77-Modul ändern.
Ich dachte dies geht hier:
Code: [Select]
const uint8_t dcf77_sample_pin = 19; // A5
19 = Analog 5
Wenn ich, sagen wir mal Analog 1 haben will:
Code: [Select]
const uint8_t dcf77_sample_pin = 15; // A1
Aber dann macht er nichts mehr.

Wo denke ich falsch?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 16, 2012, 02:05 pm

Aber dann macht er nichts mehr.

Wo denke ich falsch?


Wenn Du Dich auf den Original-Code beziehst:

> const uint8_t dcf77_sample_pin = 19; // A5
> const uint8_t dcf77_analog_sample_pin = 5;
...
>    //const uint32_t input = digitalRead(dcf77_sample_pin) * decimal_offset;
>    const uint32_t input = analogRead(dcf77_analog_sample_pin)>200? decimal_offset: 0;

Deklariert sind sowohl dcf77_sample_pin als auch dcf77_analog_sample_pin.

Die auskommentierte Codezeile bezieht sich auf dcf77_sample_pin und die ausgeführte Codezeile aber auf dcf77_analog_sample_pin.

Wenn Du den Code so verwendest, mußt Du entweder
- die Deklaration für dcf77_analog_sample_pin ändern.
oder
- die Codezeile verwenden, in der dcf77_sample_pin verwendet wird und die andere auskommentieren.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 16, 2012, 02:12 pm
Jetzt wo Du es sagst.  :smiley-eek:

Hab ich nicht gesehen.

Danke!
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 17, 2012, 04:40 pm
Ich glaube ich werde das nie lernen mit den Variablen Typen.
Ich versuche gerade das Funkuhrsignal in eine RTC zu schreiben.
von der Funkuhr bzw der Time.h bekomme ich ja :
Code: [Select]
sekund() minute() hour() year() month() day()
Das sind int wenn ich mich nicht irre. Diese werden mir auch schön im seriellen Monitor angezeigt:
Quote
17.12.2012 16:31:02


So die RTC (ich habe hier eine softI2C) nimmt die Daten richtig an wenn ich sie so schreibe:
Code: [Select]
uint8_t d[4];
d[3]=0x12; // Jahr
d[2]=0x12; // Monat
d[1]=0x16; // Tag
d[0]=0x01; // Wochentag

Das ist HEX-Schreibweise wenn ich mich nicht irre.
Wenn ich jetzt einfach die ints versuche zu übergeben sieht meine ausgelesene RTC so aus;
Quote
RTC: 11.0C.2001 01:1F:01

Das ist irgendwie falsch!
Gehe ich recht in der Annahme das ich aus dem int ein HEX machen muss?
Und wenn ja, wie?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 17, 2012, 04:58 pm

Gehe ich recht in der Annahme das ich aus dem int ein HEX machen muss?
Und wenn ja, wie?


Nein, Du mußt nur Deine RTC-Library korrekt anwenden!

Dazu schaust Du nach, welche RTC-Library Du installiert hast (da gibt es wohl viel mehr als nur eine).
Dann lädst Du Dir das Beispielprogramm zu dieser RTC-Library in Deine Arduino-Software.
Dann studierst Du das Beispielprogramm.

Beispielprogramme sind kommentiert und in den Programmkommentaren stehen die notwendigen Hinweise, wie die Library angewendet wird.

Mit 0x beginnende Zahlen sind unter C die Hex-Schreibweise im 16er System
0x12 = 1*16 + 2 = 18
0x16 = 1*16 + 6 = 22
0x01 = 0*16 + 1 = 1
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 17, 2012, 05:43 pm
Dies versuche ich ja!

Ich habe, wie gesagt, die softi2c nennt sich i2cMaster.
Das Beispiel Programm habe ich offen.

Und dort ist folgendes interessant:
wenn ich die Zeit stellen will wird dies aufgerufen:
Code: [Select]
uint8_t bcdRead(uint8_t min, uint8_t max, uint8_t &n) {
  uint16_t v;
  if (!hexRead(v)) return false;
  uint8_t d = 10 * (v >> 4) + (v & 0XF);
  if ((v >> 4) > 9 || (v & 0XF) > 9 || d < min || d > max) {
    PgmPrintln("Invalid");
    return false;
  }
  n = v;
  return true;
}

Was ich hier noch verstehe ist das hexRead aufgerufen wird.
dann kommt etwas was ich nicht verstehe. (uint8_t d = 10 * (v >> 4) + (v & 0XF);)
Und dann wird geschaut ob die Werte gültig sind.

hexRead:
Code: [Select]
uint8_t hexRead(uint16_t &v) {
  uint16_t n = 0;
  while (!Serial.available());
  while (Serial.available()) {
    uint8_t c = Serial.read();
    n <<= 4;
    if ('a' <= c && c <= 'f') {
      n += c - ('a' - 10);
    }
    else if ('A' <= c && c <= 'F') {
      n += c - ('A' - 10);
    }
    else if ('0' <= c && c <= '9') {
      n +=  c - '0';
    }
    else {
      PgmPrintln("Invalid entry");
      return false;
    }
    delay(10);
  }
  v = n;
  return true;
}

es wird gewartet bis was über Seriell rein kommt.
Dann werden die kommenden Daten in c gelesen
dann wird geschaut ob die Werte Zahlen sind (so denke ich)
und der rest ist wieder Bahnhof.



Hier wird die RTC beschrieben:
Code: [Select]
uint8_t writeDS1307(uint8_t address, uint8_t *buf, uint8_t count) {
  // issue a start condition, send device address and write direction bit
  if (!rtc.start(DS1307ADDR | I2C_WRITE)) return false;

  // send the DS1307 address
  if (!rtc.write(address)) return false;

  // send data to the DS1307
  for (uint8_t i = 0; i < count; i++) {
    if (!rtc.write(buf[i])) return false;
  }

  // issue a stop condition
  rtc.stop();
  return true;
}


Und wenn ich mir das anschaue würde ich sagen uint8_t *buf sollte mein Wert sein.
Also ein INT würde ich vermuten. Aber meine sekund() usw sind doch INTs

Und weil ich das nicht verstehe komme ich nicht weiter.

Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 17, 2012, 06:30 pm

Und weil ich das nicht verstehe komme ich nicht weiter.


Ich glaube, Du verhedderst Dich da in den Untiefen von Umrechnungen mit Zahlensystemen, von denen Du weder etwas verstehst noch dass Du sie benötigst.

BCD Zahlen sind Binary Coded Dezimals, binärcodierte Dezimalzahlen:
http://de.wikipedia.org/wiki/BCD-Code
Damit kann man jede dezimale Ziffer von 0 bis 9 mit vier Bits darstellen.

Das wirst Du mit Sicherheit alles gar nicht benötigen.

Was Du immer benötigst, wenn es um Zeiten geht, das ist die Unix-Zeit.

Das ist ein long integer (32-Bit) Ganzzahlenwert mit der Anzahl der Sekunden seit dem 01.01.1970.

DAS ist es, womit Programmierer ihre Uhrzeiten handeln. Und wenn Du irgendeine Zeit-Library hast, dann gibt es einerseits bequeme Funktionen, um Tag, Monat, Jahr, Stunde, Minute, Sekunde in Unixzeit umzurechnen. Und umgekehrt genauso.

Und für Deine RTC-Library gibt es mit ziemlicher Sicherheit sowohl eine Schreibfunktion, der Du die Unixzeit übergeben kannst und auch eine Lesefunktion, von der Du die Unixzeit aus der Uhr geliefert bekommst.

Du hast es also im Endeffekt nur mit vier Funktionen zu tun, und die fressen allesamt Dezimalzahlen:

1. Eine Umrechenfunktion von Tag, Monat, Jahr, Stunde, Minute, Sekunde in Unixzeit
2. Eine Umrechenfunktion von Unixzeit in Tag, Monat, Jahr, Stunde, Minute, Sekunde
3. Eine Uhr-Stellen Funktion, die eine Unixzeit zum Stellen der RTC übergeben bekommt
4. Eine Uhr-Abfragen Funktion, die eine Unixzeit von der RTC geliefert bekommt

Wenn Du diese vier Funktionen bei Dir nicht findest, schreib mal genau, welche Time- und Realtime-Libraries Du installiert hast, dann schau ich mal in die Library rein!

Und Zahlensysteme wie Binärsystem, Hexadezimalsystem, und BCD-Zahlen kannst Du sicher getrost auf Lücke setzen, wenn Du nur eine Uhr stellen oder abfragen oder mit Zeiten rechnen möchtest, das sollte alles mit Dezimalzahlen zu erschlagen sein.

Unter "i2cmaster" finde ich nur eine Library, die was mit LCD-Displays zu tun hat, nicht mit RTC Uhren.








Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 17, 2012, 06:54 pm
Also,
ich habe folgende Libraries die ich nutze:
softi2c von folgender Seite: (erster Beitrag)
http://forums.adafruit.com/viewtopic.php?f=25&t=13722 (http://forums.adafruit.com/viewtopic.php?f=25&t=13722)
die Heißt dann I2cMaster

Time.h (Standard)

Hier aus diesem Fred:
DCF77.h
MsTimer2.h

Ich habe auch schon versucht die Libraries zu analysieren aber ich komme eben nicht weiter, deshalb frag ich.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 17, 2012, 07:33 pm

Also,
ich habe folgende Libraries die ich nutze:
softi2c von folgender Seite: (erster Beitrag)
http://forums.adafruit.com/viewtopic.php?f=25&t=13722 (http://forums.adafruit.com/viewtopic.php?f=25&t=13722)
die Heißt dann I2cMaster

Time.h (Standard)

Hier aus diesem Fred:
DCF77.h
MsTimer2.h

Ich habe auch schon versucht die Libraries zu analysieren aber ich komme eben nicht weiter, deshalb frag ich.


Das ist jetzt aber nicht Dein Ernst, oder?

Du hast keine RTC-Library für Deine RTC in Verwendung?
Warum denn das nicht?

Als normaler Arduino-Anfänger macht man es so:
1. Man schaut nach, was für ein Uhrenbaustein auf der RTC verbaut ist, z.B. ein Dallas 1307
2. Dann sucht man eine Arduino-Library zur Ansteuerung, z.B. für einen Dallas 1307
3. Dann verwendet man die Funktionen der Library zum Auslesen und Einstellen der Uhr

Was Du da vorhast, die Bit-Schubsereien über den I2C-Bus selbst zu codieren, ist absolut NICHT anfängergeeignet.

Anfängergeeignet zum Stellen und Auslesen einer RTC mit dem gängigen Dallas 1307 Chip wäre beispielsweise so eine Library:
https://github.com/adafruit/RTClib
Vielleicht passt's ja und Du hast eine RTC mit 1307, dann schau da mal rein!
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 17, 2012, 07:46 pm
Vielleicht drücke ich mich nur nicht richtig aus.

Die RTClib, die Du verlinkt hast, habe ich. Würde auch funktionieren. Möchte ich für meinen Anwendungsfall aber nicht nutzen.
Es sei denn ich kann sie auf andere PINs legen.

Die Lib die ich hier nutze (I2cMaster) Funktioniert mit dem Beispiel auch.
In meiner Umsetzung funktioniert es auch wenn ich die Daten mal zum Testen hard code:
Code: [Select]
...
d[1]=0x17;
...
writeDS1307(3, d, 4)

Für Heute den 17ten.

Nur leider ist zwischen day() der Time-Lib und 0x17 ein unterschied.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_x on Dec 17, 2012, 08:06 pm
Das ist BCD ;)
Binär Codierte Dezimal - Zahlen:  4 Bit Einerstelle, 2 bis 4 Bit Zehnerstelle.

pups-einfach: Schau auf Seite 5 dieses Datenblatts, http://www.sparkfun.com/datasheets/Components/DS1307.pdf
Da ist jedes Bit der 7 Datenbytes einer 1307 beschrieben.
(jedenfalls einfacher als auf einem Arduino mit Unix-Zeit rumzumachen)

Quote
Nur leider ist zwischen day() der Time-Lib und 0x17 ein unterschied.

Code: [Select]
byte day() {
byte ram = readDS1307Byte(3); // offset des DS1307 Bytes mit dem Kalendertag.
return (ram>>4)*10 + ram&0x0f;
}

Dafür brauchst du wirklich keine Library ;)

Quote
Es sei denn ich kann sie auf andere PINs legen.

I2C sollte man nicht auf andere Pins legen...
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Dec 17, 2012, 08:11 pm

Möchte ich für meinen Anwendungsfall aber nicht nutzen.


Wenn Du es auf die harte Tour tun willst, wirst Du nicht umhin kommen, Dich in das ganze Klein-Klein der Bit-Schubsereien gründlich einzuarbeiten.


d[1]=0x17;
...
Für Heute den 17ten.


0x17 ist ja auch nicht 17, sondern 0x17 ist 1*16+7=23.
;-)
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_x on Dec 17, 2012, 08:27 pm


0x17 ist ja auch nicht 17, sondern 0x17 ist 1*16+7=23.
;-)

Manchmal eben doch.
BCD ist einfach, das konnten MicroController schon, als sie noch nicht Mikro waren und noch aus Relais gebaut wurden ;)
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 17, 2012, 08:37 pm
OK, dann haken wir das Thema jetzt hier ab und ich frage was ganz anderes:

Ich möchte sozusagen ein Shield basteln welches nur eine Aufgabe hat:
DCF77 auswerten und in eine RTC schreiben.

Es soll dann möglich sein mit dem Arduino von dem Shield folgende Informationen zu bekommen:
1. Uhrzeit (aus der RTC)
2. Wann wurde zuletzt gesynct
3. Haben wir noch eine richtige Zeit
4. Es soll möglich sein den SQW/Out zu konfigurieren dieser soll an einen Pin anliegen
Solche Sachen halt. Einfach die Auswertung und Vorhaltung der aktuellen Zeit outsourcen.

Und da die Kommunikation zwischen RTC und uC unabhängig laufen sollte wollte ich diesen I2C-Bus auf anderen Pins haben.
Und die Hardware I2C soll dann später mit dem Arduino kommunizieren.

Die Frage ist wenn ich die Hardware-I2C nutze kann ich da nicht wild umher funken oder?

Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_x on Dec 17, 2012, 10:27 pm
Quote
Die Frage ist wenn ich die Hardware-I2C nutze kann ich da nicht wild umher funken oder?


Wenn nur ein Master da ist, kann der "wild umher funken".
"DCF77 Auswertung in eine RTC schreiben" sollte dann der gleiche Arduino (?) machen, der auch den Rest macht.

Die gefilterte Zeit der DCF kommt doch immer noch mit nur ca. 1 bit / sek, oder hab ich da was nicht mitgekriegt ?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 18, 2012, 03:33 pm
Das Shield kümmert sich um alles was mit Zeit zu tun hat, so mein Plan!
Ursprünglich hatte ich gehofft das man auf dem Shield nicht umbedingt einen 328 braucht sondern was kleineres.


mom ich versuch das mal zu krickeln....


(http://bamboodock.wacom.com/uploaded_resource/fc0371b6-f0b4-4308-a9e6-831ea5edb958.jpg)

Ein Kunstwerk, oder?

So, und jeder der Eine Uhr bauen will steckt dieses Modul auf und hat über I2C immer die aktuelle Uhrzeit.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_x on Dec 18, 2012, 04:18 pm
Auf dem Shield könnte evtl.  softi2c (http://todbot.com/blog/2010/09/25/softi2cmaster-add-i2c-to-any-arduino-pins/)sinnvoll sein...

Soll das Shield sich zum Arduino genau wie eine DS1307 - RTC verhalten, damit alle Libraries gehen ?

"Wild umherfunken" ist natürlich nicht, da hast du Recht ;)

Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: MueThoS on Dec 18, 2012, 04:23 pm
Hatte ich jetzt noch nicht drüber nach gedacht aber Du hast recht!
Wir halten fest das Shield soll sich so verhalten wie die DS1307 RTC.
Ich glaube ich mach doch mal einen eigene Fred auf für das Dingen.

Zu meinem Thema geht es hier (http://arduino.cc/forum/index.php/topic,138073.msg1036901.html#msg1036901) weiter.

Dann mülle ich den Wissenschaftlichen Teil hier nicht weiter voll. Den hab ich sowieso nicht verstanden  :~
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Jan 01, 2013, 04:07 pm
Ausbaustufe 1 meines DCF77 Projekts ist hier:

http://blog.blinkenlight.net/2013/01/01/dcf77-project-part-1-get-ready-for-the-real-thing/ (http://blog.blinkenlight.net/2013/01/01/dcf77-project-part-1-get-ready-for-the-real-thing/)

Die alte Version mit dem exponentiellen Filter ist nur noch ein Benchmark ;) Der neue Filter wird Welten besser. Und natürlich werde ich auch noch eine fette Fehlerkorrektur hinterherschalten. Es kommen noch ein paar Ausbaustufen zu diesem Projekt.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Feb 01, 2013, 06:28 pm
Die Feldstärke in DB zu ermitteln ist mit den einfachen Modulen nicht möglich. Die finale Ausbaustufe meiner Uhr wird aber die Qualität des dekodierten Signals ermitteln. Aktueller Stand ist, daß ich jetzt auch die Sekunden dekodieren kann. Ich bin exakt im Plan ;)

http://blog.blinkenlight.net/2013/02/01/the-second-decoder/ (http://blog.blinkenlight.net/2013/02/01/the-second-decoder/)
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Apr 01, 2013, 08:16 pm
Die nächste Ausbaustufe ist fertig und dokumentiert: http://blog.blinkenlight.net/2013/04/01/what-time-is-it/ (http://blog.blinkenlight.net/2013/04/01/what-time-is-it/). http://blog.blinkenlight.net/experiments/dcf77/decoding-time-data/ (http://blog.blinkenlight.net/experiments/dcf77/decoding-time-data/). Die aktuell in Entwicklung befindliche Ausbaustufe hat auch die Sommerzeitumstellung richtig hinbekommen, ist aber noch nicht fertig dokumentiert :)
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: jurs on Apr 02, 2013, 12:58 pm

Die nächste Ausbaustufe ist fertig und dokumentiert: http://blog.blinkenlight.net/2013/04/01/what-time-is-it/ (http://blog.blinkenlight.net/2013/04/01/what-time-is-it/). http://blog.blinkenlight.net/experiments/dcf77/decoding-time-data/ (http://blog.blinkenlight.net/experiments/dcf77/decoding-time-data/). Die aktuell in Entwicklung befindliche Ausbaustufe hat auch die Sommerzeitumstellung richtig hinbekommen, ist aber noch nicht fertig dokumentiert :)


Bekommst Du am Ende eigentlich mit Deinem DCF-Sketch den Speicher eines UNO voll, oder bleibt noch ein Rest an Speicher für was anderes übrig?  ;)

Irgendwie verstehe ich das mit dem Hamming-Code nicht ganz. Einerseits wird das DCF-Signal nur mit einem einfachen Parity-Code gesendet, und Du konstruierst aus erwarteten Daten (bei bereits korrekt laufender Uhr?) und eintreffenden Daten ein Scoring, mit dem Du auch bei ständig falschen Parity-Codes aus der Abfolge mehrer Minuten nacheinander trotzdem die richtigen Werte auslesen willst?

Irgendwie wird mir das alles zu hoch, was Du da machst.  :smiley-eek-blue:

[Edit] Jetzt habe ich mir mal den Sketch heruntergeladen und getestet: Huch, der ist ja gar nicht so groß?!
Und die exponentielle Filterung mit Sampling des Eingangssignals ist auch gar nicht mehr drin?!

Und wie lange braucht der Sketch, um die Uhrzeit zu bekommen? Habe hier mal gerade mit meinem Pollin-Modul und leichten Störungen getestet. Die "Quality"-Zeilen (die mir nichts sagen), habe ich mal dazwischen entfernt.

Dein Sketch fängt an mit:
Decoded time: ??:??:00
Wechselt nach einer Weile auf die richtige Sekunde:
Decoded time: ??:??:20
Decoded time: ??:??:21
Decoded time: ??:??:22
Decoded time: ??:??:23
...

Irgendwann wird wohl Stunde und Minute zu 00 und 00 erkannt (was nicht korrekt ist, Sekunde stimmt):
Decoded time: 00:00:26
Decoded time: 00:00:27
Decoded time: 00:00:28
Decoded time: 00:00:29
Decoded time: 00:00:30
Decoded time: 00:00:31

Dann wird die Stunde wieder unbekannt, die Minute zählt hoch (immer noch falsch), die Sekunde stimmt weiterhin:
Decoded time: ??:01:00
Decoded time: ??:01:01
Decoded time: ??:01:02
Decoded time: ??:01:03
Decoded time: ??:01:04
Decoded time: ??:01:05
Decoded time: ??:01:06
Decoded time: ??:01:07

Dann wird die Stunde wieder (falsch) zu 00 erkannt, die Minute unbekannt, die Sekunde stimmt weiterhin:
Decoded time: 00:??:20
Decoded time: 00:??:21
Decoded time: 00:??:22
Decoded time: 00:??:23
Decoded time: 00:??:24
Decoded time: 00:??:25
Decoded time: 00:??:26

Dann kommt wieder die Minute (Stunde falsch, Minute geht um wenige Minuten falsch):
Decoded time: 00:22:05
Decoded time: 00:22:06
Decoded time: 00:22:07
Decoded time: 00:22:08
Decoded time: 00:22:09
Decoded time: 00:22:10
Decoded time: 00:22:11
Decoded time: 00:22:12

Dann merkt er wieder, dass mit der Minute was nicht stimmt:
Decoded time: 00:??:14
Decoded time: 00:??:15
Decoded time: 00:??:16
Decoded time: 00:??:17
Decoded time: 00:??:18
Decoded time: 00:??:19

Nach ca. 15 Minuten stimmen dann Minuten und Sekunden:
Decoded time: 00:31:01
Decoded time: 00:31:02
Decoded time: 00:31:03
Decoded time: 00:31:04
Decoded time: 00:31:05

Na ja.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Apr 02, 2013, 06:03 pm
Naja, am Ende wird die Uhr wohl so 22kBytes verpulvern. Das ist ziemlich wenig im Vergleich zur Leistungsfähigkeit. Einfache DCF77 Uhren (insbesondere alle kommerziellen) Uhren werden ja nicht einmal mit 1 Bitfehler pro Minute fertig. Meine Uhr wird locker mit mehr als 15 Bitfehler pro Minute fertig.

Das mit dem Hamming Code ist so, daß es keinen "Hamming Code" gibt. Es gibt eine "Hamming Metrik". Im Prinzip ist es ganz einfach. Stell Dir vor jede Minute würde das gleiche Signal gesendet. Dann wäre der Durchschnitt der empfangenen Werte eine naheliegende Schätzung für die richtige Zeit. Jetzt ändert sich die Zeit aber jede Minute. Was aber gleich bleibt ist der Zeitverlauf. Ich muß also nur die Phase erkennen. D.h. für verschiedene Startzeiten ergeben sich verschiedene aber jeweils vorbestimmte Zeitverläufe. Ich muß also nur den "naheliegendsten" Zeitverlauf bestimmen. "Naheliegend" zum empfangenen Signal eben. Die Frage ist wie man "Nähe" bei Signalen misst --> da kommt die Hamming Metrik ins Spiel. Das ist alles.

Probleme Dir dabei macht vermutlich, daß Dir nie jemand verraten/gezeigt hat, daß man "Abstand" auch anders festlegen kann als "euklidischer Abstand im 3-dimensionalen Raum".

Und ich will das nicht nur können, meine Uhr funktioniert bereits bestens. Wie gesagt, 15 Bitfehler pro Minute (und zwar JEDE Minute) sind kein besonders großes Problem. Bei 10 Bitfehlern pro Minute braucht die Uhr weniger als 15 Minuten um die korrekte Zeit zu ermitteln UND danach dauerhaft auf die Sekunde verriegelt zu bleiben.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Jun 01, 2013, 07:28 am
Der neueste Stand meiner DCF77 Uhr ist fertig und dokumentiert: http://blog.blinkenlight.net/2013/06/01/what-time-and-date-is-it/ (http://blog.blinkenlight.net/2013/06/01/what-time-and-date-is-it/) bzw. http://blog.blinkenlight.net/experiments/dcf77/decoding-everything/ (http://blog.blinkenlight.net/experiments/dcf77/decoding-everything/). Die Uhr kann jetzt "alles" ausser den Wetterdaten mit Fehlerkorrektur dekodieren. Als nächstes kommt dann die lokale Uhr für komplette Signalverluste dran.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: Serenifly on Jun 16, 2013, 03:40 am
1. Gibt es das irgendwo als fertige Bibliothek in einer eigenen Klasse mit Header? :)

2. Was ist denn mit dem Reichelt Modul?

http://www.reichelt.de/Bausaetze/DCF77-MODUL/3/index.html?;ACTION=3;LA=446;ARTICLE=57772;GROUPID=5727;artnr=DCF77+MODUL

Sowie ich das sehe ist das ja ein halber Dekoder, der schon die amplitudenmodulierten Rechteck-Impulse liefert. Das würde ja mit keiner der Standardbibliotheken ohne Modifikation funktionieren. Reicht es da einfach die Analogdigital-Wandlung zu überspringen und einen Schritt später einzusteigen, oder soll ich lieber mein Glück bei Conrad versuchen?
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Jun 16, 2013, 11:39 am
1) Nein, das ist aber auch nicht schwer falls das jemand haben will. Solange das Teil aber noch in Entwicklung ist mach ich keine Library draus. Ich will auf meiner Webseite nun mal Sketches am Stück haben. Lokal bei mir gibt es das schon als Library. Aber wie gesagt, solange das Teil nicht endgültig fertig ist nicht.

2) Klar geht das, warum auch nicht? Der "halbe Decoder" nennt sich "Demodulator" und das ist genau das was alle billigen Module tun.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: Serenifly on Jun 16, 2013, 12:45 pm
Ok, ich dachte das Conrad-Modul gibt nur das rohe Analogsignal aus, weil da kaum Elektronik drauf ist, während das Reichelt Modul so einen IC-Knuppel hat :)
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Jul 01, 2013, 05:27 pm
Nächste Runde: http://blog.blinkenlight.net/2013/07/01/keeping-time-no-matter-what/ (http://blog.blinkenlight.net/2013/07/01/keeping-time-no-matter-what/) bzw. http://blog.blinkenlight.net/experiments/dcf77/local-clock/ (http://blog.blinkenlight.net/experiments/dcf77/local-clock/) --> Jetzt überbrückt meine Uhr auch Totalausfälle. In der Zwischenzeit wird auf den Quarzoszillator zurückgegriffen. Falls nur noch der Takt verfügbar ist aber die Daten nicht mehr gelesen werden können nimmt die Uhr den Takt weiter aus dem DCF77 Signal.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Aug 01, 2013, 06:27 pm
Jetzt ist mein DCF77 Decoder in der Endausbaustufe angekommen: http://blog.blinkenlight.net/2013/08/01/the-real-thing/ (http://blog.blinkenlight.net/2013/08/01/the-real-thing/), http://blog.blinkenlight.net/experiments/dcf77/the-clock/ (http://blog.blinkenlight.net/experiments/dcf77/the-clock/).

Jetzt wird das DCF77 Signal auch noch lokal synthetisiert um bei Signalverlust schneller wieder eine Phasenverriegelung hinzubekommen. Außerdem gibt es jetzt verschiedene Anzeigemodi.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_k on Sep 27, 2013, 08:53 pm
Hi Udo,

Ich versuch deinen DCF77 in meiner Wordclock Projekt zu verwenden, doch leider bekomme ich das ganze nicht mit dem Reichelt DCF Modul zum Laufen.
Die normale DCF Library hat nach 45 Minuten einen Lock gehabt, allerdings erst nachdem ich die Split time reduziert habe (default ist 180, (130+230)/2:
Code: [Select]
#define DCFSplitTime 130 // Specifications distinguishes pulse width 100 ms and 200 ms. In practice we see 130 ms and 230
Das Reichelt Modul scheint etwas zu kurze Pulse auszugeben.
So sieht der Output des DCFPulseLenght examples aus der DCF library aus:
Code: [Select]
Cycle: 994 Pulse :61
Cycle: 1019 Pulse :144
Cycle: 985 Pulse :61
Cycle: 995 Pulse :168
Cycle: 1018 Pulse :152
Cycle: 993 Pulse :58
Cycle: 1005 Pulse :155
Cycle: 1000 Pulse :56
Cycle: 997 Pulse :63
Cycle: 1010 Pulse :152
Cycle: 991 Pulse :56
Cycle: 1001 Pulse :65
Cycle: 1013 Pulse :152
Cycle: 986 Pulse :167
Cycle: 1016 Pulse :50
Cycle: 990 Pulse :166
Cycle: 1009 Pulse :53
Cycle: 993 Pulse :164
Cycle: 1006 Pulse :59
Cycle: 1002 Pulse :163
Cycle: 1002 Pulse :48
Cycle: 1006 Pulse :57
Cycle: 996 Pulse :63
Cycle: 1001 Pulse :62
Cycle: 1005 Pulse :56
Cycle: 995 Pulse :67
Cycle: 1007 Pulse :157
Cycle: 993 Pulse :170
Cycle: 1002 Pulse :170


Wie muss ich deinen Dekoder anpassen um mit den kürzeren Pulsen klarzukommen?

Grüße,
Michael
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Sep 28, 2013, 08:58 am
Welchen Code verwendest Du? Den des "Binary Clock" oder den des "The Clock" experiments?

Leider sind die Tools aus der DCF Lib wenig aussagekräftig. Laß mal mit dem Tool hier:

Code: [Select]

//
//  www.blinkenlight.net
//
//  Copyright 2013 Udo Klein
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program. If not, see http://www.gnu.org/licenses/


const uint8_t dcf77_analog_sample_pin = 5;
const uint8_t dcf77_sample_pin = A5;  // == D19 for standard Arduinos
const uint8_t dcf77_inverted_samples = 1;
const uint8_t dcf77_analog_samples = 1;

const uint8_t dcf77_monitor_pin = A4; // == D18 for standard Arduinos

const uint8_t lower_output_pin = 2;
const uint8_t upper_output_pin = 17;


void stopTimer0() {
    // ensure that the standard timer interrupts will not
    // mess with msTimer2
    TIMSK0 = 0;
}

ISR(TIMER2_COMPA_vect) {
    process_one_sample();
}

void initTimer2() {
    // Timer 2 CTC mode, prescaler 64
    TCCR2B = (1<<WGM22) | (1<<CS22);
    TCCR2A = (1<<WGM21);
   
    // 249 + 1 == 250 == 250 000 / 1000 =  (16 000 000 / 64) / 1000
    OCR2A = 249;
   
    // enable Timer 2 interrupts
    TIMSK2 = (1<<OCIE2A);
}

uint8_t sample_input_pin() {
    const uint8_t sampled_data = dcf77_inverted_samples ^
        (dcf77_analog_samples? (analogRead(dcf77_analog_sample_pin) > 200):
                                digitalRead(dcf77_sample_pin));

    digitalWrite(dcf77_monitor_pin, sampled_data);
    return sampled_data;
}

void led_display_signal(const uint8_t sample) {
    static uint8_t ticks_per_cycle = 12;
    static uint8_t rolling_pin = lower_output_pin;
    static uint8_t counter = 0;

    digitalWrite(rolling_pin, sample);
       
    if (counter < ticks_per_cycle) {
        ++counter;
    } else {
        rolling_pin = rolling_pin < upper_output_pin? rolling_pin + 1: lower_output_pin;
        counter = 1;
        // toggle between 12 and 13 to get 12.5 on average
        ticks_per_cycle = 25-ticks_per_cycle;
    }
}

const uint16_t samples_per_second = 1000;
const uint8_t bins                = 100;
const uint8_t samples_per_bin     = samples_per_second / bins;

volatile uint8_t gbin[bins];
boolean samples_pending = false;

void process_one_sample() {
    static uint8_t sbin[bins];
   
    const uint8_t sample = sample_input_pin();
    led_display_signal(sample);

    static uint16_t ticks = 999;  // first pass will init the bins   
    ++ticks;

    if (ticks == 1000) {
        ticks = 0;
        memcpy((void *)gbin, sbin, bins);
        memset(sbin, 0, bins);
        samples_pending = true;     
    }

    sbin[ticks/samples_per_bin] += sample;   
}

void setup() {
    Serial.begin(115200);
    Serial.println();

    pinMode(dcf77_sample_pin, INPUT);
    digitalWrite(dcf77_sample_pin, HIGH);

    pinMode(dcf77_monitor_pin, OUTPUT);
   
    for (uint8_t pin = lower_output_pin; pin <= upper_output_pin; ++pin) {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }

    initTimer2();
    stopTimer0();
}


int32_t sign(int32_t value) {
    return (value>0) - (value<0);
}

void loop() {
    static int64_t count = 0;
    uint8_t lbin[bins];   
   
    if (samples_pending) {     
        cli();
        memcpy(lbin, (void *)gbin, bins);
        samples_pending = false;
        sei();
       
        ++count;
        // ensure the count values will be aligned to the right
        for (int32_t val=count; val < 100000000; val *= 10) {
            Serial.print(' ');
        }
        Serial.print((int32_t)count);
        Serial.print(", ");       
        for (uint8_t bin=0; bin<bins; ++bin) {
            switch (lbin[bin]) {
                case  0: Serial.print(bin%10? '-': '+'); break;
                case 10: Serial.print('X'); break;
                default: Serial.print(lbin[bin]);
            }
        }
        Serial.println();
     } 
}


einen Log erzeugen und schick häng den Output von einer gesamten Stunde an Deine Antwort.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_k on Sep 30, 2013, 07:50 pm
Hi Udo,

mit folgenden Einstellungen:
Code: [Select]
const uint8_t dcf77_analog_sample_pin = 5;
const uint8_t dcf77_sample_pin = A5;  // == D19 for standard Arduinos
const uint8_t dcf77_inverted_samples = 1;
const uint8_t dcf77_analog_samples = 0;

kommt dieses Ergebnis raus:
Code: [Select]

        1, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        2, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        3, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        4, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        5, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        6, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        7, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        8, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
        9, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       10, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       11, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       12, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       13, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       14, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       15, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       16, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       17, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       18, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       19, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       20, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       21, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       22, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       23, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       24, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       25, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       26, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       27, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       28, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       29, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       30, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       31, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       32, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
       33, +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------


Das ändert sich auch nach langer Zeit nicht.

Mit dem vollständig gleichen HW aufbau kommt das DCFPulseLenght example aus der DCF77 lib zu dem Ergebnis in meinem obigem Post. Natürlich nach der Änderung auf
Code: [Select]
#define DCF77PIN 19

Umstellen von const uint8_t dcf77_inverted_samples = 1; auf const uint8_t dcf77_inverted_samples = 0; in deinem Code führt zu Zeilen voll mit X.

Also muss da irgendwo was faul sein.
Hab das ganze mit zwei Arduino Uno getestet.
Mit dem Micro läuft es ja nicht so direkt da der keinen Timer2 hat.
Muss mich mal ein wenig in die Timer einlesen und dann mit dem Micro und Timer4 mal testen.

Grüße,
Michael

Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Oct 01, 2013, 06:27 pm
So wie das aussieht kommt beim Arduino kein Signal an. Hast Du das Modul am richtigen Pin angeschlossen?

Wenn ja, kannst Du irgendwie nachmessen ob da wirklich ein Signal ankommt? Da Du mit dem anderen Programm der DCF Lib ja Ergebnisse hattest würde ich auf ein Problem mit der Pinbelegung tippen. Nicht jedes der Programme verwendet die gleichen Pins. Also besser nochmal genau nachschauen.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_k on Oct 01, 2013, 07:32 pm
Hi Udo,

ich denke ich muss mich noch mal genauer mit dem Modul beschäftigen.
Google meint auch es sei wohl manchmal etwas zickig...

Danke erst mal.
Ich melde mich wieder wenn ich neue Erkenntnisse habe.

Grüße,
Michael
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: michael_k on Oct 01, 2013, 07:58 pm
Hi Udo,

ging schneller als ich dachte:
Ohne digitalWrite(dcf77_sample_pin, HIGH); im setup bekomme ich ein Signal:
Code: [Select]
---------+---------+---------+----1XXXXXXXXXX----+---------+---------+---------+---------+---------
       11, +---------+---------+---------+----3XXXXXXXXXX1---+---------+---------+---------+---------+---------
       12, +---------+---------+---------+-----8XXXXXXXXX----+---------+---------+---------+---------+---------
       13, +---------+---------+---------+-----7XXXXXXXX9----+---------+---------+---------+---------+---------
       14, +---------+---------+---------+----3XXXXXXXXX8----+---------+---------+---------+---------+---------
       15, +---------+---------+---------+----1XXXXXXXXXXXXXXXXXXXX2---+---------+---------+---------+---------
       16, +---------+---------+---------+----2XXXXXXXXXXXXXXXXXXXX2---+---------+---------+---------+---------
       17, +---------+---------+---------+-----8XXXXXXXXXXXXXXXXXXX1---+---------+---------+---------+---------
       18, +---------+---------+---------+----2XXXXXXXXXX3---+---------+---------+---------+---------+---------
       19, +---------+---------+---------+-----XXXXXXXXXX1---+---------+---------+---------+---------+---------
       20, +---------+---------+---------+-----XXXXXXXXXX1---+---------+---------+---------+---------+---------
       21, +---------+---------+---------+----4XXXXXXXXXX1---+---------+---------+---------+---------+---------
       22, +---------+---------+---------+-----9XXXXXXXXX2---+---------+---------+---------+---------+---------
       23, +---------+---------+---------+-----7XXXXXXXXX2---+---------+---------+---------+---------+---------
       24, +---------+---------+---------+----4XXXXXXXXXXXXXXXXXXXX----+---------+---------+---------+---------
       25, +---------+---------+---------+----1XXXXXXXXXX----+---------+---------+---------+---------+---------
       26, +---------+---------+---------+-----9XXXXXXXXX----+---------+---------+---------+---------+---------
       27, +---------+---------+---------+-----XXXXXXXXXX2---+---------+---------+---------+---------+---------
       28, +---------+---------+---------+----4XXXXXXXXX9----+---------+---------+---------+---------+---------
       29, +---------+---------+---------+-----XXXXXXXXX9----+---------+---------+---------+---------+---------
       30, +---------+---------+---------+-----9XXXXXXXXXXXXXXXXXX7----+---------+---------+---------+---------
       31, +---------+---------+---------+----1XXXXXXXXXXXXXXXXXXX9----+---------+---------+---------+---------
       32, +---------+---------+---------+----4XXXXXXXXXXXXXXXXXXX9----+---------+---------+---------+---------


Jetzt lass ich das mal ne Stunde laufen auf dem Arduino Micro.
Den Timer Code hab ich aus der MsTimer2 lib entnommen (und etwas an deinen Code angepasst):
Code: [Select]
#elif defined (__AVR_ATmega32U4__)
ISR(TIMER4_OVF_vect) {
    process_one_sample();
}

void initTimer2() {
  float prescaler = 0.0;
  int tcnt2;
TCCR4B = 0;
TCCR4A = 0;
TCCR4C = 0;
TCCR4D = 0;
TCCR4E = 0;
if (F_CPU >= 16000000L) {
TCCR4B = (1<<CS43) | (1<<PSR4);
prescaler = 128.0;
} else if (F_CPU >= 8000000L) {
TCCR4B = (1<<CS42) | (1<<CS41) | (1<<CS40) | (1<<PSR4);
prescaler = 64.0;
} else if (F_CPU >= 4000000L) {
TCCR4B = (1<<CS42) | (1<<CS41) | (1<<PSR4);
prescaler = 32.0;
} else if (F_CPU >= 2000000L) {
TCCR4B = (1<<CS42) | (1<<CS40) | (1<<PSR4);
prescaler = 16.0;
} else if (F_CPU >= 1000000L) {
TCCR4B = (1<<CS42) | (1<<PSR4);
prescaler = 8.0;
} else if (F_CPU >= 500000L) {
TCCR4B = (1<<CS41) | (1<<CS40) | (1<<PSR4);
prescaler = 4.0;
} else {
TCCR4B = (1<<CS41) | (1<<PSR4);
prescaler = 2.0;
}
tcnt2 = (int)((float)F_CPU * 0.001 / prescaler) - 1;
OCR4C = tcnt2;
        TIFR4 = (1<<TOV4);
TCNT4 = 0;
TIMSK4 = (1<<TOIE4);
}
#endif
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: udoklein on Oct 01, 2013, 08:07 pm
Die Timer2 Lib funktioniert nicht mit meiner Uhr. Problem ist, daß die Lib einen Bug hat der zu Gangabweichungen führt die die Uhr dann nicht einrasten lassen. Ich habe den Autor der Lib angeschrieben, der hat den Fehler aber bis heute nicht behoben. Wenn Du meinen Code verwenden willst solltest Du meine Implementation auf Deinen Controller anpassen. Außer Du nimmst den einfachen Code mit dem expoentiellen Filter. Bei dem ist das OK.
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: Codeman on Nov 03, 2014, 01:38 pm
Hiho,

alter Thread, aber egal.

ich habe Probleme mit dem Modul von Reichelt. Habe gestern eine Transistor-Stufe nachgeschaltet, damit der Arduino ueberhaupt was erkennt. Jetzt kommt zwar was an, aber ich habe permanent parity-erros. Ich werde es mal mit dem DCF-Filter probieren.

Gruss, Holger
Title: Re: Binäre DCF77 Uhr mit exponentiellem Filter und Blinkenlighty
Post by: patii on Dec 11, 2016, 09:33 am
Hey Leute,

ich hatte, dank Udo's Library, ein relativ regelmäßiges Signal.

Nun habe ich einen LEDMatrix hinzugefügt und das Signal verschwindet komplett.


Das einzige was ich hinzugefügt habe, ist:

Code: [Select]
#include <LedControl.h>

const int DIN_PIN = 11;
const int CS_PIN = 10;
const int CLK_PIN = 13;
const int matrixCount = 4;

LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN, matrixCount);


Jemand eine Idee, woran das liegen könnte?