Hallo,
ich versuche schon seit längerem einen DCF-Empfänger in Betrieb zu
nehmen.
Komme aber leider absolut nicht weiter. Das Empfangen/Auswerten bereitet
mir doch große schwieriegkeiten. Da ich auch kein Oszilloskop hier habe,
kann ich mir das Signal auch nicht wirklich ansehen. Habe meine
Funktionen jetzt mal vereinfacht
staticuint16_ttimerInterruptTicks=0;// Anzahl der Aufrufe der ISR
4
staticuint8_ttimerInterruptTime=10;// Alle 10 ms wird der Interrupt ausgelöst
5
timerInterruptTicks++;
6
7
if(!(PIND&(1<<PIND4)))/* low-Pegel an PD4 */
8
{
9
lowPegelAnz++;
10
}
11
else/*high-Pegel on PD4 */
12
{
13
highPegelAnz++;
14
}
15
if(timerInterruptTicks*timerInterruptTime>=1000)
16
{
17
timerInterruptTicks=0;
18
secondOver=true;
19
}
20
}
Die ISR wird alle 10 ms gepollt und ich frage den Status vom Pin ab.
Die Anzahl vom lowPegelanz und highPegelanz lasse ich mir sekündlich
über uart ausgeben.
erwarten würde ich sowas wie
low: 10 high: 90 (im Idealfall für eine 0) und
low: 20 high: 80 (im Idealfall für eine 1)
Habe es jetzt fast ne Stunde laufen lassen.
low verändert sich zwischen 72 und 93.
Zum einem würde ich die Pin-Abfrage tauschen (also low und high
abfrage).
Aber welche Werte wären jetzt eine 1 und eine 0? Wie groß kann die
Toleranz sein?
Johannes schrieb:> low verändert sich zwischen 72 und 93.
habe sogar gesehen, dass low auch manchmal (öfters) 99 ist und high dann
0. Aber diese sind nicht 60 logs dahinter. Das wäre dann ja eine neue
Minute. Sondern überall zwischendurch
Du brauchst ein zuverlässiges Signal. Exakt jede Sekunde (außer zu
Beginn der Minute) muss ein Impuls empfangen werden. Das kannst du mit
bloßem Auge (LED) und einer ticken Uhr am Ohr überprüfen.
Die Impulse sind im Idealfall 100 und 200ms lang. Der Unterschied ist so
deutlich, dass man es mit bloßem Auge sehen kann. Was du das ermittelt
hast, passt gar nicht.
Dein Programm sollte 6 Zeiten unterscheiden können:
a) <50ms = zu kurz -> abbrechen und auf Beginn der nächsten Minute
warten
b) 50-150ms = Low
c) 150 - 250ms = High
d) 250 - 1500ms = zu Lang -> abbrechen und auf Beginn der nächsten
Minute warten
e) 1500-2500ms = Nächste Minute / Empfang beginnt
f) > 2500ms = zu Lang -> abbrechen und auf Beginn der nächsten Minute
warten
Schreibe Dir einen Zustandsautomaten, der am Ende jedes Impulses
zwischen diesen 6 Fällen unterscheidet und weiter verzweigt.
Du müsstest imstande sein, das Protokoll manuell mit zu schreiben und zu
decodieren. Die ersten 35 Sekunden reichen schon aus, um die Uhrzeit zu
erhalten. Mach das mal. Wenn das nicht klappt, hast du schlechten
Empfang.
Schlechter Empfang wird meistens durch gestörte Stromversorgung oder
andere elektrische Geräte in der Nähe ausgelöst. Zur Gegenprobe kannst
du den Empfänger mit Batterie betreiben und von allen anderen Geräten
weit weg aufstellen.
Stelle erst einmal zuverlässigen Empfang her her, dann sehen wir weiter.
> Aber welche Werte wären jetzt eine 1 und eine 0? Wie> groß kann die Toleranz sein?
Aus dem Datenblatt eines DCF-Moduls von Reichelt:
Impulsbreite log. "0" 40...130 ms
Impulsbreite log. "1" 140...230 ms
Stefan ⛄ F. schrieb:> Dein Programm sollte 6 Zeiten unterscheiden können:
Ich habe das nochmal überarbeitet:
Dein Programm sollte 4 Impuls-Zeiten unterscheiden können:
a) <50ms = zu kurz
b) 50-150ms = Low
c) 150 - 250ms = High
d) 250 - 1500ms = zu Lang
Außerdem sollte es die Pausenzeit zwischen den Impulsen messen:
1) <700ms = zu kurz
2) 700-1000ms = Ok
3) 1001-1700ms = ungültig
4) 1701-2000ms = Neue Minute beginnt
5) >2000ms = zu lang
Danach wertest du diese beiden Infos kombiniert aus:
Zuerst wartest du auf b4, das kennzeichnet den Beginn einer Minute. Von
da an wartest du auf 35 Bits (wenn du nur die Uhrzeit brauchst) oder 58
Bits wenn du auch das Datum brauchst.
Jedes Bit muss entweder b2 oder c2 haben. Solltest du irgendeine andere
Kombination empfangen, brichst du ab und wartest wieder auf die nächste
Minute, also b4.
Bei meiner Nixieuhr habe ich die Pausenzeit erfasst. Als Toleranz habe
ich (10ms Schritte) jeweils +- 2 bis 3 genutzt. Zur Visuellen
Darstellung des Signals würd ich in der ISR noch einen Ausgang mit ner
LED dran ansteuern - da siehst du kleine "Wackler".
Zus. Noch eine Fehler-LED, dann siehst du bei welcher Sekunde er
rausfliegt.
Spiele mal mit Drehung und Position des Empfängers. Die Dinger sind sehr
empfindlich, auch was die Versorgungsspannung angeht. Versorgung aus den
selben 5 Volt wie der uC ohne Siebung kann schon problematisch sein.
Johannes schrieb:> Habe es jetzt fast ne Stunde laufen lassen.> low verändert sich zwischen 72 und 93.
Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der
Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.
Scheinbar gibt es eine Rückwirkung auf die innere Schaltung und die
Impulse verändern sich unkontrollierbar in der Länge. Ich habe folgende
Anschaltung gebaut:
Beitrag "[Bascom/AVR] Uhr und DCF"
Damit läuft mein Modul. Der Pullup im Mikroconntroller ist
eingeschaltet.
Stefan ⛄ F. schrieb:> Was du das ermittelt> hast, passt gar nicht.
Ist aber so aufgenommen.
Daher ja auch die Frage, woran man es erkennen kann. Wenn die Signale
ideal kämen, würde ich die Auswertung schon machen. Aber damit brauche
ich noch nicht anfangen, wenn das Signal noch nichtmals stimmt.
Ich wollte das Signal erstmal roh darstellen, indem ich zähle wie viele
Ticks low und dann high waren. Aus denen kann ich mir dann ja die
pulslänge bererchnen.
Alex D. schrieb:> Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der> Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.
Da habe ich nichts dran. Habe das Modul direkt mit dem Controller
verbunden
>Ich wollte das Signal erstmal roh darstellen,
Ja meine Güte, dann mach das doch!
1
if (!(PIND & (1<<PIND4))) uart_sendString("0") else uart_sendString("1")
Lass das Ding z. B. drei Minuten laufen und logg das, was über den UART
auf Deinen PC reinkommt, in eine Datei. Die wird am Schluss um die 20000
Zeilen lang sein (6000 pro Minute), alle entweder "0" oder "1". Ersetze
alle "1"-Zeilen durch "##############". Danach kannst Du das Signal wie
auf einem Oszilloskop sehen. Nur die Zeitachse ist vertikal statt
horizontal - daran muss man sich aber nicht stören.
(PS: Keine Angst wegen 20000 Zeilen: Die sind weder für Dich noch für
Deinen PC noch für einen ordentlichen Editor wie Notepad++ ein Problem.)
Johannes schrieb:> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller> verbunden
Und der Pullup ist abgeschaltet? Wenn ja, dann passt alles.
Johannes schrieb:> Alex D. schrieb:>> Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der>> Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.>> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller> verbunden
Wohl die schlechteste aller Ideen.
Hier ist ein Interface: http://www.grother.de/dcf-modul-01.html und
siehe Anhang
Er hier hatte ähnliche Probleme:
Beitrag "DCF77-Modul - Timing stimmt nicht"
Erst den Empfang sicherstellen, dann mit dem uC rumspielen, besonders,
wenn keine Messmittel zur Verfügung sind.
Wenn schit-in dann shit-out. Ist eben so... ^^
Michael M. schrieb:> Erst den Empfang sicherstellen, dann mit dem uC rumspielen, besonders,> wenn keine Messmittel zur Verfügung sind.
naja, dazu brauche ich ja den uC um mir wenigstens etwas anzeigen lassen
zu können.
Michael M. schrieb:> Wenn schit-in dann shit-out. Ist eben so... ^^
Deswegen wollte ich auch noch nicht mit der Auswertung Anfangen, sondern
erst sehen was wirklich rein kommt
Werde jetzt mal wie LostInMusic gesagt hat ausgeben und schauen, ob ich
damit was anfangen kann
Michael M. schrieb:>> Alex D. schrieb:>>> Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der>>> Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.>>>> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller>> verbunden>> Wohl die schlechteste aller Ideen.
Sicher nicht, immer noch besser als den Ausgang mit fast 100 kOhm wie in
der gezeigten Schaltung zu belasten.
Alex D. schrieb:>>> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller>>> verbunden>>>> Wohl die schlechteste aller Ideen.>> Sicher nicht, immer noch besser als den Ausgang mit fast 100 kOhm wie in> der gezeigten Schaltung zu belasten.
Sorry, 100k sind doch keine "Last", Alex. mit dem Serien-R wird doch nur
der Strom aus dem Ausgang begrenzt, der in die Basis eines als Interface
geschalteten Transistors fließen kann.
Das sind im äußersten Fall dann ca. 25uA !!
Weißt du, welchen Eingangs-R der uC besitzt? Könnte der u.U. nicht noch
viel geringer sein?
_______________Johannes schrieb:> naja, dazu brauche ich ja den uC um mir wenigstens etwas anzeigen lassen> zu können.
Das (ordentlicher Empfang) siehst du dann schon an der munter blinkenden
LED. Also ERST interface, dann uC.
Michael M. schrieb:> Sorry, 100k sind doch keine "Last", Alex. mit dem Serien-R wird doch nur> der Strom aus dem Ausgang begrenzt, der in die Basis eines als Interface> geschalteten Transistors fließen kann.> Das sind im äußersten Fall dann ca. 25uA !!
Ebenfalls sorry Michael, ich habe nur die Erfahrungen mit meinen Modul
beschrieben. Mein uraltes Modul war mit max. 5uA angegeben.
Michael M. schrieb:> Weißt du, welchen Eingangs-R der uC besitzt? Könnte der u.U. nicht noch> viel geringer sein?
Nein, weiss ich nicht, ich hatte auf CMOS getippt.
Michael M. schrieb:> Sorry, 100k sind doch keine "Last",
Doch, für das Pollin DCF Modul durchaus. Mit 50kΩ liefert es schon keine
sauberen Logikpegel mehr. Einem nachgeschalteten NPN Transistor ist das
allerdings egal.
Stefan ⛄ F. schrieb:> Michael M. schrieb:>> Sorry, 100k sind doch keine "Last",>> Doch, für das Pollin DCF Modul durchaus. Mit 50kΩ liefert es schon keine> sauberen Logikpegel mehr.
Legt Pollin beim Kauf denn wenigstens 10 EU als Dank dabei, dafür dass
man diesen Schrott bestellt hat?
Wahrscheinlich China-Sch....ß !
Zum Glück bin ich nicht auf so'n Müll angewiesen.
Trotz allem sind die 100k in Serie erst mal besser als nix.