PIC Binäruhr

Zugegeben eine Binäruhr ist schon etwas schräg, aber zum Üben ist sie optimal. Die Zeit muss nicht für die Anzeige aufbereitet werden, sondern kann direkt ausgegeben werden. Trotzdem bietet so eine Uhr noch genügend Herausforderungen. Für einen guten Sekundentakt wird ein 2,097152 MHz Quarz verwendet. Es wird eine Einstellmöglichkeit für die Uhrzeit benötigt und es darf natürlich auch eine Stromausfallsicherung nicht fehlen. Zusätzlich ist es möglich die Uhr mit dem DCF77 Signal synchron laufen zu lassen.
Doch der Anfang ist die Schaltung.

Schaltung

Schaltplan der Binäruhr mit PIC 16F84A, nur die Kondensatoren fehlen noch.

Die Schaltung ist an sich sehr einfach. Die Transistoren links (NPN) schalten die Kathoden der Leuchtdiodenreihen, die Transistoren unten (PNP) die Anoden der LED-Reihen. Die LED-Vorwiderstände sind zwischen den PNP Transistoren und dem Plus-Anschluss der LEDs, da in diesen Reihen immer nur eine LED zur Zeit an sein wird. Die drei Taster werden auch nach einander abgefragt, sie bekommen ihr positive Versorgung von den drei Ausgängen die die NPN Transistoren steuern und leiten es dann auf den Eingang weiter. Durch geschicktes Schalten der Ausgänge kommt man so mit wenig Pins am IC aus und kann trotzdem die 17 Leuchtdioden und die drei Schalter ansteuern bzw. abfragen.

Für den Fall, dass mal die Stromversorgung ausfallen sollte wird der Goldcap (C3) verwendet, um die Versorgung zu übernehmen. Dazu wird der Transistor Q4 so verwendet, dass er sobald im Kondensator C4 die Spannung unter etwa 2 Volt fällt er den Eingang des PIC auf Vdd wechseln lässt. Der PIC kann dann die LEDs ausschalten. Der Goldcap hat dann genug Energie um den PIC alleine noch etwa 1,5 Stunden zu versorgen.

Der Festspannungsregler ist ein Low-Drop Linearregler, der gleichzeitig einen Verpolungsschutz bietet (bin mir aber nicht 100% sicher). Er ermöglicht es die Uhr mit 3 bis 9 Volt zu versorgen, da er bei kleiner Spannung nur 0,5 Volt Spannungsabfall hat die Spannung in der Schaltung aber nicht größer als 5 Volt werden lässt. Die Diode D23 sorgt beim Stromausfall dafür, dass die Spannugssüberwachung spannungslos wird und der Goldcap nur den PIC versorgt.

Das DCF77-Empfangsmodul von Conrad ist extern in einem kleinen Gehäuse untergebracht, weil es sonst von der Schaltung zu stark gestört wird. Dazu sind die drei Anschlüsse unten im Schaltplan. Auf der Empfängerplatine selbst ist noch ein Pullup-Widerstand sowie eine Entstörung untergebracht. Verwendet wurde eine 3,5mm Kopfhörerbuchse, damit man den Empfänger auch während des Betriebs an oder abstecken kann wird in die Plusleitung noch vor der Buchse ein 100Ω Widerstand eingebaut und die Signalleitung noch mit einem 22kΩ Pullup-Widerstand ausgestattet. Dies sorgt dafür, dass es keinen Kurzschluss während des Steckvorgangs gibt, der Pullupwiderstand sorgt für einen definierten Pegel auch ohne den Empfänger. Es muss das nicht invertierte Signal (100ms oder 200ms high; 900ms oder 800ms low) eingespeist werden.

Die Lastkondensatoren für den Quarz sowie die Entstörkondensatoren wurden nicht in den Schaltplan eingezeichnet. Es wäre empfehlenswert noch einen ICSP-Anschluss vorzusehen. Zusätzlich wurde der Widerstand, der den MCLR auf Vdd zieht nicht mit eingezeichnet.

Nach dem Aufbau und einem Funktionstest der LEDs und Transistoren beginnt das Programmieren.

Foto der geöffneten Uhr.

Foto der geschlossenen Uhr im Dunkeln, es ist 19:43:18 Uhr.

Fotos der Uhr. Auf dem oberen Bild ist unten der ICSP-Anschluss zu sehen, welcher aus Platzgründen unter der IC-Fassung angelötet wurde. Auf dem unteren Bild sieht man, dass alle Leuchtdioden leicht leuchten, so ist die Zeit im Dunkeln besser abzulesen. Auf dem unteren Foto ist es gerade 19:43:18 .

Programm

Anmerkungen und Änderungen

Auch wenn das Programm bis jetzt fehlerfrei läuft, bin ich an einer kontinuierlichen Verbesserung interessiert. Wenn du noch Teile erkennst, die man einfacher oder schneller machen kann bin ich sehr daran interessiert.

Es stehen zwei Betriebsarten zur Verfügung. Die Uhr kann ohne DCF-Unterstützung nur durch den Quarz getaktet betrieben werden oder aber mit DCF-Unterstützung. Wenn die DCF Synchronisierung eingeschaltet ist, versucht die Uhr so oft wie möglich die Zeit zu empfangen. Fällt in diesem Modus der Empfang länger als 24 Stunden aus, dann wird dieses durch ein leichtes Flackern in der Anzeige signalisiert. Es wurde alles in einzelne Schleifen und Unterprogramme ausgelagert, die nur bei bedarf ausgeführt werden. Die einzelnen Module sind:

  • Einem Initialisierungsteil, der bei jedem Neustart ausgeführt wird, er legt fest, wie die Pins verwendet werden und welche Startwerte die Variablen haben.
  • Vor der Anzeigeschleife werden kurzzeitig alle Leuchtdioden angeschaltet. So kann erkannt werden, ob alle Pins richtig in der Fassung stecken und ob alle Transistoren und LEDs funktionieren. Wenn man von der Zeiteinstellung zurückkehrt erkennt man so, dass man wieder im Hauptmodus ist.
  • Die Anzeigeschleife läuft als Endlosschleife, die nacheinander die Sekunden, die Minuten und die Stunden aufleuchten lässt. Alle LED-Reihen sollen dass gleiche ON/OFF Verhältnis aufweisen, bei mir etwa 6% ON-Zeit. Hier wird geprüft, ob und wenn ja wie lange der Taster für die Zeiteinstellung gedrückt wurde um dann eventuell in den Programmteil für die Einstellungen zu springen. Dafür muss der Taster für mindestens 1,14s gedrückt bleiben.
  • Der Timer des 16F84A wird internen mit dem PIC-Takt versorgt, der vorher noch durch 8 geteilt wurde und so genau 256 mal pro Sekunde überläuft [2097152Hz / (4 * 8 * 256) = 256Hz]. Der Zähler wird aus der Warteschleife aus aufgerufen. Da es genug Möglichkeiten gib ihn auszuführen überprüft er zu Beginn, ob die Zeit noch ausreicht. Sonst wird er erst beim Nächsten Aufruf ausgeführt, wo die Warteschleife mindestens 0,5ms warten soll. In dem Zähler wird der Pin des DCF-Empfängers abgefragt und eine Art Schmitt-Trigger angewendet, um ein Sauberes Signal zu bekommen. Dieses wird dann vom entsprechenden Programm verarbeitet. Der Zähler ruft anschließen noch die Unterzähler auf, die die Uhrzeit weiterzählen und eine empfangene Zeit eintragen.
  • Zum Dekodieren und Überprüfen des DCF-Signals werden drei Zähler verwendet. Es gibt einen Zähler, der die Low-Zeit des Signals, einen der die High-Zeit des Signals und einen, der die Bits zählt. Es wird auf eine Stelle gewartet an der mindestens eine Low-Zeit von einer Sekunde ist. Dort beginnt das neue Zeittelegramm. Alle nun empfangenen Impulse werden genau in ihrer Länge vermessen. Und anhand der Länge wird entschieden, ob sie mit einer gewissen Toleranz 100ms (zwischen 70ms und 130ms) oder 200ms (zwischen 170ms und 230ms) lang waren. Wenn so ein Bit als richtig erkannt wurde wird es entsprechend seiner Bedeutung zu den Minuten oder Stunden dazugezählt und der Bitzähler erhöht.
  • Wurde ein Zeittelegramm ohne Bitlängenfehler empfangen wird die Zeit gespeichert und mit dem vorherigen Telegramm verglichen. es dürfen nur bestimmte festgelegte Differenzen auftreten (1Minute, 59Minuten, 0Stunden, 1Stunde, 2Stunden).
  • Der Teiler, der die 1/256 Sekunden zählt wird jede Sekunde wenn möglich mit dem DCF-Signal synchronisiert. So kann bei schlechtem Empfang, wenn die Telegramme nicht fehlerfrei empfangen werden können der Zähler zumindest mit den sauberen Bits (richtige Länge) in der richtigen Geschwindigkeit gehalten werden.
  • Das Übertragen der Empfangenen Zeit in das Uhrwerk findet immer zur vollen Minute statt. Dabei wird auch ein Zähler gesetzt, der Die Stunden seit dem letzten erfolgreichen Empfang zählt.
  • Wenn die Uhr im DCF-Betrieb ist und seit mehr als 24 Stunden keine zwei fehlerfreien Zeittelegramme mehr empfangen wurden, dann wird in der Anzeigeschleife ein leichtes Flackern erzeugt, damit man weiß, dass die Uhr leicht abweichen kann.
  • Wurde Taster 1 im normalen Modus lange genug gedrückt, dann wird in eine Unterschleife gesprungen, die es ermöglicht zwischen guarzgestütztem und DCF-gestütztem Betrieb umzuschalten. Von dort kommt man mit Taster 1 in den Modus für die Sekunden, dann zu den Minuten und von da zu den Stunden. Zurück zur normalen Anzeige kommt man wieder mit Taster 1.
  • Um zu sehen, welche Zeile man nun verstellen kann blitzt diese zu Beginn kurz auf. Zum Abfragen der Taster wir eine kleines Unterprogramm verwendet.
  • Das Unterprogramm zum Abfragen der Taster erkennt einen Tasterdruck immer dann, wenn man den Taster wieder loslässt. Oder aber wenn man ihn länger hält, dann wird in einen Schnellzählmodus geschaltet, damit man die Zeit einstellen kann ohne 30 mal drücken zu müssen.
  • Wenn die Stromsparschleife aufgerufen wird, dann werden in dieser alle Ausgänge so geschaltet, dass kein Strom fließt (aktiv-low nach high und aktiv-high nach low), dann wird geprüft, ob der Teiler überläuft und anschließend, ob der Strom wieder da ist. In diesem Modus verbraucht der PIC den gleichen Strom wie sonst auch, aber alle Ströme durch Ausgänge und LEDs entfallen. Der Verbrauch wird so auf 352µA gesenkt.
  • Die meiste Zeit befindet sich das Programm in der Warteschleife, deshalb wird von dieser aus auch das Pollen des Überlaufbits des Timers überwacht, so dass kein Überlauf unbemerkt bleibt.

Alles weitere zum Programm sollte man den Kommentaren im Programm entnehmen können. Die asm-Datei kann hier heruntergeladen werden.

Nachbauten

Josef aus Übersee am Chiemsee hat eine etwas verkleinerte Version der Uhr nachgebaut. Er hat mir freundlicherweise diese Bilder geschickt.

Das Bild zeigt die nachgebaute Platine von Josef sowie den DCF-Empfänger und den kleinen Transistorverstärker.

Als DCF77-Empfänger hat er ein Modul aus einem Funkwecker verwendet und einen eigenen kleinen Verstärker für das Signal gebaut.

Foto der Platine in der Detailansicht.

Die beiden Kondensatoren in der Mitte mit je 2200µF dienen der Stromausfallsicherung. Sie sollten reichen um eine kurze Unterbrechung in der Versorgung auszugleichen.

Erstellt im März 09