Die Bahnhofsuhr-Steuerung
Es gibt mit Sicherheit verschiedene Methoden wie eine Bahnhofsuhr angetrieben werden kann.
Eine davon ist der Betrieb mit einem Schrittmotor der jede Minute einen Polaritätswechsel benötigt.
Ein guter Bekannter hat mich gebeten für eine solche Uhr eine Ansteuerung zu entwickeln.
Schaltplan
Die Steuerung übernimmt ein Mikrocontroller mit einem angeschlossenen Uhrenquarz (32768Hz). Über zwei Taster kann die Uhr gestellt werden (Taster1 = langsam, Taster2 = schnell). Außerdem hat die Verwendung eines Controllers den Vorteil, dass eine eventuelle DCF-Erweiterung leichter zu realisieren ist. Die Endstufe der Schaltung besteht aus je zwei NPN- und PNP-Transistoren. Transistor T5 und T6 sind lediglich Hilfstransistoren, um die PNP-Transistoren mit dem Mikrocontroller sperren zu können. Die Basisvorwiderstände wurden für eine Motorenspannung von ca. 12V berechnet, nach Anpassung sind aber auch andere Spannungen möglich.
Platine
Die Platine wurde mit dem Layoutprogramm EAGLE erstellt. Mit dem, für die private Nutzung kostenfreien, ULP von www.matwei.de ist es möglich 3D-Bilder der Platine zu erzeugen. Dieses ULP erzeugt eine Datei, welche mit dem ebenfalls kostenfreien Programm POV-Ray in ein 3D-Bild gerendert werden kann.Für Menschen mit dicken Fingern gibt es die Platine auch als Version ohne SMD-Bauteile.
(Die verwendeten Ports des Controllers sind identisch mit denen der SMD-Version, sodass das untenstehende Programm unverändert übernommen werden kann. Im Schaltplan ist nur zu beachten, dass die Pinnummerierung nicht übereinstimmt.)
Ätzvorlage mit SMD
Ätzvorlage ohne SMD (Achtung: Die Vorlagen sind bereits gespiegelt, sodass sie direkt auf eine Folie gedruckt werden können!!!)
Programmierung
Um neue Programme schnell in den Controller programmieren zu können, wurde eine ISP-Schnittstelle mit der Atmel-Standardbelegung auf die Platine integriert. Das Programm wurde mit dem Compiler BASCOM-AVR geschrieben. Die Demoversion hat lediglich die Einschränkung, dass der erzeugte Code maximal 2kB groß sein darf.Quellcode: (Syntax highlighted mit
G
e
S
H
i
mit Anpassungen für BascomAVR von mir)' ********************************************************** ' * Minutensignal zur Ansteuerung einer Bahnhofsuhr * ' * mit ATMega8 * ' * © by Stefan Weigert * ' ********************************************************** ' Beschaltung: PortB.4 Taster1 ' PortB.5 Taster2 ' PortC.0 +- ' PortC.1 -+ ' !!!!!! CKOPT-Fuse programmieren !!!!!! ' !!!!!! CKSEL 1001 !!!!!! ' XTAL1/2 Uhrenquarz (32768Hz) Taster1 Alias PINB.4 Taster2 Alias PINB.5 M_plusminus Alias PORTC.0 M_minusplus Alias PORTC.1 $regfile = "m8def.dat" 'ATMega8 auswählen $crystal = 32768 'Uhrenquarz $baud = 600 'steht nur hier, um den Compiler zu befriedigen DDRB = &B00000000 'PortB alles Eingänge DDRC = &B00000011 'PortC.0 und C.1 Ausgänge Rest Eingänge DDRD = &B00000000 'PortD alles Eingänge PORTB = &B00110000 'Pullups für PortB.4 und B.5 setzen Dim N As Byte 'allgemeine Zählvariable Dim M As Bit 'Merkerbit für Ausgänge N = 0 M = 0 Config Watchdog = 1024 'Watchdog mit 1024ms konfigurieren Config Timer0 = Timer , Prescale = 64 'Timer0 mit 1/64 des Systemtaktes betreiben '=> alle 0,5 Sekunden einen Überlauf On Ovf0 Ueberlauf 'Sprungmarke für Überlauf festlegen Enable Ovf0 'Interrupt für Überlauf freischalten Enable Interrupts 'Interrupts global freischalten M_minusplus = 1 'zweiten Ausgang einschalten Start Watchdog 'Watchdog starten Main: Do 'Hauptprogramm (Anfang Endlosschleife) Reset Watchdog 'Watchdog rücksetzen If Taster1 = 0 Then 'Wenn Taster1 betätigt dann N = 0 'Zählvariable löschen Timer0 = 0 'Timer0 auf 0 setzen Toggle M 'Ausgangsmerker toggeln Gosub Setoutputs 'Ausgänge neu setzen Waitms 400 '400ms warten End If If Taster2 = 0 Then 'Wenn Taster2 betätigt dann N = 0 'Zählvariable löschen Timer0 = 0 'Timer0 auf 0 setzen Toggle M 'Ausgangsmerker toggeln Gosub Setoutputs 'Ausgänge neu setzen Waitms 150 '150ms warten End If Loop 'Ende Endlosschleife Setoutputs: 'Unterprogramm zum setzen der Ausgänge If M = 0 Then 'In Abhängigkeit der Merkervariablen entweder M_plusminus = 0 'ersten Ausgang abschalten Waitus 100 'kurze Pause (Transistorenschaltzeit) M_minusplus = 1 'zweiten Ausgang einschalten Else 'oder M_minusplus = 0 'zweiten Ausgäng abschalten Waitus 100 'kurze Pause (Transistorenschaltzeit) M_plusminus = 1 'ersten Ausgang einschalten End If Return 'Rücksprung aus der Subroutine Ueberlauf: Incr N 'Zählvariable erhöhen If N = 120 Then 'wenn n=120 (einmal pro Minute) Toggle M 'Ausgangsvariable toggeln N = 0 'Zählvariable löschen Gosub Setoutputs 'Ausgänge neu setzen End If Return 'Rücksprung aus der Interruptroutine
Das brennfähige Compilat gibt es hier.