Hallo @ll, Ich programmiere einen µC um einen DCF77 - Empfänger auszulesen. Um die ankommenden Signale auf Plausibilität zu kontrollieren, wollte ich die Zeiten mit einer Toleranz von +/-10% überprüfen. Bei der Darstellung des Signals auf dem Oszi hab ich festgestellt, daß die Signallängen doch ziemlich stark von den überall angegebenen 100 bzw. 200ms abweichen. Meine Frage an die DCF77 Experten ist nun, ändert sich diese Signallänge öfters, oder ist diese Abweichung ok, bzw. gleichbleibend. (möglicherweise Unterschiede zum "Ersatzsender") Gruß und Dank von Mike
wie groß ist denn die abweichung? ich hatte auch so meine probleme damit. auf digital hobby gab es ein beispiel projekt. die abweichungen könnte auch vom schlechten empfang kommen. beispiel hin oder her... am besten hatte es bei mir funktioniert wenn ich mit dem int vom der uhr einen timer gestartet hab und dann nach sagen wir 150 ms geguckt hab ob ein high oder low am pin anliegt
Hallo Sebastian, ähnlich hab ichs auch vor, trotzdem dachte ich an eine etwas gründlichere Überprüfung, da der letztentliche Einsatz in einer etwas"verseuchten" Umgebung stattfindet. Da die Signale aber recht gut aussehen (von der Signalform her), halt nur ca. 10% zu kurz sind wollt ich mal Langzeiterfahrungen einholen, um die Funktionalität auch in ein paar Monaten / Jahren noch zu gewährleisten. Gruß
Deutliche Abweichungen in der Signallänge sind je nach Empfänger leider normal. Es sollten jedoch zwei deutlich unterscheidbare Längen vorkommen. Davon den Mittelwert nehmen und auf kürzer oder länger vergleichen...
Wenn es vom Empfänger abhängt, solls mir auch recht sein, die Signallänge bleibt dann ja immer gleich. Somit kann ich sehr genau meine Überprüfung durchführen. Gruß
Die Abweichungen enstehen warscheinlich durch den Tiefpaß im Empfängermodul und werden auch von der Signalstärke abhängig sein. Wichtig ist daher auch die Impulsabstände zu testen und auch die Anzahl der Pulse je Minute (59). Denn Störungen sind ja asynchron zum Nutzsignal, d.h. sie erzeugen zusätzliche Pulse an falscher Stelle oder überdecken Pulse. Eine sehr zuverlässige Fehlererkennung kannst Du auch in meinem Codebeispiel finden: http://home.tiscali.de/peterd/appl/soft/c51/thclock/index.htm Peter
Hallo Peter, Ich hab mir dein Programm mal in Ruhe angeschaut, ehrlich gesagt ich es mir noch etwas zu hoch, da ich zwar meine ersten Gehversuche in C schon absolviert habe, trotzdem aber vorwiegend in Assembler programmiere, und zudem noch ziemlich weit am Anfang mit meinen "Künsten" stehe. Was die Signalabstände betrifft, die sind natürlich schön 1sec. bzw. einmal 2sec. auseinander, wie`s halt soll. Störungen kann man doch am besten ausblenden, wenn man das Nutzsignal auf die bestimmten erwarteten Eigenschaften (z.B.Signallänge) überprüft, oder? Und wenn die vom jeweiligen DCF - Modul abhängen, dann muß die Programmierung doch an die einzelnen Module angepasst werden. Gruß Gruß
Schau mal in der Codesammlung unter DCF77 und Temperatur. Das war mein erstes größeres C-Programm. Sicher noch nicht optimal, aber die Impulslängenüberwachung zum einstellen.
An die Module muß nichts angepaßt werden. Wenn Du 10ms Abweichung festgestellt hast, dann nimm einfach ein etwas größeres Toleranzfenster. Ich taste mit 64Hz (=15,6ms) ab, dadurch ergeben sich in meinem Programm folgende magische Zahlen: 4: 62ms (min) 20: 312ms (max) 10: 156ms (0/1-Erkennung) 60: 0,94s (min 1s) 70: 1,09s (max 1s) 120: 1,87s (min 2s) 140: 2,18s (max 2s) Peter
Hallo, was mich mal interessiert, werden die Daten von Minute x auch in Minute x übertragen? Oder sind es die Daten der folgenden Minute?? Karl
Es sind die Daten der folgenden Minute. Ich habe im Moment keinen Link, aber am besten danach Googeln (oder M$M-en) :)
Ganz verstehe ich das nicht:
1 | ^50d88a4 48) void clock(void) |
2 | ^50d88a4 49) { |
3 | ^50d88a4 50) uchar code MDAYS[] = { |
4 | ^50d88a4 51) 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
5 | ^50d88a4 52) uchar i; |
6 | ^50d88a4 53) |
7 | ^50d88a4 54) time.second++; |
8 | ^50d88a4 55) if( time.second == 60 ){ |
9 | ^50d88a4 56) time.second = 0; |
10 | ^50d88a4 57) one_minute = 1; // to correct deviation |
11 | ^50d88a4 58) time.minute++; |
12 | ^50d88a4 59) if( time.minute == 60 ){ |
13 | ^50d88a4 60) time.minute = 0; |
14 | ^50d88a4 61) time.hour++; |
15 | ^50d88a4 62) switch( time.hour ){ |
16 | ^50d88a4 63) case 24: |
17 | ^50d88a4 64) time.hour = 0; |
18 | ^50d88a4 65) time.day++; |
19 | ^50d88a4 66) time.wday++; |
20 | ^50d88a4 67) if( time.wday == 8 ) |
21 | ^50d88a4 68) time.wday = 1; |
22 | ^50d88a4 69) i = time.month; |
23 | ^50d88a4 70) if( i == 2 && (time.year & 3) == 0 ) // leap year |
24 | ^50d88a4 71) i = 0; |
25 | ^50d88a4 72) if( MDAYS[i] == time.day ){ |
26 | ^50d88a4 73) time.day = 1; |
27 | ^50d88a4 74) time.month++; |
28 | ^50d88a4 75) if( time.month == 13 ){ |
29 | ^50d88a4 76) time.month = 1; |
30 | ^50d88a4 77) time.year++; |
31 | ^50d88a4 78) if( time.year == 100 ) |
32 | ^50d88a4 79) time.year = 0; // next century |
33 | ^50d88a4 80) } |
34 | ^50d88a4 81) } |
35 | ^50d88a4 82) break; |
36 | ^50d88a4 83) // case 2: |
37 | ^50d88a4 84) // case 3: summertime(); break; |
38 | ^50d88a4 85) } |
39 | ^50d88a4 86) } |
In Zeile 72 wird anhand der MDAYS Tabelle geprüft ob ein "Kalendertagüberlauf" für das jeweilige Monat stattgefunden hat. Aber bedeutet das nicht, dass der jeweilige Grenzwert (also der 30. bzw. 31 des Monats) gar nicht mehr erreicht wird, sondern dann sofort auf den 1. des Monats umgeschaltet wird? Müsste es statt == nicht <= heissen? Was in Zeile 57 gemacht wird, verstehe ich auch noch nicht ganz, aber da muss ich mir den restlichen Code erst noch etwas angucken :-). Viele Grüße, Klaus
Klaus W. wrote: > auf den 1. des Monats umgeschaltet wird? Müsste es statt == nicht <= > heissen? Also "<" wenn dann....
Schiebt mal zum Test die Daten längere Zeit in eine Datei. Bei mir kam da durch Fremdstörungen ziemlicher Müll vom Empfänger. Statt 11:11 Uhr 11:$$ usw. .... jedenfalls auch Zeichen die todsicher keine Zahlen waren! Deshalb gut prüfen !
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.