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.

Schaltplan

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.

Leiterseite Bestückungsseite

Für Menschen mit dicken Fingern gibt es die Platine auch als Version ohne SMD-Bauteile.smile
(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.)

Leiterseite Bestückungsseite

Ä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
 
      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.