DCF-Uhr

Vor einer Woche habe ich etwas bei Conrad bestellt.
Da ich schon länger In einer selbstgebauten Funkuhr interessiert war, habe ich mir einen DCF(77)-Empfänger (Best.-Nr.:641138-xx) mit auf die Liste geschrieben. Die 77 kommen von den 77,5 kHz, mit denen das Signal von Mainflingen (Frankfurt/Main) mit 30kW ausgestrahlt wird. Mehr Informationen über das Signal bekommst du unter www.dcf77.de

Obwohl es Funkuhren jetzt schon zu Spottpreisen an jeder Ecke gibt, ist es doch ein Reiz, so ein Teil doch einmal selber zu bauen bzw. hier zu programmieren (mehr oder minder zumindest...)

DCF-Empfänger
So, oder so ähnlich sieht der Empfänger aus.
Da mir das Kabel zu starr war, habe ich es durch eine Diodenleitung ersetzt.
Falls du dies auch machst, musst du das Kabel exakt gleich lang wählen, da es sonst zu keinem Empfang kommt.
Auch die "Bezeichnung" habe ich selbst darauf geschrieben, da ich die Anschlüsse immer verwechselte.

So, aber jetzt zur Hardware!

zuerst wollte ich das Signal mit dem COM-Port am PC auslesen. Nur leider kann dieser kein Signal von 5 Baud lesen.
Also kräftig gegoogelt und nichts gefunden. In einer VisualBasic-Newsgroup hat mich dann jemand darauf hingewiesen, dass ich es mit PIC-Prozessoren probieren sollte, was auch ursprünglich mein Plan war. Er verwies mich auf die Homepage von Uwe Nagel. Ich kannte zwar schon ein Projekt von ihm (RDS-Decoder) aber das der DCF-Uhr habe ich einfach nicht gesehen.

Also ging es ans Basteln...

Da ich noch ein paar Bauteile brauchte, kam mir es gerade recht, dass meine Mutter in die Nähe einer Elektro-Apotheke kam. Dort kaufte ich mir folgende Teile für dieses Projekt:

- 1x Quarz mit 3,2768 MHz
- 2x Kerkos mit 33pF
- 1x Spannungsregler 78L05
- 1x Transistor BC547C
- 1x Elko 220µF 35V
- 1x Buchsenleiste für das Display

Zusätzlich habe ich noch ein paar Widerstände aus meinem Sortiment.
Eigentlich sollte ich mich für den Kauf des Transistors schämen, ich wollte aber kein Ausschlachtprodukt verwenden...

Der Spannungsregler mit 100mA reicht vollkommen aus, da die Schaltung inkl. Display "nur" 10mA braucht. Natürlich ohne Hintergrundbeleuchtung des LCDs. Für diese Schaltung habe ich, wie vom Autor empfohlen, ein 2x16-Dot-Matrix-Display verwendet.

Aber jetzt zum Schaltplan:
Stromlaufplan DCF-Decoder
Links ist der Eingang für den DCF-Empfänger und rechts der Ausgang für das Display.
Bei dem Spannungsregler hat EAGLE bzw. habe ich die Bezeichnung 78L05 vergessen.
Soll aber nicht stören.

Die Schaltung sollte eigentlich kein Problem sein. Du solltest aber die Empfängerplatine nicht zu nah an der Schaltung platzieren. Ich hatte dabei keinen Empfang mehr. Vielleicht stört ein Controller des Displays oder auch der PIC. Zudem sollte die lange Seite der Ferrit-Antenne mit der langen Seite nach Mainflingen zeigen. Dies ist eine Empfehlung von Conrad Elektronik. Ich hatte auch schon eine Zeit, als die Antenne 90° gedreht war. Warum das - weiß ich nicht.

Mit der Software bekam ich ziemlich schnell eine Zeit - sofern ich die Zeit abziehe, in der ich den Empfänger verpolt hatte :)
Die Synchronisation sollte im Normalfall ungefähr 2-3 Minuten dauern, da das ganze DCF-Signal genau eine Minute dauert.

Eigentlich hatte die Anzeige alles was sie brauchte. Die Sekundengenaue Zeit, den Wochentag und das Datum. Mir fehlte jedoch eine Indikation, ob ein Signal empfangen wird.
Da dazu noch drei bzw. vier Zeichen auf dem Display frei waren, habe ich mich dazu entschieden, einen Funkturm dort hin zu "malen".
Naja, leider kenn ich mich doch nicht zu gut mit PICs aus. heraus kam ein Gekrakel auf dem Display.

Daraufhin eine Mail an Uwe Nagel! Nach nur ein paar Stunden bekam ich eine Antwort mit Anhang!!
Die neue Software für den PIC, bei der der Funkuhrturm ausging, wenn das Signal ausblieb. DANKE DAFÜR!!!

Die Software (V0.4) gibt's hier: Assembler-Liste mit den INC-Dateien und die brennbereite Hex-Datei.

Hier noch ein Bild, wenn die Zeit frisch Synchronisiert wurde. Falls die Flanke nicht mehr ansteigt, verschwindet der kleine Funkturm.
Sieht doch gut aus, oder!?
Display
Die LED links-unten diente anfangs zur Empfangs-Signalisierung. Aufgrund des hohen Stromverbrauchs habe ich diese aber wieder abgeklemmt.

Das war's. Sobald sich bei der Software etwas tut, werde ich es natürlich hier erwähnen!


Es hat sich etwas getan!
Ich muss wieder einmal Uwe Nagel für seine geniale Hilfe danken. Ohne ihn hätte ich das nicht geschafft.
Aber ich will mich bessern ;)

Aber jetzt zu den Änderungen:
Da man im Speicher des Displays 8 eigene Symbole ablegen kann, habe ich mir gedacht, dass ich eine "Big-Clock" machen könnte. Zwar nur zwei Zeilen hoch aber das sollte fürs erste einmal reichen. Nach längerem tüfteln und einigen Verwürfen, da diese blöde "0" nicht gebildet werden konnte, habe ich mich für Folgende Symbole entschieden:
Benutzerdefinierte Zeichen

Nun wird sich jeder denken, dass das keine Zahlen sind. Stimmt, aber wofür ist das Display zweizeilig?
Zahlen

Unter Windows in VB ging ein Test gut aus.
Aber ob es im Assembler genauso gut aussieht?

Nein, leider nicht.
Also brauchte ich wieder meinen "Lehrmeister".
Also schnell eine E-Mail schreiben und einen Tag später kam schon eine .asm-Datei zurück.

Also etwas rumschreiben...
Das ganze war eine kleine Trockenübung, da noch nichts von DCF in dem Code zu sehen war, was eigentlich auch gut war, damit ich jetzt dann auch bald verstehe.

Da Programmieren sah dann so aus:
Bisschen im Code verändert, "kompilieren", den Chip brennen und dann hoffnungsvoll in die Uhr stecken.
Das ganze sah nicht schlecht aus, bis ich versuchte den Code in der Form umzupflügen, dass jede Zeile einzeln beschriftbar ist und das ganze ohne Positionsvariable funktioniert.
Pustekuchen! Nichts wollte mehr.
Die verbesserte Code kam sehr schnell zurück ;)

Gut, also weiter mit dem programmieren.
Irgendwann sah es auf dem Display noch übler aus, da sich das Display plötzlich mitten im Programm neu initialisierte und ab und zu mal die Symbole umschrieb.
Der Fehler hätte mir auffallen müssen, da der Sprung in die zweite Zeile nicht explizit durchgeführt wurde sondern der Cursor einfach verschoben wurde.

Nachdem das wieder funktionierte, war ich daran, die beiden Codes zu vereinen.
Nach ca. 30 Minuten war ich dann auch so weit.
Also schnell den PIC bebrannt und ab in die Uhr.
Es tat sich nichts. Die Uhr wollte einfach nicht synchronisieren.
Als ich nach 30-minütigem Versuch dann aufgab, schaute ich mir den Quellcode an.

Wie ich es vermutete. Ein klitzekleiner Fehler, mit großer Wirkung! Ich habe einen return-Befehl auskommentiert!
Also schnell weg mit dem ";" und ab auf den Chip.
Nach 3 Minuten konnte ich meinen Erfolg betrachten.

Display
(aus Langeweile habe ich die Reflexfolie hinten am LCD weggemacht und eine herumliegende Platine hineingeklemmt. Vielleicht spendiere ich dem Display noch eine EL-Hintergrundbeleuchtung. Der Preis schreckt leider noch ein wenig ab...)

Somit ist jetzt auch die Uhr in der Nacht (mit Hintergrundbeleuchtung) gut lesbar...

Da ich zur Zeit das große Display nicht am PC angeschlossen habe, hab ich es an den PIC angeschlossen. Eine nette Uhr...
Manchmal zeigt sich die Software auf dem PIC allerdings Buggy, da ich in der Früh schon mehrmals 6:77 ablesen konnte.
Der Fehler behebt sich nach ungefähr 1 Stunde automatisch, da spätestens da die Uhr synchronisiert wird ;)

Damit du die neue Version (0.5) auch auf deinen PIC bringen kannst, hier die brennfertige HEX-Datei.

Nach dem Erfolg wollte ich eine wirklich große anzeige realisieren, wie sie auf dem LCD am PC dargestellt wurde.
Allerdings kam mir der Übergang der "Pages" (fließender Übergang des Codes über 2 Seiten) in die Quere.
Das Problem konnte ich bislang nicht lösen (trotz Hilfe aus de.sci.electronics). Wenn du besser in ASM bist, kannst du mir ja schreiben. ;)