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...)
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:
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!?
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:
Nun wird sich jeder denken, dass das keine Zahlen sind. Stimmt,
aber wofür ist das Display zweizeilig?
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.
(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. ;)