Probleme mit der DCF77 Library bzgl der Impulszeiten

Hallo,
ich verwende gerade einen DCF77 Empfänger von Conrad (http://www.conrad.de/ce/de/product/641138/Conrad-DCF-Empfaengerplatine?ref=searchDetail) an einem Arduino Mega2560.
Um den zu betreiben habe ich die Time und die DCF77 Libary includiert (Arduino DCF77 radio clock receiver – Library | Thijs.Elenbaas.net).
Jetzt habe ich aber das Problem, dass die Zeit nicht richtig erfasst wird.

In einem Testprogramm (http://www.arduinoclub.de/2013/11/15/dcf77-dcf1-arduino-pollin/2/) habe ich sehr viele Fehler in den Werten der Bit's bekommen. Auf einem Oszilloskop kann ich auch sehen, dass die Pulszeiten außerhalb der in dem Programm eingestellten Grenzen liegen. Nach dem Anpassen der Zeiten, bekomme ich klare 1 oder 0 Signale rein, die auch beim Umrechnen die richtige Zeit ergeben.

Meine Frage wäre jetzt, ob es möglich ist, die Grenzen der Pulszeiten oder die Toleranz in der Library zu ändern und wenn ja, wo?
Oder könnte mein Fehler woanders liegen?
(Sollte es nur am schlechten Empfang liegen, hab ich nen Problem, da der an dem Ort, wo das Board hin soll, noch schlechter ist...)

Außerdem habe ich bis jetzt noch nicht verstanden, wozu der Interrupt gut ist, ob man den ansteuern muss, ob das ein digitaler Output sein muss oder ob man den auch einfach weglassen kann...

Gruß
Miller
P.S.: typischer Montag... :0

Miller411:
Um den zu betreiben habe ich die Time und die DCF77 Libary includiert (Arduino DCF77 radio clock receiver – Library | Thijs.Elenbaas.net).
Jetzt habe ich aber das Problem, dass die Zeit nicht richtig erfasst wird.

Diese Library kommt mit einem Beispielprogramm "DCFPulseLength", mit dem Du Dir die Impulslängen anzeigen lassen kannst. Lasse mal "DCFPulseLength" laufen, dann siehst Du, was mit dem Signal los ist und wie viele Fehler auftreten.

Bei einem einwandfreien Signal siehst Du pro Minute 59 mal ein Signal aus 100/200 und 900/800 ms Dauer, sowie einmal pro Minute einen Sync-Impuls von fast 2s Dauer.

Gestörte Signale wechseln die Impulsflanke mehrmals pro Sekunde und führen zu Störimpulsen.

Miller411:
Meine Frage wäre jetzt, ob es möglich ist, die Grenzen der Pulszeiten oder die Toleranz in der Library zu ändern und wenn ja, wo?

Im Quellcode der Library, wo sonst?

Mal kurz reingeschaut, in der Datei DCF77.h scheint es dieser Eintrag zu sein, den Du beeinflussen kannst:

#define DCFSplitTime 180

Normalerweise sollen die Impulslängen für 0-Bits 100ms und für 1-Bits 200ms betragen, der Split wäre dann üblicherweise bei 150 ms. Keine Ahnung, warum der Autor der Library den Wert um 30ms nach oben geschoben hat, wahrscheinlich hat er ein DCF-Modul, das ihm diese längeren Impulse liefert. Im Normalfall sollte die DCFSplitTime wohl näher an 150 liegen.

Miller411:
(Sollte es nur am schlechten Empfang liegen, hab ich nen Problem, da der an dem Ort, wo das Board hin soll, noch schlechter ist...)

Grundsätzlich ist es so, dass die ganzen DCF77-Libraries, die als "Open Source" herumschwirren fast immer von Hobbyisten gemacht sind, die es nicht besser wissen und nicht besser können. Bei fehlerfreiem Empfang funktionieren die Libraries und Quellcodes alle gut. Und bei gestörtem Empfangssignal trennt sich die Spreu vom Weizen. An Arduino-DCF Libraries gibt es allerdings fast nur Spreu und kaum Weizen.

Ein Interessantes Konzept für die Auswertung gestörter DCF-Signale hat z.B. Udo Klein Hier entwickelt:

Allerdings habe ich nicht getestet, wie gut die DCF-Library von Udo Klein im Vergleich zur Library von Thijs Elenbaas bei gestörten Signalen abschneidet.

Irgendwie wird DCF auch immer mehr obsolet:
In modernen Wohnungen ist durch hunderte von Funksignalen über GSM, UMTS, DECT, WLAN, Bluetooth und 433/868MHz-SRD Geräte, sowie durch Monitore, Leuchtstoffröhren, Energiesparlampen und Schaltnetzteile das Langwellensignal von DCF77 total verrauscht und kaum noch empfangbar. Auf der anderen Seite sind GPS-Module immer empfindlicher und dabei preiswerter geworden, so dass man zum fast selben Preis und mit weniger Programmieraufwand zumindest in Fensternähe heutezutage per GPS-Modul bequemer und zuverlässiger ein hochgenaues Zeitsignal erhalten kann als über ein DCF-Modul. Denn für den Zeitempfang per GPS braucht man ja nicht wie für eine Positionsbestimmung ständig einen Empfang von mehreren Satelliten, sondern es reicht, wenn ein einziges Satellitensignal zum Fenster reinreflektiert wird.

Aber wie gesagt: Wie gut gestörte DCF-Signale empfangen und ausgewertet werden können, hängt von der Qualität des DCF-Funksignals am Empfangsort, der Empfindlichkeit und Güte des DCF-Empfängers und last but not least von der Fähigkeit der Softwareauswertung ab, fehlerhafte Signale in einer fehlertoleranten Logik vernünftig auszuwerten.

Hi,
Danke erstmal für deine Antwort.

Lasse mal "DCFPulseLength" laufen, dann siehst Du, was mit dem Signal los ist und wie viele Fehler auftreten.

Ich habe die Impulslängen mit einem Digitalen-Oszilloskop schon geprüft...Außerdem zeigt mir das Programm, welches ich oben beschrieben habe, das Bit an, mit dem jeweiligen Wert. Ist der Wert nicht 0 oder 1, ist das ein Fehler.

Zu der Änderung im Quellcode:
Ich hab da auch schon reingeguckt und auch die Variable gefunden, wusste nur nicht, welche Zeit man da genau einstellt.
Allerdings ändert das auch nichts... :confused:
Ich habe den Wert mal auf 150 gestellt aber nach 14 min hat der immernoch kein Signal...

Zum GPS:
Gute Idee, habe aber auch keine Sicht gegen Himmel... :confused:

Hallo,
dieser Conrad-Empfänger ist Mist!
Wickel die Platine mal in Alufolie ein- vorsicht Kurzschlussgefahr.
Die "Antenne" richte mal nach "Frankfurt" aus. Die Antenne nicht zu dicht an anderer "Elektronik" betreiben.
Halte da mal Abstand.
Das könnte etwas bringen.
Gruß und Glück
Andreas

Ich hab da auch schon reingeguckt und auch die Variable gefunden, wusste nur nicht, welche Zeit man da genau einstellt.
Allerdings ändert das auch nichts

Das Problem liegt wohl auch nicht daran, dass der kurze Impuls nicht länger als 150 ist oder der lange mindestens 180 ms lang ist, sondern dass innerhalb der Sekunde mehr als ein (Stör-)Impuls erkannt wird oder der Impuls selbst fälschlich unterbrochen war...

Die Qualität des Signals kann man grob mit dem Auge abschätzen, wenn man eine LED mitblinken lässt. Es dürfen nur saubere kurze oder lange Pulse zu sehen sein, sonst kann man eine weitere Minute warten, bzw. damit verbringen, eine bessere Position für die Antenne zu suchen. (Natürlich kann man die Led auch durch Prüfsoftware ersetzen)

Udo's DCF77 Treiber ist meines Wissens erst besser, wenn mal eine gültige Zeit erkannt wurde, aber auf jeden Fall einen Versuch bzw. die Einarbeitung in die Hintergründe wert, wenn man sich mit DCF beschäftigen will.

(Sollte es nur am schlechten Empfang liegen, hab ich nen Problem, da der an dem Ort, wo das Board hin soll, noch schlechter ist...)

LCD Bildschirme und Schaltnetzteile (die kleinen "WandWarzen" mit ca. 150 kHz) sind gerne die Bösen.

Zum GPS:
Gute Idee, habe aber auch keine Sicht gegen Himmel... :confused:

Ethernet hast du nicht zufällig in deinem Projekt?

Miller411:
Ich habe die Impulslängen mit einem Digitalen-Oszilloskop schon geprüft…Außerdem zeigt mir das Programm, welches ich oben beschrieben habe, das Bit an, mit dem jeweiligen Wert. Ist der Wert nicht 0 oder 1, ist das ein Fehler.

Und das Signal ist völlig sauber? Keinerlei Störungen? Auch nicht im Millisekundenbereich?

Ich habe Dir mal ein kleines Testprogramm für die Impulse mit Tiefpassfilterung gemacht, lasse mal laufen:

#define DCFPIN A0

float lowPass(float curVal)
{
  #define N 36
  static float lowPassVal;
  lowPassVal= ((N-1)*lowPassVal+curVal)/N;
  return lowPassVal;  
}

void setup() {
  Serial.begin(9600);
  pinMode(DCFPIN, INPUT_PULLUP);
}

void loop() {
  static unsigned long lastSwitch;
  static byte lastLogicalSignal=0;
  static unsigned int hipulse, lowpulse;
  byte signal=digitalRead(DCFPIN);
  float signalLowpass=lowPass(signal);
  if (lastLogicalSignal==1 && signalLowpass<0.33)
  {
    hipulse=millis()-lastSwitch;
    Serial.print("H ");Serial.print(hipulse);
    lastSwitch=millis();
    lastLogicalSignal=0;
  }
  else if (lastLogicalSignal==0 && signalLowpass>0.67)
  {
    lowpulse=millis()-lastSwitch;
    Serial.print("\tL ");Serial.print(lowpulse);
    Serial.print("\tP ");Serial.println(hipulse+lowpulse);
    lastSwitch=millis();
    lastLogicalSignal=1;
  }
  
  delay(1);
}

Poste mal einen kleinen Auszug, über die Windows-Zwischenablage aus dem seriellen Monitor herauskopiert und hier im Forum am besten zwischen Code-Tags eingefügt. Wie sieht es aus?

Und dann zum Vergleich mal das nicht-gefilterte Signal mit einem außer Kraft gesetzten Tiefpassfilter:

float lowPass(float curVal)
{
  return curVal;
}

Auch davon bitte mal einen kurzen Ausschnitt aus dem seriellen Monitor posten!

Miller411:
Zu der Änderung im Quellcode:
Ich hab da auch schon reingeguckt und auch die Variable gefunden, wusste nur nicht, welche Zeit man da genau einstellt.
Allerdings ändert das auch nichts… :confused:
Ich habe den Wert mal auf 150 gestellt aber nach 14 min hat der immernoch kein Signal…

Ich habe mir die Library mal vor 2 Jahren angesehen, die erschien mir damals deutlich mangelhafte Leistung bereits bei geringfügig gestörten Signalen zu liefern. Wenn Du diese Library verwenden möchtest, würde ich Dir empfehlen, eher das DCF-Modul von Pollin als das Conrad-Modul einzusetzen:

Das Pollin-Modul hat im Gegensatz zum Conrad-Modul nämlich nach meinen Tests bereits einen Tiefpassfilter eingebaut. Bei zunehmenden Störungen liefert das Pollin-Modul jedenfalls noch ein anfangs ungestörtes Ausgangssignal, dann gibt es bei zunehmenden Störungen einen sehr kleinen Bereich, in dem das Signal zappelt, und dann ist das Signal komplett weg.

Das Conrad-Modul dagegen liefert schon bei kleinen Störungen ein leicht zappeliges Signal, das mit zunehmenden Störungen einfach nur immer zappeliger wird.

Miller411:
Zum GPS:
Gute Idee, habe aber auch keine Sicht gegen Himmel… :confused:

Moderne GPS-Module brauchen nicht unbedingt eine direkt freie Sicht zum Himmel, die werten auch Reflektionen an Wänden aus und Signale, die zum Fenster hereinkommen. Insbesondere in den Abend- und Nachtstunden funktioniert das gut. Erst Recht, wenn Du keine GPS-Position benötigst (was mindestens das Signal dreier Satelliten erfordert), sondern nur die Zeit (erfordert nur das Signal eines Satelliten).

Falls Du lieber DCF verwendest, dann achte aber darauf, dass Du ALLE FUNK-STÖRQUELLE IN ZWEI METER UMKREIS um das DCF-Modul entfernst. Also alles dies muß mindestens zwei Meter entfernt vom DCF-Modul sein, wenn Du Empfang haben möchtest (unvollständige Liste):

  • GSM Handys und Smartphones
  • UMTS Handys und Smartphones
  • Schnurlose Telefone mit DECT oder anderen Funkstandards
  • 433 und 868 MHz Short Range Devices (z.B. Funk-Wettersensoren, Babyphones, schnurlose Kopfhörer)
  • alles mit WLAN (Handy, mobile Computer, Router)
  • alles mit Bluetooth
  • alle Monitore
  • alle Computer
  • alle Leuchtstoffröhren
  • alle Energiesparlampen
  • alle Schaltnetzteile
    All das (und anderes mehr) darf in zwei Metern Umkreis um das DCF-Modul nicht betrieben werden, sonst stört es.

Hallo,
"da der an dem Ort, wo das Board hin soll, noch schlechter ist"
Da gibt es auch externe Antennen für:

Für das Geld kannst Du Dir aber aussen schon einen GPS-Empfänger montieren.
Einfacher wäre eine RTC.
Gruß und Spaß
Andreas
P.S. könntest Du auch probieren:

daher meine AluFolie.
Fest steht- ohne "sauberes" Signal kannst Du das fast vergessen.

Einfacher wäre eine RTC.

Eine RTC braucht man mit DCF (fast) immer zusätzlich.
Bei DCF gehts nur drum, die RTC synchron zu halten und evtl. Sommer/Winter - Umschaltung zu vereinfachen.

Ausnahme: Nach Spannungswiederkehr / Reset kommt es erstmal ne Viertelstunde oder so nicht auf eine Uhrzeit an.

Hallo,
“Bei DCF gehts nur drum, die RTC synchron zu halten und evtl. Sommer/Winter”

Gut, Sommer/Winter lasse ich gelten.

RTC synchron zu halten- nur bedingt.
Ich habe hier seid November 2013 eine ChronoDot am laufen.
Bis heute kann ich eine Gangungenauigkeit durch optischen Vergleich mit DCF
nicht feststellen.

Nun weiß man ja nicht, wozu so eine “hochgenaue” DCF-Zeit benötigt wird.
Wenn hier mit “< Sekunde” gerechnet werden soll, dann darf man den
Zeitlauffehler des DCF nicht vernachlässigen.
Nur das bekommt es nicht korregiert, weil wohl keine ZeitReferenz.
Ich mein ja nur…
Gruß und Spaß
Andreas

Zeitlauffehler des DCF

Was meinst du damit?

  • Die Lichtgeschwindigkeit * Entfernung bis Mainhausen ?
  • Die Auswertezeit der Empfänger-Elektronik ?
  • Die Verarbeitungszeit im Arduino ?
    Wenn du keinen GPS- oder Galileo-Satelliten auf Arduino-Basis bauen willst, sind alle 3 Zeiten vernachlässigbar und einigermaßen reproduzierbar. :wink:

Nun weiß man ja nicht, wozu so eine "hochgenaue" DCF-Zeit benötigt wird.

Zur Bequemlichkeit, natürlich. Und genau dazu braucht man auch erstmal eine RTC. Mit DCF genügt dann auch eine Feld-Wald-Wiesen-DS1307 (am besten mit halbwegs ordentlichem Quarz, natürlich)

Wer sich an seiner hochgenauen Uhr erfreuen will, prüft natürlich alle 3 Monate nach, dass der Fehler von 2ppm im konkreten Fall nur 1ppm (~ 10 sec in 100 Tagen ) beträgt.

Aber, danke dass du mich mal wieder wachgerüttelt hast:
Auch wenn der Preis für solche Elektronik-Module eher unter sportlichen Aspekten zu sehen ist
(Manche nennens auch "Geiz ist geil")
EUR 1,92 ist schon ein Argument gegen DS1307

Bei webbasierten Projekten wäre natürlich NTP am bequemsten.

Hallo,
"Zeitlauffehler des DCF"

Wenn sein Empfa?nger z.B. 300 km vom Funkuhrsender entfernt ist, betra?gt die Laufzeit bereits 1ms. Und diese Laufzeit läßt sich nicht kompensieren.

"Aber, danke dass du mich mal wieder wachgerüttelt hast:"
DICH wachrütteln!??

Ich bin es, der hier auf der Hut sein muß, aber es ist wie immer ein Vergnügen
mit Dir.
Aber wir weichen hier vom Thema ab, mal sehen wie er weiterkommt...
Gruß und Spaß
Andreas

Und diese Laufzeit läßt sich nicht kompensieren.

Aber sie bleibt reproduzierbar und :
Wenn man nicht weiss wo man ist, ist GPS schon sehr praktisch :wink: :wink: :wink:

Hallo,
von hier:
Computer:~ CrossRoad$ /Volumes/Pladde/Arduino/Software/uBlox/Grundlagen\ der\ Ortung\ und\ Navigation\ mit\ Satelliten.pdf
Gruß und Spaß
Andreas
P.S. ...aber nur, wenn man weiß wo man hin muss.
Es gibt Leute, die verfahren sich mit GPS und Kompass :*

Hi,
zunächsteinmal vielen Dank für eure Zahlreichen Antworten.

Bei den Störimpulsen tauchte mal der Begriff "Leuchtstoffröhre" auf...ich denke mein Kollege wird nicht besonders begeistert sein, wenn ich ihm alle Lichtquellen klaue... :smiley:
Außerdem befinden sich auch noch Telefonanlagen und weitere Störquellen in 20m umfang, die ich nicht entfernen kann...

Außerdem hab ich durch weitere Überprüfung und ein wenig Zufall herrausgefunden, dass ich tatsächlich hochfrequente Störsignale habe, die den Transistor auf den Chip schalten lassen (interessanterweise nicht periodisch und immer kurz vor oder kurz nach einem Signal). Ein Tiefpass verbessert das ganze ein wenig, aber die Störungen bleiben teilweise noch.

Dann kam noch die Frage nach dem Ethernet.
Ja, ich habe tatsächlich ein Ethernet-SD-Karten Modul eingebaut, welches ich aber schon verwende (zeige mir die Werte mit "Telnet-Protokoll an). Ist das trotzdem noch möglich??

Gruß Miller

Hallo,
um es noch einmal deutlich zu sagen, DIESER Empfänger ist Mist.
Der funktioniert nur einwandfrei, wenn er einwandfrei betrieben wird.
Das Ding ist eine BastelLösung für die C-Control.

Ich habe den an einer C-Control 2 betrieben, das drehen der Antenne versaute
sofort das Signal. Dieses drehen spielte sich im 2cm Radius ab.
Damit Du weißt worüber wir reden, und was Du vor hast.

Die "Störquellen" zu entfernen ist fast aussichtslos, also mußt Du die
Störungen vom Empfänger fern halten.
Dazu gehört eine über jeden Zweifel erhabene Spannungsversorgung.
Die Platine in ein "HF-Gehäuse". (mit AluFolieGehäuse testen)
Die Antenne richtig ausrichten, dazu gehört unter anderem, das sie waagerecht
befestigt ist.
Gruß und Spaß
Andreas

Getting Started: http://playground.arduino.cc/Code/NTPclient

Ahem, Bequemlichkeit: NTP liefert UTC - Zeit, (die playground software also UnixTime Sekunden)
MEZ/MESZ nach den derzeit gültigen Regeln muss daraus noch eine Software machen. Aber auch da gibt es große Auswahl an Libraries.