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?
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.
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?
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
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
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.
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?
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.
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?
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
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.
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.
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.
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.
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).
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.
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.
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.
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. :-)
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!
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
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.
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
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
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
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.
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.
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
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.
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.
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
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
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.
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 ;-)
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.
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.
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.
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 ;-)....
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.
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.
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.