Forum: Mikrocontroller und Digitale Elektronik DCF77 Signal bei Faltung Signal im Fenster halten


von Marco H. (damarco)


Lesenswert?

Aufbauend auf folgenden Thread 
Beitrag "DCF-Fehlerkorrektur im Streßtest" würde es mich interessieren 
wie das Problem gelöst wurde das dass Signal aus dem Fenster läuft?

Mit Fenster meine ich den Bereich wo gefaltet wird. z.Bsp 1sec.

Nehmen wir an wir ermitteln das Maximum für 1sec. und den Index dazu. Da 
der µP nicht synchron läuft und der Takt je nach Board nicht genau die 
10ms trifft wandert das Signal mehr oder weniger schnell aus dem 
Fenster.

An den Rändern wird das Signal dann geteilt und ist somit nicht mehr 
auswertbar.

Bei 1sec. Faltung kann man dem Signal hinterher laufen, also immer 
wieder den Index wo gefaltet werden soll ermitteln. Wenn ich es aber 
richtig verstanden haben wird später ausschließlich mit einen 200ms 
großen Fenster gefaltet.

Somit kann man sich nicht mehr am Index orientieren da dieser ja gleich 
bleibt. Wenn das ganze nicht auseinander driftet. Das führt eben dazu 
das die Maxima geringer werden bis das Signal aus dem Fenster gerutscht 
ist.


Es ist nötig den Timer so anzupassen das er möglichst genau ist. Damit 
das Signal auch im Fenster bleibt.

Ein Regeln auf das Maxima wäre möglich aber gestaltet sich relativ 
schwierig.

Wer hat die Auswertung nach dem oben genannten Thread realisiert und wie 
wurde das weglaufen verhindert ?

Bei mir läuft es jetzt so das ich beim Start das Signal erst mal in der 
Mitte des 1sec Fensters schiebe.  Dann schaue in welche Richtung es 
läuft und dann den Timer CC anpasse.  Nach der Umschaltung auf 200msec 
habe ich noch keine Lösung das Signal im Fenster zu halten. Es reicht 
aber aus das DCF Signal auszuwerten. Danach muss wieder auf 1sec 
geschaltet werden um den Index neu zu ermitteln.

: Verschoben durch User
von pic (Gast)


Lesenswert?

Klassisches vorgehen, kein adj. vom Timer usw.
jede ms wird der Eingang geprüft, high = 16ms high ohne Unterbrechung,
                                , low  = 32ms low ohne Unterbrechung.
0) 1 Sek kein Signal
1) warten auf Signal 50-150ms , Sekunde+ms auf 0 setzen, weiter mit 
state3
2) warten auf Signal 50-250ms , wenn Sekunde==0 dann Fehler ignorieren,
   ansonsten gehe zu state 0
3) 750ms kein input sampling
4) Signal start muss innerhalb von 200ms starten, ansonsten state 0
5) Wenn sek=59 dann Auswertung der Daten
6) 1700ms kein input sampling, weiter mit state 2


Time Adjust, alle 5 oder 50 Minuten  beim Quarz, ansonten alle 1 und 10 
Minuten.
Gibt es nach 5 Minuten eine Abweichung >= 1ms dann wird korrigiert,
ansonsten wird weitergezählt auf 50 bis 254 Minuten hochgezählt und dann 
korriegiert sobald das erste korrekte Datensatz kommt.
Ab 50 Minuten 1ms, ab 100 2ms, ab 150 3ms Abweichung usw, darunter wird
nicht korrigiert.

Mit time Adjust kann man engere Tolleranzen vorsehen.

von Marco H. (damarco)


Lesenswert?

Das Problem ist das zumindest bei dem von mir verwendeten Board die 
Differenz recht groß ist.

8MHZ Takt teilt auf 1MHZ -> CC 10000 = 10ms

Der Fehler beträgt 50µS auf 10ms bezogen. Für eine 1Sec läuft das ganze 
100 mal ab. Macht einen Fehler pro Sekunde 5ms nach 3 Sekunden sind es 
dann schon 15ms.

Der Index des Maximums schiebt sich also langsam raus.

Wenn man auf 200ms das Fenster setzt ist das Signal nach <10sec nicht 
mehr auswertbar. Da mit 50ms das ganze schon halb raus gelaufen ist.


Folgendes wurde Probiert.

Gültige Bits einsortieren und Referenz setzen. Nach x Sec Differenz 
ermitteln und ausrechnen. Timer anpassen. Neue Referenz setzen.  wieder 
warten und berechnen.

Zum Teil lässt sich damit das Problem kompensieren. Nach dem Umschalten 
steht aber das Fenster von 1sec nicht mehr zur Verfügung. Man Faltet ja 
eben genau an der Stelle wo man das Signal vermutet.

Man könnte auf das Maxima dann regeln. Das muss ich noch probieren ob 
das überhaupt was bringt, da es zu stark Abhängig vom Signal ist. Bzw. 
man müsste das Stellsignal prüfen bevor man stellt.


Als besser hat sich erwiesen die Differenz zu ermitteln und dann den CC 
nur mit einen Fixen Wert zu tippen. Also je nach dem ob sie 
positiv/negativ ist 10µS hoch oder runter.

Dies erwies sich als Stabiler. Bleibt aber das Problem worauf Regeln bei 
200ms.

Man muss das Signal Fangen bevor aus an die äußeren Bereiche kommt. 
Sonst muss man es wieder da hin schieben. Das macht auch nichts da wenn 
alles richtig läuft es wieder genau dort auftaucht wo man es haben 
möchte ;)

So kann man die Signal hinterher Tracken ohne ein Bit zu verlieren. Aber 
man muss eben mit 1sec Falten.  Die Aufgabe bestand aber drin nur alle 
200ms zu Falten und genau an der Stelle wo das Signal ist.

: Bearbeitet durch User
von pic (Gast)


Lesenswert?

Nein, du hast es nicht verstanden.
55ms Signal , 750ms Pause, 200ms Signal start.
Nach dem Signalende ist immer 750ms pause, der Fehler ist nicht 
kumulativ.
Die 5ms Fehler, auch 20ms sind kein Problem für den Empfang.
Dies funktioniert auch mit internem RC OSC.

Minutenanfang ist immer, das Startbit der Sekunde.
Man speichert sich den Wert des ms Zählers am Minutenanfang, bevor man 
diesen auf 0 setzt. Wenn er mehr als 1100 hat, dann speichert man 100, 
ansonsten
ms-900 in eine Byte Variable.

Wenn dann nach 59 Sekunden alles decodiert ist, und man sich sicher ist,
dass der Empfang fehlerfrei war, korrigiert man bei Bedarf den Fehler,
und gibt ihn als Debug Wert auch aus.

Könnte es sein, dass anstelle von 1000 ms für eine Sekunde dein uC bis
1024 zählt, sowie zusammen mit einem Resonator oder internem RC OSC,
diese Ungenauigkeit daraus resultiert ?

von Marco H. (damarco)


Lesenswert?

Ok jetzt habe ich es verstanden. Man lässt ihn nicht frei laufen sondern 
synchronisiert ihn zum Minuten Anfang bzw. auf das Signal. Du prüft ob 
der Pin 1 ist wenn ja ließt du ihn so lange ein bis er 0 ist und wartet 
dann.

Ich glaube aber das wir hier von zwei unterschiedlichen Verfahren reden 
zu den Bits zu gelangen.

Der Zähler löst bei mir alle 10ms einen Interrupt aus der den Port 
einließt und in einen Doppel Buffer das Ergebnis speichert. Nach 100 
Samples dreht sich der um und ich bewerte 100 Werte. Ich bilde wie in 
den oben genannten Thread die Summe und wo das Maxima lag für 1sec 100ms 
200ms .

Dadurch entsteht ein sogenanntes Fenster hier von 100 Werten a 10ms = 
1sec.

Der Unterschied ist eben das selbst eine Störung das Maxima nur gering 
beeinflusst. Anders als wenn man es zur Bedingung macht das der Port 
Wert gleich ist.

Liegen die Maxima dicht bei einander etc. lassen sich die Bits daraus 
ableiten.


Im Prinzip kann man jetzt das DCF Signal schon auswerten aber ich will 
jetzt da Falten wo das Signal ist. Also mach ich das Fenster nur 200ms 
groß und lese die Werte nur dort wo ich das Signal anhand des Index 
berechnet habe.

Die Problematik ist jetzt das ganze synchron zu halten.

Hmm in der Tat ist der Interne 8MHZ RC Takt nicht sehr genau aber es 
sollte möglich sein die Drift auszugleichen.  Ich werde aber trotzdem 
mal Probieren den Timer an eine andere Quelle zu legen. Allerdings 
dürfte der Fehler nicht besser werden da die Teilungsfaktoren bei 
32768HZ nicht besser sind.

von Pic T. (pic)


Lesenswert?

War schon klar, du sprachst ja von Faltung. Ich benutze z.b. 13 bytes um 
die sekunde Abzubilden. 4x70ms und 9x80ms.
Der Decoder ist ja derselbe, und dieser kann
Auch parallel laufen. Weites solltest du keine 10ms sondern 50ms für die 
Faltung verwenden, und nur byte. Auch kann es vorteilhaft sein anstelle 
von 5min nur 2 oder eine Minute, auch nur 30 sek zu falten,
Und erst wenn man den drift wegsyncronisiert hat auf mehr syncen.

von pic (Gast)


Lesenswert?

wenn du deinen Sourcecode posten willst, kann ich mal drueberschauen.

von Marco H. (damarco)


Lesenswert?

Danke mit den Hinweisen kann ich was Anfangen. Mit der Problematik bin 
ich nicht alleine ;)


Hmm eigentlich ist das Ergebnis schon ganz ok auch wenn man auf 1sec 
Faltet. Nach 2-3 Min habe ich eine gültige Uhrzeit.  Auch die Drift 
lässt sich gut kompensieren in dem man das Fenster wieder in die Mitte 
des Signals schiebt.

Mich würde Interessieren in wie weit sich weiterer Aufwand wirklich 
lohnt ? Der Code ist schon relativ Umfangreich.

Vorher habe ich das Signal auch immer mit der üblichen Art aufgelesen. 
Ging eigentlich auch mehr oder weniger gut.

von p1c (Gast)


Lesenswert?

Was interessant ist, sofern ein gültiges Signal da ist, die 60bits zu 
shiften, damit man nach etwas mehr als einer Minute schon ein gültigen
Datensatz hat.
Nur das Minutensignal ist Zeitsyncron, die restlichen haben 30ppm
Fehler von einer Sekunde auf die andere.
Eventuell kann es vorteilhaft sein, 8 bits zu integrieren, für
Stunden .... , die bits für SchaltSekunden sowie Schaltstunde ist auch
vorteilhaft wenn dies beachtet wird.
Und natürlich Daten nicht blind übernehmen sondern gegenchecken.
Wenn der uC eine möglichkeit hat, die Temperatur zu messen, sei es auch 
nur
mit WDT, so kann man über einen temperaturkompensierten OSC 
nachdenken,wo
die Timerkorrekturen im EEprom gespeichert werden, wenn der Taktgeber 
genau
sein soll, auch ohne DCF77.

von Lurchi (Gast)


Lesenswert?

Die Anfänge der Sekunden kommen in festen Takt. Da kann man so eine PLL 
laufen lassen, um immer den Anfang der Sekunde zu synchronisieren. Auch 
wenn das nicht so super genau ist, reicht es für die Wahl der Fenster 
zur Pulserkennung aus - etwas mehr als die 200 ms sollten es schon sein, 
so etwa 400 ms sollten aber in der Regel ausreichen um sicher den ganzen 
Puls drin zu haben.

von AuBacke (Gast)


Lesenswert?

Hier wird ja sehr abgehoben versucht, das DCF-Signal mit
RC-Oszillator-Timing zu entschlüsseln - natürlich fehlerfrei
in 61 Sekunden!

Schrecklich, dass da Faltungen (oder habt ihr in Altsprech
nur neudeutsche "wrap-arounds" gemeint?) auftreten können.

Neusprech ist leider kein Rezept für gute Algorithmen!

Menno, wenn man sich (parallel zur Bit-Aufzeichnung) den Abstand
der aktiven Flanken des DCF-Signals (mit einem Fenster, das dem zu 
erwartenden  RC-Oszillator-Fehler entspricht) herausfischt,
kann man den RC-Oszillator schon mal mit großer Sicherheit auf
ein brauchbares Vielfaches von 1 Hz ziehen. Dazu gibt es das
OSCCAL-Register.
- Wenn es dann passt, kann man auch das Fenster verkleinern,
denn der zu erwartende Fehler ist nun (unerwarteter-weise?)
auch geringer... :-)

Das Fenster für LOW und HIGH ist dann schon mal NULL Problem.

Vorteil: Man kann die (damit vielleicht sogar schneller) erkannte
DCF-Zeit auch ohne Quarz bei temporären Empfangsproblemen etliche
Minuten weiterführen.

Nachteil: Das ist euch zu blöd.

Gähn!

von Marco H. (damarco)


Lesenswert?

Das Problem ist das dass Signal nicht sehr eindeutig ist wie es von 
einer anderen Quelle z.Bsp Lichtschranke wäre.

Weder die Flanken noch die Länge des Signals sind eindeutig und ganz 
schlimm sie differieren je nach Empfang.


Das driften lässt sich zu mindestens bei größeren Fenstern deutlich 
verkleinern. Meine Routine gleicht das ja aus in dem es bei einer 
Abweichung den Timer um 10µ hoch bzw runter tippt. Läuft es aus dem 
Fenster schiebt ein delay das Fenster wieder zurück. Das geht sehr 
einfach in dem man das Abtasten um x Zyklen verzögert. So taucht das 
Signal an der richtigen Stelle wieder auf. Der Timerwert bleibt erhalten 
das spiel beginnt von vorne. Bis es gering genug ist um auf 200ms zu 
schalten.

Bei einen 200ms ist die Sache schwieriger. Da ich kleinen Punkt gefunden 
habe der brauchbar wäre um das Driften zu beobachten.

Außer dem Maxima, daran könnte man das erkennen und auch in welcher 
Richtung es läuft.

Problemtisch ist nur ob der Stellwert auch den Effekt hat den man sich 
vorstellt. Ich vermute das die Reglung das ganze noch schlimmer aus dem 
Fenster schiebt. Durch Störungen etc.


Ich werde die Lösung das Fenster zu schieben auch bei 200ms anwenden, 
orientiert an dem Maxima. Das Maxima kann man beobachten und dann 
relativ vom Index 10ms zurück schieben.

Man muss sich das Vorstellen wie eine 1sec lange Leine. Wenn der Hund zu 
weit gelaufen ist zieht man ihm zur richtigen Position wieder zurück 
bzw. er bleibt kurz stehen ;)

: Bearbeitet durch User
von pic (Gast)


Lesenswert?

Vor den 200ms Impuls gibt es mehr Rauschen als im Durchschnitt.
Die 100ms sind ein 1er Impuls.
Es gibt mehr 0bits als 1bits.
Man hat normales Rauschen, erhöhtes rauschen vor und nach dem Impuls, 
sowie
die ersten 100ms (50/77mm) sind eine Eins, und danach gibt es Rauschen 
und
eine 75% Schwelle von eins Bits. Wenn ein sauberes Signal da ist, 
50-250ms,
dann wird dies hergenommen, ansonsten wird anhand des integriertem 
Signals
der Pegel ausgewerted. Die Schwellen werden so gewählt, dass ein Sync
verlust automatisch auch Fehler hervorruft, also mehr 0 als 1 
produziert,
wenn man nach rechts drifted, oder der Rauschabstand sich unter dem 
Level
bewegt, wenn man nach links abdrifted. Op man da jetzt shifted, oder 
prinzipiell von neu anfang, design Entscheidung.
 Man hat eine gültige Zeit, jede
neue DCF77 wird mit der aktuellen Systemzeit verglichen, und erst wenn
8 gültige DCF77 Telegramme da sind, wird diese Zeit verwendet. Dass dem
Benutzer vorher schon eine Zeit angezeigt werden kann, ist eine andere 
Sache. Es gibt eigentlich nur Schaltjahre, Schaltsekunden/Stunden welche 
einen jump ergeben, und letztere werden eine Stunde vorher angekündigt 
und
passieren nur an definierten Zeiten, wie auch Schaltjahre mit dem Datum.
Was passieren kann ist das MF60 Signal empfangen wird, weil das Modul 
zwei
Quarze 77.5 und 60khz hat.

von Marco H. (damarco)


Lesenswert?

Danke, genau das ist der Ansatz den ich brauchte.

von Marco H. (damarco)


Lesenswert?

Tja also es hilft nichts. Mit der zur Verfügung stehenden Hardware läuft 
das Signal immer wieder aus dem Fenster.  Es lässt sich nicht wirklich 
gut halten.


Es funktioniert nur mit 1sec großen Fenster. Bei 200ms läuft es früher 
oder später raus.

: Bearbeitet durch User
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.