ebps.de.vu > Schaltungen > AVR > einfache Funkuhr

einfache DCF77-Funkuhr

Beschreibung

Diese Schaltung ist eine einfache Funkuhr für den Zeitzeichensender DCF77 in Mainflingen. Die Zeit wird auf vier (oder sechs) Siebensegmentanzeigen angezeigt, sobald ein gültiges Telegramm empfangen wurde, auf Tastendruck kann auch das Datum (Monat und Tag) angezeigt werden. Für der Anzeige gibt es aufgrund der universellen Software unzählige Möglichkeiten. Solange keine Zeit empfangen wurde, werden nützliche Informationen über den Empfang angezeigt (Empfangene Bits, letzter Fehler, letztes empfangenes Bit). Der Doppelpunkt der Anzeige zeigt währenddessen das DCF77-Eingangssignal an. Sobald eine Zeit empfangen wurde, blinkt er regelmäßig oder leuchtet dauerhaft (einstellbar).

Aufbau

Den Mittelpunkt der Uhr bildet ein ATTiny2313 (der alte AT90S2313 kann auch verwendet werden). Die Anzeige wird, je nach Typ und gewünschter Helligkeit, direkt oder über Transistoren angeschlossen. In der Software kann festgelegt werden, an welchem Port die Segmente angeschlossen sind (PORTB oder PORTD), am anderen Port werden dann die gemeinsamen Anschlüsse der Anzeige angeschlossen. Der DCF77-Empfänger wird wahlweise mit PD2 oder PD6 verbunden, die Eingänge für die Schalter/Taster zum Anzeigen des Datums und zum Umschalten der Zeitanzeige auf UTC sind frei wählbar. Wird für die Datumsanzeige ein Schalter verwendet, springt die Anzeige alle 5 Sekunden zwischen Zeit und Datum um, wenn der Schalter geschlossen ist, bei einem Taster wird nach einem kurzen Druck das Datum für 5 Sekunden angezeigt, bevor die Anzeige zur Zeit zurückspringt.

Grundversion

In dieser Version wurde fast alles weggelassen, was nicht unbedingt nötig war. Es gibt keine Segmenttreiber-Transistoren und der DCF77-Empfänger stammt aus einem billigen Funkwecker (und verträgt keine 5 V, deshalb wird die über zwei Siliziumdioden abfallende Spannung von ca. 1,4 V verwendet). Anstelle eines Doppelpunktes oder dem Dezimalpunkt der zweiten Anzeige wird als Trennzeichen eine fünfte Siebensegmentanzeige zwischen Stunden und Minuten verwendet, da die benutzte Anzeigenplatine bereits fünf Anzeigen enthielt. Das Segment g dieser zusätzlichen Anzeige ist so angeschlossen, als sei es der Dezimalpunkt von Anzeige 2, damit sich die Helligkeit der Anzeige nicht durch eine weitere Multiplexing-Stelle reduziert.

;Einstellungen für Versionen ab 2011-06-29:
  .equ USE_SECONDS = 0
  .equ TWELVE_HOURS = 0
  .equ FLASHING_COLON = 0
  .equ SEG_PORT = PORTB
  .equ SEG_INV = 0
  .equ SEG_A = 0
  .equ SEG_B = 1
  .equ SEG_C = 2
  .equ SEG_D = 3
  .equ SEG_E = 4
  .equ SEG_F = 5
  .equ SEG_G = 6
  .equ SEG_DP = 7
  .equ ZERO_BLANKING = 1
  .equ COM_PORT = PORTD
  .equ COM_INV = 0
  .equ COM0 = 3
  .equ COM1 = 4
  .equ COM2 = 5
  .equ COM3 = 6
  .equ COM4 = 8
  .equ COM5 = 8
  .equ COM_COLON = 1
  .equ COM_AM = 1
  .equ COM_PM = 1
  .equ COM_H10 = 0
  .equ SW_PORT = PORTD
  .equ SW_DATE = 0 ;Schalter nicht im Schaltplan, offen = immer Uhrzeit
  .equ SW_UTC = 1 ;Schalter nicht im Schaltplan, offen = immer Lokalzeit
  .equ DATE_TIMEOUT = 5
  .equ DCF_INVERTED = 1
  .equ DCF_PULLUP = 1 ;externer Pullup kann weggelassen werden
  .equ DCF_USE_INT0 = 1
  .equ DIGIT_COLON = 1<<SEG_DP
  .equ DIGIT_AM = 0
  .equ DIGIT_PM = 0

12-Stunden-Version

In dieser Version müssen von der ersten Anzeige (Stunden-Zehner, ganz links) nur die Segmente b und c angeschlossen werden. Ich habe für diese Version eine Anzeige verwendet, bei der die restlichen Segmente überhaupt nicht mit LEDs bestückt waren, zwei der anderen Segment-Eingänge waren allerdings für den Doppelpunkt und einen Dezimalpunkt hinter der dritten Stelle verwendet worden. Das Segment d wurde bei der ersten Anzeige also als Doppelpunkt zwischen den Anzeigen 2 und 3 angezeigt, während es auf den restlichen drei Anzeigen ein normales Segment war. Im Schaltplan ist eingezeichnet, wie Sie diese Version mit normalen Siebensegmentanzeigen und 2 LEDs für den Doppelpunkt nachbauen können. Soll hingegen der dp der zweiten Anzeige verwendet werden, müssen die beiden Ports am Controller vertauscht werden, da PORTD nur 7 Ausgänge für die sieben Segmente hat. Gleiches gilt für die Verwendung der neuen Software (Versionen nach 0.4), da hier der DCF77-Empfänger an PD2 oder PD6 angeschlossen sein muss.

VFD-Version

Natürlich ist es auch möglich, eine Fluoreszenzanzeige zu verwenden, sofern diese siebensegment-förmige Anzeigen hat. In meiner Schaltung habe ich eine VFD aus dem Pollin-Anzeigensortiment, die vier Siebensegmentanzeigen, einen Punkt zwischen der zweiten und dritten Anzeige sowie mehrere Texte am unteren Rand enthält. Der Punkt ist mit dem Text "Time" gekoppelt, der deshalb auch immer mit aufleuchtet, wenn der Punkt eingeschaltet wird. Mit einer VFD sind übrigens immer Transistoren sowohl für die Segmente als auch für die Gitter (gemeinsame Anschlüsse) notwendig, da die Fluoreszenzanzeige nur mit höheren Spannungen als 5 V richtig funktioniert. Um PNP-Transistoren verwenden zu können, muss man außerdem den Trick anwenden, den Spannungsregler für die 5 V nicht wie üblich in die positive Leitung zu legen, sondern die Masse des AVR gegenüber der eigentlichen Schaltungsmasse so anzuheben, dass der AVR genau 5 V bekommt. Das kann man ganz einfach mit einem 79(L)05-Spannungsregler für negative Spannungen (gegenüber dem Masse-Anschluss des Reglers, der hier mit der positiven Versorgungsspannung verbunden wird, die für die VFD und den AVR gleich ist) erledigen. Die Heizung der VFD habe ich über einen Widerstand angeschlossen, der aber recht heiß wird, da die Heizung dieser VFD einen recht hohen Strom bei nur geringer Spannung benötigt (100 mA bei ca. 1,6 V).

;Einstellungen für Versionen ab 2011-06-29:
  .equ USE_SECONDS = 0
  .equ TWELVE_HOURS = 0
  .equ FLASHING_COLON = 0
  .equ SEG_PORT = PORTB
  .equ SEG_INV = 1
  .equ SEG_A = 0
  .equ SEG_B = 1
  .equ SEG_C = 2
  .equ SEG_D = 3
  .equ SEG_E = 4
  .equ SEG_F = 5
  .equ SEG_G = 6
  .equ SEG_DP = 7
  .equ ZERO_BLANKING = 1
  .equ COM_PORT = PORTD
  .equ COM_INV = 1
  .equ COM0 = 3
  .equ COM1 = 4
  .equ COM2 = 5
  .equ COM3 = 6
  .equ COM4 = 8
  .equ COM5 = 8
  .equ COM_COLON = 1
  .equ COM_AM = 1
  .equ COM_PM = 1
  .equ COM_H10 = 0
  .equ SW_PORT = PORTD
  .equ SW_DATE = 0
  .equ SW_UTC = 1 ;Schalter nicht im Schaltplan, offen = immer Lokalzeit
  .equ DATE_TIMEOUT = 5
  .equ DCF_INVERTED = 1 ;je nach Empfänger
  .equ DCF_PULLUP = 1 ;je nach Empfänger
  .equ DCF_USE_INT0 = 1
  .equ DIGIT_COLON = 1<<SEG_DP
  .equ DIGIT_AM = 0
  .equ DIGIT_PM = 0

Software

Die Software bietet am Programmanfang vielfältige Einstellungen für diverse Möglichkeiten. In dieser Tabelle sind alle Einstellungen für die Software ab Version 2011-06-29 beschrieben.

Name Beschreibung
USE_SECONDS Sekunden-Anzeige aktivieren. Standardeinstellung ist 0 (deaktiviert).
TWELVE_HOURS 12-Stunden-Anzeige auswählen. Standardeinstellung ist 0 (24-Stunden-Anzeige).
FLASHING_COLON Frequenz des blinkenden Doppelpunks. Mögliche Einstellungen sind 0 (dauerleuchtend), 1 (1  Hz) und 2 (0,5 Hz).
SEG_PORT Port für die Segmente. Kann entweder auf PORTB oder PORTD eingestellt werden, COM_PORT muss dann auf den jeweils anderen Port gesetzt werden.
SEG_INV Invertierte Segment-Ausgänge (für PNP-Transistoren oder direkt angeschlossene Kathoden).
SEG_A ... SEG_DP Portpins für die einzelnen Segmente. Wird der DP-Ausgang nicht verwendet (z.B. weil PORTD als Segment-Port verwendet wird), so sollte die Einstellung SEG_DP auf 8 gesetzt werden.
ZERO_BLANKING Vornullenunterdrückung. Mögliche Werte sind 0 (keine Vornullenunterdrückung), 1 (nur für die Uhrzeit), 2 (nur für das Datum) und 3 (für Uhrzeit und Datum).
COM_PORT Port für die gemeinsamen Anschlüsse der Anzeigestellen (Stellenauswahl). Kann entweder auf PORTB oder PORTD eingestellt werden, SEG_PORT muss dann auf den jeweils anderen Port gesetzt werden.
COM_INV Invertierte Ausgänge für die Anzeigestellenausgänge (für PNP-Transistoren oder direkt angeschlossene Anzeigen mit gemeinsamer Kathode).
COM0 ... COM5 Portpins für die jeweiligen Anzeigestellenausgänge. COM4 wird nur verwendet, wenn COM_COLON, COM_AM und/oder COM_PM auf 4 gesetzt ist oder die Sekundenanzeige aktiviert ist, COM5 wird ausschliesslich bei aktivierter Sekundenanzeige verwendet. Nicht verwendete Ausgänge sollten auf 8 gesetzt werden.
COM_COLON Anzeigestelle, auf der sich der Doppelpunkt befindet. Wird für den Doppelpunkt eine eigene Anzeigestelle verwendet, so muss der Wert 4 verwendet werden; eine eigene Anzeigestelle für den Doppelpunkt bei einer Uhr mit Sekunden ist nicht möglich.
COM_AM Anzeigestelle für Symbol "AM" (Vormittag). Das Symbol leuchtet unabhängig von 12- oder 24-Stunden-Modus zwischen 00:00 und 11:59 auf.
COM_PM Anzeigestelle für Symbol "PM" (Nachmittag). Das Symbol leuchtet unabhängig von 12- oder 24-Stunden-Modus zwischen 12:00 und 23:59 auf.
COM_H10 Anzeigestelle für die Stunden-Zehner-Anzeige. Standardeinstellung ist 0, im 12-Stunden-Modus kann jedoch auch eine andere Anzeigestelle angegeben werden, von welcher dann das dp-Segment für die Segmente b und c der Stunden-Zehner-Anzeige verwendet wird. Diese Option ist sinnvoll, wenn besonders viele Portpins für andere Funktionen benötigt werden.
SW_PORT Port, an welchem die Taster/Schalter angeschlossen sind.
SW_DATE Portpin, an dem der "Datum anzeigen"-Taster/Schalter angeschlossen ist. Ist dieser Taster/Schalter nicht vorhanden, sollte die Einstellung auf 8 gesetzt werden.
SW_UTC Portpin, an dem der UTC-Schalter angeschlossen ist. Ist dieser Schalter nicht vorhanden, sollte die Einstellung auf 8 gesetzt werden.
DATE_TIMEOUT Anzeigedauer für das Datum. Standardeinstellung sind 5 Sekunden.
DCF_INVERTED Invertiertes DCF77-Eingangssignal. Wert 0 bedeutet nicht-invertiert (positive Impulse).
DCF_PULLUP Internen Pullup-Widerstand für den DCF77-Eingang einschalten. Der Pullup wird für Empfänger mit Open-Collector-Ausgang benötigt (Conrad, ELV) und sollte für Empfänger mit CMOS-Ausgang (Reichelt) deaktiviert werden.
DCF_USE_INT0 Eingang für den DCF77-Empfänger. Wert 0 bedeutet PD6 (ICP, Pin 11), Wert 1 bedeutet PD2 (INT0, Pin 6).
DIGIT_COLON, DIGIT_AM und DIGIT_PM Segmente, die für den Doppelpunkt, das "AM"- bzw. das "PM"-Symbol eingeschaltet werden müssen. Zum Deaktivieren des Doppelpunkts bzw. eines Symbols kann die jeweilige Einstellung auf 0 gesetzt werden.
DATE01 Anzeige auf den ersten beiden Anzeigestellen (Stunden) während der Datumsanzeige. Wird bei 12-Stunden-Anzeige nicht COM0 für die Stunden-Zehner-Anzeige verwendet, kann diese nur eine Eins oder garnichts anzeigen, daher sind dann nur die Möglichkeiten Monat oder Wochentag erlaubt. Der Wochentag wird als Zahl zwischen 1 (Montag) und 7 (Sonntag) angezeigt.
Anzeige Einstellung
Wochentag tWeekday
Tag tDay
Monat tMonth
Jahr (zweistellig) tYear
DATE23 Anzeige auf den zweiten beiden Anzeigestellen (Minuten) während der Datumsanzeige. Mögliche Einstellungen siehe DATE01.
DATE45 Anzeige auf den dritten beiden Anzeigestellen (Sekunden) während der Datumsanzeige. Mögliche Einstellungen siehe DATE01.

Fotos

Grundversion

[Foto]
800 | 1280
Die Grundversion der Schaltung mit umgebauter Display-Platine aus einem alten Umdrehungszähler von unten. Die Anzeige war bereits für Multiplexing verschaltet, deshalb musste ich die Leiterbahnen rund um die mittlere Anzeige auftrennen, um sie als Dezimalpunkt-Ersatz verwenden zu können.
[Foto]
800 | 1280
Schaltung, Displayplatine und DCF77-Empfänger im Gehäuse des Umdrehungszählers. Es ist deutlich zu erkennen, dass der Empfänger aus einer größeren Platine herausgesägt wurde.
[Foto]
800 | 1280
Die Anzeigenplatine von vorne. Alle unnötigen Bauteile wurden ausgelötet, lediglich die Displaytreiber und einige Dioden verbleiben. Sie sind allerdings nicht mit irgendwelchen Anzeigenpins verbunden (zwischen Displaytreiber-ICs und Anzeigen waren Widerstände geschaltet).
[Foto]
800 | 1280
Die fertige Uhr im geschlossenen Gehäuse.

12-Stunden-Version

[Foto]
800 | 1280
Der fertige Aufbau der 12-Stunden-Version. Mangels Gehäuse habe ich schnell zwei alte Plastik-Leisten aneinandergeschraubt und eine "Designer"-Uhr gebastelt ;-)
[Foto]
800 | 1280
Die Schaltung ist auf der Rückseite der Uhr aufgeklebt, zusammen mit zwei Buchsen für das Netzteil und den DCF77-Empfänger
[Foto]
800 | 1280
Nahaufnahme der Schaltung. Da ich nicht mehr genug 50 Ω-Widerstände hatte, musste ich für zwei Segmente eine Parallelschaltung aus 2x 100 Ω verwenden. Rechts neben der Platine sind außerdem die Löcher, aus denen die Kabel von den Anschlüssen der Anzeige kommen, gut zu sehen.
[Foto]
800 | 1280
Der DCF77-Empfänger in einer Tic-Tac-Dose. Der Empfänger stammt diesmal aus einem "CallBoy" (Rufnummernanzeiger für eingehende Anrufe), den ich als Quelle für einen CLIP-Decoder-IC für eine andere Schaltung gekauft hatte ;-).

VFD-Version

[Foto]
800 | 1280
Die VFD-Version zusammen mit der Anzeige auf einer Platine. Die Antenne so nah an die Schaltung zu legen empfiehlt sich allerdings nicht, der Empfang ist dann nicht mehr besonders gut. Noch nicht eingebaut ist der Jumper für die Datumsanzeige.
[Foto]
800 | 1280
Auf der Platinenrückseite ist die DCF77-Empfängerplatine aufgeschraubt. Die Antenne sollte ursprünglich in dem Gebiet ohne Kupfer festgeklebt werden, dort war allerdings gar kein Empfang mehr möglich.
[Foto]
800 | 1280
Die Uhr in Betrieb. Das fünfte Gitter mit den gelblichen Segmenten ist übrigens nicht angeschlossen, ein Transistor ist allerdings für spätere Erweiterungen bereits eingebaut.