Forum: Mikrocontroller und Digitale Elektronik DCF77 Auswertemethoden


von Mike Richard (Gast)


Lesenswert?

Moin,

ich habe mir heute einige DCF77-Beispielcodes angesehen. Unter anderem 
unterscheiden sie sich darin, dass einige das DCF-Signal als externen 
Interrupt verwenden und mit einem Timer dann die Impulsbreiten 
bestimmen, andere arbeiten mit einem Timerinterrupt alle 10ms und lesen 
den Datenpin dann ein.
Ich finde den Artikel hier nicht mehr, meine aber gelesen zu haben, dass 
eine der beiden Varianten technisch gesehen nicht schön ist. Warum weiß 
ich leider auch nicht mehr.... Kann das jemand bestätigen oder irre ich 
mich da?

von Karl H. (kbuchegg)


Lesenswert?

Das Problem mit dem externen Interrupt kommt dann, wenn dein Empfang 
schlecht ist. Dann flutest du den µC mit Interrupts.
Aber selbst bei gutem Empfang musst du sowieso Filtermassnahmen 
vorsehen, denn guter Empfang bedeutet nicht notwendigerweise, dass die 
Rechteckspannung da reinschnurrt, wie frisch gelackt.

Wenn du aber sowieso einen Timer brauchst um die Pulslänge 
festzustellen, dann kannst du auch gleich mit der Timer-Polling Methode 
arbeiten. Manchmal ist es vernünftiger, wenn man die Dinge gar nicht so 
genau wissen will und nicht jede einzelne Flanke mitkriegen will.

DCF ist an und für sich einfach auszuwerten. Kompliziert wird es erst, 
wenn man auch noch mit schlechten Empfangsbedingungen klar kommen will 
oder muss.

von Mike Richard (Gast)


Lesenswert?

Ok, das kann ich nachvollziehen :-) Danke für die Antwort!

Also ist dieses: DCF77-Funkwecker mit AVR Projekt dann nicht so gut, 
weil es den externen Interrupt nutzt? Timer-Interrupt wird aber auch 
genutzt. Kann hier leider nicht 100% alles verstehen, wie das Programm 
arbeitet.

Hier gefällt es mir aber, dass es einen Plausibilitätscheck gibt..... 
Kannst Du trotzdem kurz schreiben, was die Interrupts hier machen?

von Fred R. (fredylich)


Lesenswert?

Hallo Mike.

Welche Prog. Sprache?

Natürlich sind im DCF77 „Sendepaket“ nicht nur Zeit und Datum enthalten.
Die Auswertung was du benötigst, macht deine Software.
Die Impulsbreiten auszuwerden ist ja auch nur eine Art Timerinterrupt.

Hoffe deine Anfrage richtig verstanden zu haben.

Mit freundlichen Grüßen
Fred

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

ich nutze PeDa (Dannegger) Tasterentprellung bulletproof im 10ms Timer, 
da kann ich auch gleich die DCF Pulse einsammeln, 5-12 wären eine 0 und 
13-22 eine 1 die ich an PeDa DCF77 void scan_dcf77( void ) weiterleite

klappt ganz gut

von Karl H. (kbuchegg)


Lesenswert?

Mike Richard schrieb:

> Also ist dieses: DCF77-Funkwecker mit AVR Projekt dann nicht so gut,
> weil es den externen Interrupt nutzt? Timer-Interrupt wird aber auch
> genutzt. Kann hier leider nicht 100% alles verstehen, wie das Programm
> arbeitet.

Dann häng dich rein.
Die für den DCF Empfang wichtigen 2 Interrupt Service Routinen sind ja 
überschaubar kurz.

Kurz: der externe Interrupt ist dafür zuständig den Anfang eines Pulses 
zu detektieren. Ab da beginnt die Zeit zu laufen. Mit dem Timer 
Interrupt wird dann in regelmässigen Abständen nachgesehen, ob der 
Eingang noch auf 1 liegt oder schon auf 0 abgefallen ist. Die auf diese 
Art festgestellte Pulslänge erlaubt dann die Aussage, ob der Puls eine 
logische 1 oder eine logische 0 darstellen soll.

Das funktioniert soweit sicherlich, solange es keine Störungen gibt.

Wie gesagt: Häng dich rein. Du willst das bauen, dann ergründe auch wie 
es funktioniert. So lernt man.
Kümmere dich erst mal nicht darum, was die einzelnen 0-en und 1-en 
bedeutet. Denn erst mal musst du diese 0-en und 1-en haben. Genau darum 
geht es in diesen beiden ISR, die da zusammenspielen.

: Bearbeitet durch User
von Mike Richard (Gast)


Lesenswert?

Fred R. schrieb:
> Welche Prog. Sprache?

Hi. Ich möchte einen AVR in C programmieren. Die Lib sollte dann 
entsprechend auch in C sein und möglichst leicht verständlich. Ich 
möchte keine Arduino-Labs verwenden, ohne genau zu sehen, was passiert. 
Deshalb dieses Mal auch „richtige“ Programmierung eines AVR mit Atmel 
Studio, ohne die Arduino-IDE und Bootloader etc.

Ich weiß, dass es 59 Bit gibt, wovon nur ein Teil interessiert. Das 0. 
Bit ist eine Pause und zeigt den Start des Signals.

Da mein AVR auch eine eingebaute RTC hat, kann der Controller per Timer 
(wenn ich es richtig verstanden habe auch sehr genau durch die 
32kHz-Zeitbasis und entsprechende Teiler) die Uhrzeit weiterzählen, wenn 
kein Funk-Signal vorhanden ist.

Es soll ein ATmega328P werden. Später soll es dann in etwa folgende 
Anwendung geben:

Batteriebetrieb, also möglichst viel Strom sparen, da wo es nur geht. 
Wenn er AVR einmal eine genaue Zeit hat, soll er einen Timer laden, so 
dass er um beispielsweise 16:00 Uhr aufwacht. Dann erfolgt eine neue 
Synchronisierung. Zwischen 17:00 Uhr und 18:00 Uhr erfolgen verschiedene 
Schaltvorgänge der Ausgänge zu vorher genau definierten Sekunden. Um 
18:10 Uhr ist das Programm zu ende. Neuberechnung der Wartezeit bis 
16:00 Uhr am nächsten Tag, Timer entsprechend laden und Tiefschlaf, bis 
der Timer einen Interrupt auslöst, und den AVR aufweckt. Danach wieder 
DCF-Synchronisierung etc.

Ich hoffe, das ist einigermaßen verständlich beschrieben. Meint ihr, das 
ist mit dem ATmega328 ohne weiteres möglich?

von eagle user (Gast)


Lesenswert?

Ja.

Aber du solltest die Synchronisation nachts machen. Erstens ist der 
Empfang besser, es sind weniger Monitore, Energiesparlampen usw. in 
Betrieb. Außerdem passiert nachts zwischen 2 und 3 die 
Sommer-/Winterzeitumstellung. Wenn du kurz nach 3 Uhr synchronisierst, 
hast du fast lückenlos die richtige Uhrzeit.

von Mike Richard (Gast)


Lesenswert?

Ok, also schicke ich den AVR in den Tiefschlaf, bis der Timer nachts um 
kurz nach 3 Uhr aufgeweckt wird um sich mit DCF77 zu synchronisieren. 
Dann geht er wieder schlafen, bis es 17 Uhr ist. Wenn er dann aber 
aufwacht (weil der Timer einen Interrupt ausgelöst hat), habe ich dann 
noch die genaue Sekunde? Ich müsste die Ticks ja weiter zählen. Der 
Boot-up dauert ja aber auch etwas. Ist dann nicht alles verschoben?

von Fred R. (fredylich)


Lesenswert?

Hallo Mike,

ein ATmega328P macht dies locker.
Leider kann ich hier nicht mehr weiter helfen. Eine Lösung mit 
Bascom/ASM könnte ich Punkt genau anbieten.

Mit freundlichen Grüßen
Fred

von Joachim B. (jar)


Lesenswert?

Mike Richard schrieb:
> Ok, also schicke ich den AVR in den Tiefschlaf, bis der Timer nachts um
> kurz nach 3 Uhr aufgeweckt wird um sich mit DCF77 zu synchronisieren.
> Dann geht er wieder schlafen, bis es 17 Uhr ist. Wenn er dann aber
> aufwacht (weil der Timer einen Interrupt ausgelöst hat), habe ich dann
> noch die genaue Sekunde? Ich müsste die Ticks ja weiter zählen. Der
> Boot-up dauert ja aber auch etwas. Ist dann nicht alles verschoben?

also ich nutze immer eine RTC DS3231 aus China unter 2,- die kann über 
INT und Alarmregister den Atmel aufwecken um 3:00 Uhr und um 17:00 Uhr 
wenn du das wünschst, spart den 32kHz Quarz, ermöglicht tiefere sleep 
modi am Atmel, nach dem DCF Sync kann man doch noch die RTC stellen, die 
DS3231 laufen auch genauer und stabiler als die DS1307 Module, die SW 
ist nahezu gleich, DS1307new LIB läuft, der DS3231 muss nicht gestartet 
werden es gibt auch kein stop command, da beide I2C Adressen gleich sind 
ist der Unterschied leicht festellbar, der eine hat 56Byte RAM wenn der 
Chip auf Adresse 0 ansprechbar ist ist einer von beiden vorhanden, der 
DS3231 liefert auf RAM Ende einen Fehler weil er nicht soweit reicht 
ohne die 56 Byte.

: Bearbeitet durch User
von John (Gast)


Lesenswert?

eagle user schrieb:
> Außerdem passiert nachts zwischen 2 und 3 die
> Sommer-/Winterzeitumstellung. Wenn du kurz nach 3 Uhr synchronisierst,
> hast du fast lückenlos die richtige Uhrzeit.

Ja, fast.

Noch besser wäre es bei Normalzeit um 1:00 Uhr, und bei Sommerzeit um 
2:00 Uhr zu synchronisieren. Und ja, es wird eine Kennung mitgesendet, 
anhand derer man erkennen kann, ob es sich bei der ausgestrahlten 
Zeitinformation und Normal- bzw. Sommerzeit handelt.

In der Stunde vor der Zeitumstellung wird die Umstellung durch ein 
entsprechendes Bit, das gesetzt wird, angekündigt. Der Empfänger hat 
dann eine Stunde lang Zeit, diese Information zu empfangen und kann die 
korrekte Zeit direkt nach der Umstellung anzeigen. Und nicht erst eine 
Stunde später.

Joachim B. schrieb:
> also ich nutze immer eine RTC DS3231

Ich halte das für etwas übertrieben:
man programmiert einen µC als Uhr und hängt dann noch zusätzlich einen 
Uhrenbaustein an den Controller.

von Joachim B. (jar)


Lesenswert?

John schrieb:
> Joachim B. schrieb:
>> also ich nutze immer eine RTC DS3231
>
> Ich halte das für etwas übertrieben:
> man programmiert einen µC als Uhr und hängt dann noch zusätzlich einen
> Uhrenbaustein an den Controller.

kannst du sehen wie du willst, ich kann die Uhr auch mal vom Netz nehmen 
oder µC Batterie wechseln oder den µC dauerhaft schlafen schicken bei 
geringstem Verbrauch, die RTC kostet ja praktisch nix extra und läuft 
auch weiter wenn der µC pennt oder keine Versorgung hat und vereinfacht 
vieles in der Hardware, 32kHz Quarz, die Programmierung, das ständige 
Aufwecken.

PS. DCF77 Empfang ist hier sowas von mies da ist man froh wenn der 
einmal in der Woche sich syncronisiert, es lief auch schon mal 4 Wochen 
ohne Sync.

: Bearbeitet durch User
von Thomas S. (thommi)


Lesenswert?

Wenn du nur eine genaue Zeit möchtest, dann gab es bei 
www.robotikhardware.de mal das IC ICDCFRS als Artikelnummer oder die 
Bezeichnung DCF-RS232-Wandler DCF-RS1.

nach meinen kurzen Recherchen gibt es diesen Lieferanten leider nicht 
mehr, was ich schade finde. Aber das deutsche Steuerwesen killt jedes 
Startup-Unternehmen

Dieses IC wandelt die DCF-Daten von einem DCF-Empfänger so um, dass man 
mit einem kleinen Bascomprogrämmchen die genaue Zeit bekommt, RTC 
inkusive.

Falls du aus eigenem Interesse das Signal selbst auswerten möchtest, 
dann ist mein Posting obsolet. Möchtest du jedoch nur die genaue Zeit 
haben, dann google mal nach den oben genannten Artikelnummern oder 
Bezeichnungen.

Selbst auswerten ist jedoch eine lehrreiche Herausforderung mit 
Lerneffekt, wie schon oben geschrieben.

von c-hater (Gast)


Lesenswert?

Mike Richard schrieb:

> Ich finde den Artikel hier nicht mehr, meine aber gelesen zu haben, dass
> eine der beiden Varianten technisch gesehen nicht schön ist.

Techische Sichtweisen haben keinen Bedarf an "Schönheit". Alles, was da 
zählt, ist Zweckmäßigkeit. Und diese Zweckmäßigkeit ergibt sich, wen 
wundert's, aus dem Zweck der Sache.

Im konkreten Fall: Wenn der einzige Zweck die Decodierung des AM-Signals 
von DCF77 ist, dann ist triviales Polling mit relativ großer Abtastrate 
die beste und einfachste Lösung.

Und alle Typen, die schon glücklich sind, so eine triviale Aufgabe 
(meist mit geklautem Code) gelöst bekommen zu haben, werden dir 
versichern, dass solche ein Polling das einzig Wahre ist. (Weil man 
damit auch viele Probleme umgeht, die sie völlig unfähig wären zu 
lösen...)

Diese Typen glauben dann, "ihre" (meist geklaute) Lösung wäre "schön". 
Damit könnte man ja noch gut leben.

Das Problem mit diesen Spassten ist allerdings: Sie halten alles andere 
(was sie nicht brauchen oder erst garnicht begreifen oder zumindest 
nicht umsetzen können) für "unschön" und tönen das dann auch noch laut 
heraus (weil sie sonst ja ihre ohnehin minimale Eigenleistung noch 
weiter entwerten würden).

von Peter D. (peda)


Lesenswert?

Mike Richard schrieb:
> Ich finde den Artikel hier nicht mehr, meine aber gelesen zu haben, dass
> eine der beiden Varianten technisch gesehen nicht schön ist.

Nur mit externem Interrupt wird es umständlich, d.h. man braucht eh noch 
den Timerinterrupt mit dazu.
Und da ist es eben einfacher, gleich im Timerinterrupt abzutasten und 
sich den externen Interrupt ganz zu sparen.

Und bei gestörtem Signal kann es schnell zu mehr als 59 
Flankeninterrupts kommen, was man wieder abfangen muß oder man riskiert 
bei unüberlegtem Programmaufbau einen Pufferüberlauf.

Auch hatten früher MCs oft nur 2 externe Interrupts, die man sich dann 
besser für wirklich eilige Sachen aufgespart hat.

: Bearbeitet durch User
von Lurchi (Gast)


Lesenswert?

Je nach Empfängerschaltung kann der Externe Interrupt bei Funkstörungen 
sehr viele Interrupts verursachen. Oft verhidnert dies aber auch schon 
die Hardware im Empfänger. Man kann aber auch den externen Interrupt 
nutzen und dann ggf. den Interrupt abschalten, wenn man sowieso kein 
Signal erwartet oder haben will. Da ist polling im 10 ms Raster deutlich 
einfacher.

Wie man am besten Auswertet hängt auch davon ab wie gut der Empfang ist, 
bzw. wie viel Aufwand man treiben will, um auch noch ein schlechtes 
Signal zu erkennen.

Man kann einiges gewinnen, wenn man ausnutzt das die Pulse genau in 1 
Sekunden Takt kommen. Für den Anfang der Pules kann man also eine Art 
Fehlertolleranten software PLL nutzen - Störpulse irgendwo dazwischen 
kann man so gut ignorieren.

von Alex D. (allu)


Lesenswert?

Mike Richard schrieb:
> andere arbeiten mit einem Timerinterrupt alle 10ms und lesen
> den Datenpin dann ein

Zur DCF-Decodierung verwende ich einen Timerinterupt von 20msec zur 
Abtastung des Zeitsignals. Ausgemessen werden nur die Zeiten in denen 
der DfC sendet, nicht aber die Austastzeiten. Das vereinfacht die 
Decodierung des Zeitsignals. Zur Störimpulsunterdrückung ist ein sehr 
einfacher Softwarefilter vorgeschaltet. Midestens 3 Abtastungen müssen 
gleich sein, bevor eine Änderung des DCF-Sinals erkannt wird. 
Funktioniert seit Jahren ohne Probleme. Allerdings ist der DCF-Sender 
auch nur ca. 30km von meinem Wohnort entfernt.

von Harald W. (wilhelms)


Lesenswert?

Alex D. schrieb:

> Allerdings ist der DCF-Sender
> auch nur ca. 30km von meinem Wohnort entfernt.

Da reicht doch schon ein Detektor mit LED ohne Stromversorgung.
Ein morsegeübter Amateurfunker kann sicherlich dann die Zeit
direkt an der LED ablesen. :-)

von Alex D. (allu)


Lesenswert?

Ein morsegeübter Amateurfunker kann sicherlich dann die Zeit
direkt an der LED ablesen. :-)

Stimmt fast so, allerdings geht es auch ohne Morseübung. Ohne Quatsch, 
wir haben es probiert und es hat geklappt!

von Jobst M. (jobstens-de)


Lesenswert?

eagle user schrieb:
> Außerdem passiert nachts zwischen 2 und 3 die
> Sommer-/Winterzeitumstellung. Wenn du kurz nach 3 Uhr synchronisierst,
> hast du fast lückenlos die richtige Uhrzeit.

Dass die Zeit umgestellt wird, weiß er aber um 16:00 auch schon. Dafür 
gibt es ein Bit, welches das vorher ankündigt.
Wenn das gesetzt ist, weiß er, dass er in der nächsten Nacht von Sa auf 
So um 1:00 UTC umschalten muss. Welche Zeit (MEZ oder MESZ) aktiv ist, 
weiß er auch.


Mike Richard schrieb:
> Die Lib sollte dann
> entsprechend auch in C sein und möglichst leicht verständlich. Ich
> möchte keine Arduino-Labs verwenden, ohne genau zu sehen, was passiert.
> Deshalb dieses Mal auch „richtige“ Programmierung eines AVR mit Atmel
> Studio, ohne die Arduino-IDE und Bootloader etc.

Also Du möchtest eine fertige lib benutzen, aber aus dem selben Grund 
möchtest Du genau den Arduino NICHT benutzen!?

Wenn Du es selbst machen möchtest, wirst Du keine Lib benutzen. Das geht 
mit dem Arduino allerdings genau so.


Mike Richard schrieb:
> Das 0. Bit ist eine Pause und zeigt den Start des Signals.

Eigentlich fehlt die 59. Sekunde. Die 0. Sekunde ist vorhanden und damit 
startet das Zeittelegramm.


Mike Richard schrieb:
> Timer entsprechend laden und Tiefschlaf, bis
> der Timer einen Interrupt auslöst, und den AVR aufweckt.

Das wirst Du mehrfach machen müssen. Ein Timerüberlauf wird nicht lang 
genug sein. Aber kein Problem. Du hast ja die Zeit.


Mike Richard schrieb:
> Meint ihr, das ist mit dem ATmega328 ohne weiteres möglich?

Das ist auch mit dem ATmega48 ohne weiteres möglich. Es sei denn Du hast 
so viele Schaltvorgänge, dass dadurch der Programmspeicher platzt.


Gruß

Jobst

von Kempra (Gast)


Lesenswert?

Jobst M. schrieb:
> Dafür gibt es ein Bit, welches das vorher ankündigt.
Aber nur eine Stunde lang. Wenn die Uhr um drei zurueckgestellt wird, 
wird das 16:00 Uhr noch nicht gesendet.

von Alex D. (allu)


Lesenswert?

Kempra schrieb:
>> Dafür gibt es ein Bit, welches das vorher ankündigt.
> Aber nur eine Stunde lang. Wenn die Uhr um drei zurueckgestellt wird,
> wird das 16:00 Uhr noch nicht gesendet.

Oder die Uhr selbst ausrechnen lassen:

Ist es März und der letzte Sonntag im Monat und 2 Uhr dann auf 3 Uhr und
Sommerzeit umstellen.

Ist es Oktober und der letzte Sonntag im Monat und Sommerzeit dann um 3 
Uhr auf 2 Uhr und Winterzeit umstellen.

Dann stimmt die Uhrzeit und es ist egal wann wieder synchronisiert wird.

Gruß  Alex

von Joachim B. (jar)


Lesenswert?

Jobst M. schrieb:
> Also Du möchtest eine fertige lib benutzen, aber aus dem selben Grund
> möchtest Du genau den Arduino NICHT benutzen!?
>
> Wenn Du es selbst machen möchtest, wirst Du keine Lib benutzen. Das geht
> mit dem Arduino allerdings genau so.

so mache ich das, Arduino und die DCF77 von Dannegger im Code, so lerne 
ich auch andere Wege zu sehen und zu verstehen, habe aber die DCF77 
Auswertung schon vor 15 Jahren am PC programmiert auf meine Weise

Alex D. schrieb:
> Oder die Uhr selbst ausrechnen lassen:
>
> Ist es März und der letzte Sonntag im Monat und 2 Uhr dann auf 3 Uhr und
> Sommerzeit umstellen.
>
> Ist es Oktober und der letzte Sonntag im Monat und Sommerzeit dann um 3
> Uhr auf 2 Uhr und Winterzeit umstellen.

ist auch in meinem AVR NetIO Pollin in der Software und nun im Arduino 
wordclock

von Fred R. (fredylich)


Lesenswert?

Hallo,

Autor: Joachim B. schreibt.

PS. DCF77 Empfang ist hier so was von mies da ist man froh wenn der
einmal in der Woche sich synchronisiert, es lief auch schon mal 4 Wochen
ohne Sync.

Meine bescheidene Erfahrung. Es ist immer eine Aufbausache. DCF77 baue 
ich als ortveränderliches Modul mit nachgeschalteter Leistungsstufe auf. 
Sind auch Leidungslängen zum MC bis 10 Meter kein Problem.
Somit ist die beste Ausrichtung zum Sender möglich. Optimum zeigt eine 
LED an.

Autor: c-hater schreibt.

Techische Sichtweisen haben keinen Bedarf an "Schönheit". Alles, was da
zählt, ist Zweckmäßigkeit. Und diese Zweckmäßigkeit ergibt sich, wen
wundert's, aus dem Zweck der Sache.
Meinung ist OK.

Hier gehst du zu weit.
Das Problem mit diesen Spassten ist allerdings: Sie halten alles andere
(was sie nicht brauchen oder erst garnicht begreifen oder zumindest
nicht umsetzen können) für "unschön" und tönen das dann auch noch laut
heraus (weil sie sonst ja ihre ohnehin minimale Eigenleistung noch
weiter entwerten würden).

Nicht alle die hier helfen wollen, sind Superexperten wie DU.

Meine zuverlässige und bewährte Lösung ohne externem Interrupt und mit 
Entscheitung wann synchronisiert werden soll, wage ich nicht mehr zu 
Veröffentlichen, nutze eine Lib die nicht auf meinem „Mist“ gewachsen 
ist. Eine kleine Eigenleistung für Lösung ist schon dabei.

Mit freundlichen Grüßen der Spasster
Fred

von Joachim B. (jar)


Lesenswert?

Fred R. schrieb:
> Meine bescheidene Erfahrung. Es ist immer eine Aufbausache. DCF77 baue
> ich als ortveränderliches Modul mit nachgeschalteter Leistungsstufe auf.
> Sind auch Leidungslängen zum MC bis 10 Meter kein Problem.

davon habe ich genau ein Modul gebaut im extra case und dient zur 
Überprüfung, mein Ziel ist es trotzdem das kompakt ins Gerät zu 
bekommen.

Bei meinem Bruder im 3ten Stock oberstes funktioniert es ja auch, nur in 
meinem Wohnzimmer nur mit dem abgesetzen Modul, am Gerät nicht und auch 
am abgesetzten Modul klappte es nicht wenn das wUSB aktiv ist.

Ich forsche jetzt mal weiter auf der Stromversorgung, logisch das 
Batteriegeräte weniger Probleme haben.

von Carsten W. (eagle38106)


Lesenswert?

Wenn Du Empfangsprobleme hast, lies Dir mal diesen Thread durch: 
Beitrag "DCF Empfang und Schaltnetzteil"

von Joachim B. (jar)


Lesenswert?

Carsten W. schrieb:
> Wenn Du Empfangsprobleme hast, lies Dir

danke, ich hatte zwar schon mal Filter in der VCC, aber noch nicht die 
Zeit dort den Oszi anzuklemmen, ich denke ich muss mich mal wirklich um 
den Zusammenhang VCC vs. Störungen im Signal kümmern.

von Fred R. (fredylich)


Lesenswert?

Hallo Joachim B

Zitat:
mein Ziel ist es trotzdem das kompakt ins Gerät zu
bekommen.

Dies wird nie eine sichere Lösung sein.
Manchmal sind nur sehr kleine Positionsänderungen nötig, um ein 
„sauberes Signal“ zu bekommen.
Beispiel: Im Keller hatte ich kein Problem(trotz Stahlbetondecke) mit 
der „Güte“. Außerhalb schon. Hatte ja auch DCF im Gerät eingebaut.

Gerät nur einige cm umgestellt. Signal war ausreichend aber konnte 
nichts mehr auf Display sehen. Ist doch Dumm oder?
So kam ich auf Idee DCF77 als eigenständiges Modul aufzubauen. Nun kann 
ich das Modul optimal ausrichten für zuverlässigen Empfang.

PS. DCF77- Modul funktioniert nun auch beim Freund in Polen. Wie bekann 
nicht so nah zu Frankfurt.


Mit freundlichen Grüßen
Fred

von Oldie (Gast)


Lesenswert?

Du willst es nur Sekundengenau?
- Dann reicht eine vernünftig programmierte Polling-Methode.

Du willst Strom sparen?
- Dann lass die Synchronisierung um 16:45 Uhr laufen,
  von 17:00 bis 18:00 wird der Fehler nicht so groß.

Bei halbwegs gutem Empfang ist da auch ein Plausibilitäts-
Test etc... in den 15 Minuten bis 17:00 kein Problem.

Oder lass das Projekt einfach sein, wenn du nicht weißt,
wie du das überhaupt bewerkstelligen kannst.

von Mike Richard (Gast)


Lesenswert?

Wenn ich mit der Pollingmethode synchronisiert habe, kenne ich zwar die 
genaue Uhrzeit, das Weiterzählen passiert dann aber durch den 32 
kHz-Takt.

Ich kann da nicht beeinflussen, wann die Flanke kommt und ob sie 
deckungsgleich mit der detektierten 1. Sekunde (nach der Pause als 
Signalstart) kommt.

Ich möchte aber auch den Start der neuen Sekunde möglichst genau haben. 
Muss ich dann zusätzlich mit dem internen Quarz arbeiten, um einen 
Offset oder sowas zu erstellen?

Oder ist es möglich, den Uhrenquarz "anzuhalten" und mit der genauen 
Sekundenflanke zu synchronisieren? ICh meine nicht, da er ja auch eine 
Einschwingzeit hat und sich erst stabilisieren muss.

von Joachim B. (jar)


Lesenswert?

Mike Richard schrieb:
> Oder ist es möglich, den Uhrenquarz "anzuhalten"

nutzt dir nix

Mike Richard schrieb:
> und mit der genauen
> Sekundenflanke zu synchronisieren?

du weisst doch erst wenn du in der nächsten Sekunde bist ob die vorige 
100ms oder 200ms mit 800-900ms Ruhe kam

einfach nur so kann es ein Störimpuls gewesen sein

von Jobst M. (jobstens-de)


Lesenswert?

Mike Richard schrieb:
> Oder ist es möglich, den Uhrenquarz "anzuhalten" und mit der genauen
> Sekundenflanke zu synchronisieren?

Was hast Du denn bitte vor? Den Fehler des Empfängers so gut es geht zu 
syncronisieren? Die Empfänger haben häufig sehr schmale Filter (~10Hz 
Bandbreite), damit wird der Impuls vorne und hinten sowieso um bis zu 
100ms verschliffen. Um den Bruchteil von 1/32768s braucht man sich dann 
auch keine Gedanken mehr zu machen.



Gruß

Jobst

von Lumi (Gast)


Lesenswert?

Wenn die nullte Sekunde detektiert wird (steigende Flanke nach 
mindestens 1.8 Sekunden Ruhe) muss der Zähler des Sekunden-Timers 
zurückgesetzt werden. Ich glaube, das war mit Sekundensynchronisierung 
gemeint.

von Joachim B. (jar)


Lesenswert?

Lumi schrieb:
> (steigende Flanke nach
> mindestens 1.8 Sekunden Ruhe) muss der Zähler des Sekunden-Timers
> zurückgesetzt werden. Ich glaube, das war mit Sekundensynchronisierung
> gemeint.

das wäre aber Minutensynchonisierung für mein Verständnis ;-)

von Peter D. (peda)


Lesenswert?

Der Timerinterrupt tastet z.B. mit 10ms ab und bildet gleichzeitig den 
Vorteiler 1:100 für die interne Uhr.
Bei einem gültigen Paket wird der Vorteiler zurück gesetzt, d.h. der 
Softwarefehler beträgt <10ms.
Der Fehler des Empfangsmoduls wird aber deutlich größer sein.

Früher waren auch die Fernsehuhr bzw. der Piepton im Radio sehr genau.
Heutzutage bei digitalem oder Kabel-Empfang gehen die aber erheblich 
nach.
Wenn man z.B. ein UKW-Radio über Antenne oder Kabel anhört, sind da 
mehrere Worte Laufzeitunterschied.

von Alex D. (allu)


Lesenswert?

Peter D. schrieb:
> Der Timerinterrupt tastet z.B. mit 10ms ab und bildet gleichzeitig den
> Vorteiler 1:100 für die interne Uhr.
> Bei einem gültigen Paket wird der Vorteiler zurück gesetzt, d.h. der
> Softwarefehler beträgt <10ms.
> Der Fehler des Empfangsmoduls wird aber deutlich größer sein.

Wenn die Laufzeit des Empfangsmoduls bekannt ist, lässt sich diese in 
etwa auch noch ausgleichen. Möchte man zum Beispiel 30msec Laufzeit 
kompensieren, einfach den Vorteiler auf 3 setzen.

von Lurchi (Gast)


Lesenswert?

Wenn man will, kann man auch die ICP Funktion des µC nutzen, um die 
Quatisierung auf die z.B. 10 ms vom Polling zu umgehen - viel nutzen 
wird es aber vermutlich nicht. Bei den meisten Emfpangsmodulen hat man 
in der Flanke oft schon Unsicherheiten von einigen 10 ms. Man kann zwar 
mitteln, aber der Fehler kann z.B. von der Signalstärke abhängen. Da 
kommt es dann auch auch auf die Empfängerschaltung an. Als ersten 
Schritt kann man aber schon die Syncronisation der Sekunden nicht nur an 
einer Flanke machen, sondern etwa über die 59 Pulse einer Minute 
mitteln.

Wenn die den wirklich im den ms Bereich gehen will, müsste man ggf. 
schon die Phasenmpdulation auswerten und kann entsprechend kein 
einfaches Emfangsmodul mehr nutzen. Das ist dann von der Tendenz her 
auch keine super sparsame Schaltung mehr. Das ginge dann mehr in 
Richtung Software defined radio - da wird die Auswertung dann schon 
recht anspruchsvoll und könnte mehr als den AVR vertragen.

Über den Tag bräuche man dann ggf. auch so etwas wie einen TCXO oder 
wenigstens ein Temperaturkompensation in Software. Abweichungen in der 
Absoluten Frequenz des 32 kHz Quarzes kann man in der Software 
berücksichtigen, etwa bei der Umrechnung Quarz-zyklen in Uhrzeit.

von Mike Richard (Gast)


Lesenswert?

Mir geht es nur um die genaue Sekunde. Wenn ich Funkuhr auf einer 
Webseite mit meiner gekauften Hardwarefunkuhr abgleiche, stelle ich 
fest, dass der Sekundenwechsel gleichzeitig statt findet. Eine halbe 
Sekunde versatz würde ich merken, 10 Millisekunden sicherlich nicht mehr 
so gut. Brauche ich aber auch nicht.

Ich habe nicht daran gedacht, dass ich bei jedem Timertick nur 1/32768 s 
weiterzähle. Hatte mir den Timertick erst sekündlich vorgestellt, was 
dann dazu führen würde, dass ich eben einen Hardwareversatz von bis zu 
einer Sekunde habe. So ist der Hardwareversatz ja nur max. 1/32768 s
Bin fälschlicherweise davon ausgegangen, weil ich bei 32,768 kHz immer 
von der guten Teilbarkeit zu einer Sekunde gedacht habe (per 
Fuse-Bit-Teiler), aber das kann ja per Software gemacht werden. (Wobei 
ich dann vielleicht Overflow-Probleme des Timers bekomme ;-)....

von Oldie (Gast)


Lesenswert?

Wenn es hier um Auswertemethoden geht, sollte man sich mal
vor Augen halten, was physikalisch vorhanden ist und was
man haben will.

In den allermeisten Fällen ist es ausreichend, wenn man die
Uhrzeit auf 0,1 s genau hat. Das funktioniert mit Polling
im 10 ms Takt sehr gut.
Zwischen 120 und 180 ms (12...18 Takte) nach der aktiven
Taktflanke detektiert man den Bitwert:
NULL ist nach 100 ms zu Ende, EINS erst nach 200 ms.
Die Dekodierung betrachtet auch die Parity-Bits UND vergleicht
jedes neue Telegramm mit dem zu erwartenden Telegramm.
Dazu ist natürlich auch die SZ/WZ- und die Schaltsekunden-
Ankündigung zu betrachten.

Jetzt kommen hier Schlaumeier und verkünden:

- Eine Laufzeit vom Sender zum Empfänger von 30 ms!
Quatsch! Die Laufzeit ist max 5 ms im Empfangsbereich von
1500 km. Innerhalb Deutschlands weniger, als 3 ms.

- "wird der Impuls ... um bis zu 100ms verschliffen"
Quatsch! 5...15 ms bei den üblichen billigsten Empfängern.

Somit ist man bei 10 ms Pollrate auf 0,03 s genau.

Wer sich etwas Mühe macht und den Externen Interrupt
angemessen einsetzt (Zeitfenster) und dazu einen halbwegs
genauen Quuarz spendiert, kann seine DCF-Uhr auch auf
wenige ms genau machen.

von John (Gast)


Angehängte Dateien:

Lesenswert?

Oldie schrieb:
> Jetzt kommen hier Schlaumeier und verkünden:
> - "wird der Impuls ... um bis zu 100ms verschliffen"
> Quatsch! 5...15 ms bei den üblichen billigsten Empfängern.

Was sind bei dir die üblichen Empfänger?
Hast du nachgemessen?

Ich habe gerade gemessen:
Kanal 1: demoduliertes DCF-Signal
         (700 Hz - von diskret aufgebautem Empfänger)
Kanal 2: Empfänger von Reichelt
Kanal 3: Empfänger von Conrad

 -> Reichelt: ca. 22 ms
 -> Conrad:   ca. 25 ms
Dein Bereich von 5…15ms liegt um 46…400% daneben.

Zwischen den Modulen von Conrad und Reichelt existiert ein Jitter von 
knapp 5ms. Welches Modul diesen Jitter verursacht hab ich nicht geprüft.

von John (Gast)


Lesenswert?

P.S.:

Ich möchte noch erwähnen, dass ich hier sehr guten DCF-Empfang habe, mit 
wenig Störungen.
Bei schlechtem Empfang dürfte das Signal deutlich mehr „verschliffen“ 
sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.