Steuern und Versorgen über eine Leitung oder Wir basteln uns einen Modellbahn-Decoder

Allgemeines   Die Decoderhardware   Software für die Signalerzeugung   Ausblick   Bibliographie
Auf der vorigen Seite wurde vorgestellt, wie man mit einem Microcontroller kräftige Lasten präzise schalten kann. Erläutert wurde diese Anwendung am Beispiel eines Gleichstrommotors - mit der dort vorgestellten Lösung ist aber etwas viel interessanteres möglich: man kann damit über eine nur zweiadrige Verbindung ein Steuersignal übermitteln und gleichzeitig genug Leistung transportieren, dass die zu steuernden Verbraucher damit auch versorgt werden können! Die bekannteste Anwendung dafür ist sicherlich die Digital-Steuerung von Modellbahnen, die das Verlegen von unzähligen Kabeln in der Anlage überflüssig macht. Ein solches System war auch das Ziel dieses Projekts. Auf dieser Seite wird ein Weichendecoder beschrieben, zusammen mit einer Steuersoftware, die auf der Hardware von '100 Watt mit einem Pin' läuft.

Allgemeines

Wie schon eingangs erwähnt ist das Ziel dieses Projekts die Digitalisierung einer Modellbahn, in diesem Falle sogar einer Gartenbahn im Maßstab 1:32 (Spur 1, Märklin). Grade bei einer Gartenbahn ist das Strippenziehen im Garten eine sehr fehlerträchtige Angelegenheit. Wo man bei den üblichen Tischanlagen einfach unter die Anlage kriechen und so zur Not einem Draht vom Schaltpult bis zur Weiche folgen kann, so sieht man im Garten nur ein Stück Draht in einem Loch verschwinden, und muss dann zusehen, wo es wieder zum Vorschein kommt. Die Erweiterung der Außenanlage um zusätzliche Weichen zieht dabei größere Verlegearbeiten mit teuren Erdkabeln nach sich. Und zu allem Übel kann man sein Stellpult auch nicht über Nacht draussen stehenlassen, sodass man um eine ausgedehnte Steckerbank zwischen Stellpult und Aussenanlage nicht umhinkommt, mit den üblichen Problemen wie korrodierten Kontakten oder zuwenig freien Leitungen bei der nächsten Veränderung im Gleisbild.
Abhilfe versprechen die von zahlreichen Anbietern vertriebenen Digitalsteuerungen. Allerdings haben diese zwei sehr bedeutsame Nachteile: sie sind entweder nur für den Innenbetrieb und nicht für die Weichenantriebe von Großbahnen geeignet oder - meistens - unglaublich teuer in der Anschaffung.
Um nicht das Rad neu zu erfinden, und um vielleicht zu anderen verbreiteten Digitalsystemen kompatibel zu bleiben, habe ich an dieser Stelle das Digitalsystem von Märklin zum Vorbild genommen. Dieses basierte ursprünglich auf dem Encoder MC145026 und dem Decoder MC145027 von Motorola. Mittlerweile werden allerdings nicht die ursprünglichen -coder eingesetzt, sondern Spezialchips als De- und ebenfalls Microcontroller als Encoder, das Format ist jedoch abwärtskompatibel geblieben.
Im Selbstbauprojekt wird logischerweise ebenfalls ein Microcontroller zum Erstellen und Versenden der Datenpakete dienen, eben in der in der letzten Seite vorgestellten Hardwarekonfiguration. Als Empfänger dient ein Motorola MC145027. Um die resultierende Platine so klein wie möglich zu halten, wurde als Leistungstreiber ein L293D von TI verwandt.
Platine

Die Decoderhardware

Der MC145027-Decoder besitzt 5 Adresseingänge sowie 4 Datenausgänge. Die Datenausgänge werden immer dann verändert, wenn ein neues Datenpaket korrekt empfangen werden konnte, anderenfalls verbleiben sie in dem Zustand, der vom letzten gültigen Datenpaket hinterlassen wurde. Der L293-Leistungstreiber besitzt 4 Eingänge, die den Zustand der 4 Ausgänge bestimmen, sowie 2 Enable-Eingänge, die die Ausgänge komplett abschalten. Es ist zu beachten, dass unbedingt die D-Variante des L293 zum Einsatz kommen muss, da die anderen Varianten keine integrierten Schutzdioden besitzen und in der vorgestellten Beispielschaltung nicht lange überleben würden.
Um einen LGB-Weichenantrieb schalten zu können, müssen zwei der Ausgänge des L293 an den Weichenantrieb angeschlossen werden.
LGB-Antriebe besitzen keine Endabschaltung, daher müssen die Ausgänge des L293 auf Disabled gesetzt werden können. Märklin-Antriebe können in dieser Konfiguration ebenfalls betrieben werden, wenn man zwei der L293-Ausgänge an die Klemmen 1 und 2 anschließt, und die L-Klemme mit Masse beschaltet.
Daher wurden jeweils zwei L293-Eingänge zusammengeschaltet, und die beiden verbliebenen Datenpins des Decoders an die Enable-Inputs geschaltet. So ist es zwar nicht mehr möglich, beide an eine Decoderplatine angeschlossene Weichen gleichzeitig unabhängig voneinander zu steuern, sondern nur nacheinander oder bei gleicher Stellung, aber es gibt keinen zusätzlichen Hardwareaufwand und die Ausgänge sind normalerweise 'richtig' abgeschaltet und nicht nur auf gleichem Potential.
Decoder
Weiterhin befinden sich auf der Platine ein paar Widerstände und Kondensatoren an den Anschlüssen R1, C1 und R2/C2, die die Zeitbasis für den Decoderchip bestimmen. Daher sind die angegebenen Werte unbedingt einzuhalten. Der Rest der Platine wird von der Spannungsversorgung eingenommen, bestehend aus einem kleinen Brückengleichrichter im DIL-Gehäuse, einem 78L05 zur Spannungsregelung und ein paar Kondensatoren zur Stabilisierung der Spannungen. Den 78L05 kann man auch durch eine Zener-Diode mit Vorwiderstand ersetzen, allerdings würde diese Kombination um einiges mehr Strom benötigen und daher heißer werden als der 78L05.
Gewöhnungsbedürftig ist die Beschaltung der Adresspins. Um Bauteilbeinchen einzusparen, verwendet Motorola beim MC14502x einen kleinen Trick: dreiwertige Logik mit den Zuständen 0 (GND), 1(Vcc) und 2 (unbeschalteter Pin). Daher lassen sich mit den 5 Adresspins 3^5=243 verschiedene Adressen einstellen. Weil an jeder Decoderadresse zwei Weichen hängen können, sind also in dieser Konfiguration 486 Weichen betreibbar, was für die meisten Modellbahnen ausreichen dürfte. Die von Märklin vertriebenen Weichendecoder verwenden einen Demultiplexer an den Datenpins und erhöhen damit die Anzahl der an eine Decoderadresse anschließbaren Weichen nochmals, da dies aber zusätzlichen Hardwareaufwand ohne praktischen Nutzen für die meisten Anlagen bedeuten würde, wurde hier davon abgesehen.
Sollen Märklin- und Selbstbaudecoder gemeinsam an einem Kabel betrieben werden, ist jedoch diese andere Belegung der Adresserweiterung zu berücksichtigen, um nicht aus Versehen dieselbe Hardwareadresse mehrfach zu belegen. Auf der Platine werden die Adressen durch Drahtbrücken 'mit dem Lötkolben' festgelegt, da es ja nicht notwendig ist, eine einmal eingestellte Adresse jemals wieder zu ändern.
Platine vergossen

Um die Platine vor Nässe zu schützen, sollte man sie am besten mit irgendetwas eingießen. Wenn man grade nichts besseres zur Hand hat, kann dies auch mit Schmelzkleber erfolgen. Die Platine erwärmt sich im laufenden Betrieb niemals so stark, dass der Schmelzkleber flüssig würde. Die pralle Sonne um 12 Uhr Mittags im August stellt dagegen eher eine Gefahr für eine Schmelzkleber-Umhüllung dar, darum sollte man so behandelte Platinen besser schattig unterbringen.

Blockschaltbild

Software für die Signalerzeugung

Die Software für die Signalerzeugung gliedert sich in zwei Teile: zum einen in eine Funktion zum Senden der Daten mittels des L298 auf der Platine zum '100 Watt'-Projekt, zum anderen in die Berechnung der auszugebenden Daten.
Zunächst die Senden-Funktion:
Der MC145027-Decoder erwartet seine Daten in nebenstehend dargestellten Pulsen codiert, die jeweils die 3 möglichen Zustände 0, 1 und 2(Offen) abbilden. Die kurzen Pulse haben eine Dauer von 13 us, die langen eine Pulsdauer von 91 us. Jeweils zwei kurze und zwei lange je zweimal ergibt eine Gesamtdauer von 208 us. Glücklicherweise ist der Decoder nicht besonders anspruchsvoll, was die genaue Einhaltung des Timings betrifft, da das Timing im Decoder anhand eines von Kondensatoren mit miserablen Toleranzen getakteten Oszillators ermittelt wird.
Datensignal
Gesendet werden 9 solcher Pakete. Die ersten 5 bestimmen die Adresse, die letzten 4 die Daten, wobei die Datenpakete nur den Zustand 0 oder 1 haben dürfen. Zur Erhöhung der Störsicherheit wird dieser Datenstrom zweimal hintereinander mit ca. 300 us Abstand verlangt, um eine Reaktion auszulösen. Um wirklich auf Nummer Sicher zu gehen, wird hierbei der Datenstrom gleich viermal hintereinander gesendet. Am besten lässt sich so ein Datenstrom als 18 Bits auffassen, von denen jeweils zwei zu einem 0/1/2-Paket gehören. Da der MCS-51 Befehlssatz leider keine indirekte Adressierung auf Bitebene bietet, kommt man nicht umhin, dafür gleich 18 Bytes zu verwenden, will man mit einer Schleife arbeiten. Und so sieht die Sende-Funktion aus:
    CU_OUTR      EQU     P1.6    ; Die Eingänge des L298
    CU_OUTB      EQU     P1.5
    CU_EN        EQU     P1.7

    SENDDATA0    DATA    010h    ; A0
    SENDDATA1    DATA    011h    
    ...undsoweiter...
    SENDDATA16   DATA    020h    ; D3
    SENDDATA17   DATA    021h

send:
    call putOutData      ; senden
    mov a,#255            
    call F_wait_u        ; warten
    call putOutData
    mov a,#255
    call F_wait_u
    call putOutData
    mov a,#255
    call F_wait_u
    call putOutData
    mov a,#255
    call F_wait_u
	ret
	
; die Sende-Funktion
putOutData:        
    mov R0,#18           ; zur indirekten Adressierung 
    mov R1,#SENDDATA0    ; Zeiger und Zähler setzen

mainloop:                ; Hauptschleife

    mov a,@R1            ; Datenwert holen
    inc R1               ; Zeiger weitersetzen

    rrc a                ; niederwertigstes Bit in Carry
    jc mainloopsendhigh
            
    setb CU_OUTR         ; low-Bit senden
    clr  CU_OUTB
    mov a,#4
mainloop_low_label0:
    djnz ACC,mainloop_low_label0
    clr  CU_OUTR
    setb CU_OUTB
    mov a,#40
mainloop_low_label1:
    djnz ACC,mainloop_low_label1
    djnz R0,mainloop     ; nächstes Bit holen
    ret                  ; keine weiteren Datenbits
    
mainloopsendhigh:        ; high-Bit senden
    setb CU_OUTR
    clr  CU_OUTB
    mov a,#40
mainloop_high_label1:
    djnz ACC,mainloop_high_label1
    clr  CU_OUTR
    setb CU_OUTB
    mov a,#4
mainloop_high_label0:
    djnz ACC,mainloop_high_label0
    djnz R0,mainloop     ; nächstes Bit holen
    ret                  ; keine weiteren Datenbits

Die Funktion zum Errechnen der Daten wurde in diesem Falle in einen separaten Controller gesteckt, der eine 5x8-Tastenmatrix überwacht, die das Stellpult bildet. Aus der gedrückten Taste sollte ein 18 Bit-Datenstrom gebildet werden, der via serieller Schnittstelle an den Controller mit der Senden-Funktion übermittelt wird. Die Teilung von Tastenmatrix und Sender wurde deshalb vorgenommen, um die Anlage bei Bedarf leicht erweitern zu können.
Die Funktion zum Ermitteln der Daten, die in das Datenfeld geschrieben werden müssen, hat nun die Aufgabe, eine
Nummer - die Weichenadresse - in dieses seltsame dreiwertige System zu überführen. Dies geschieht am einfachsten, indem man die Weichennummer immer wieder durch 3 dividiert und den bei jedem Schritt verbleibenden Rest in die erforderliche Bitkombination überführt: 0=>00, 1=>11, 2=>10
Schneller geht es jedoch, wenn man ein Datenfeld vorher berechnet und einen größeren Teil der Weichennummer (in diesem Falle der Rest einer Division durch 27) als Zeiger auf dieses Datenfeld auffasst:

calcAddress:
; Input:    Acc  Adresse, 0 bis 242 (3^-1)
; Output:        Ausgegeben auf R1R0 (10 Bits für 5 Adresspins)

    mov b,#27            ; Aufteilen in 2 Teile
    div ab

    xch a,b              ; Rest in A, Ergebnis in B

    mov DPTR,#calcAddressData    
    movc a,@A+DPTR       ; Umwandeln des ersten Teils (A0 bis A2)

    mov R0,a

    mov a,b              ; nächster Teil (A3 bis A4)
    movc a,@A+DPTR

    rr a                 ; die höchstwertigsten Bits in R0
    rr a
    push Acc
    anl a,#11000000b
    orl 0,a

    pop Acc              ; die beiden übrigbleibenden Bits in R1
    anl a,#00000011b
    mov R1,a    

    ret

calcAddressData:         ; Daten für 0 bis 26
    db 00000000b
    db 00000011b
    db 00000001b
    db 00001100b
    db 00001111b
    db 00001101b
    db 00000100b
    db 00000111b
    db 00000101b
    db 00110000b
    db 00110011b
    db 00110001b
    db 00111100b
    db 00111111b
    db 00111101b
    db 00110100b
    db 00110111b
    db 00110101b
    db 00010000b
    db 00010011b
    db 00010001b
    db 00011100b
    db 00011111b
    db 00011101b
    db 00010100b
    db 00010111b
    db 00010101b
Stellpult Innenansicht Die Funktion, die aus den gedrückten Tasten die Daten für die eigentliche Weichenstellung ermittelt, ist in der Funktionsweise identisch und wird daher nicht noch einmal aufgeführt, zum Nachlesen des vollständigen Quellcodes sei auf die Download-Seite verwiesen. Zur Berechnung des Datenfeldes sei noch folgendes gesagt: Jede Decoderadresse kann 2 Weichen steuern, daher gehören zu jeder Decoderplatine 4 Tasten. Damit gibt es 16 mögliche Kombinationen, die leicht über ein Datenfeld codiert werden können. Da die verwendete Tastenmatrix 8x5 Anschlüsse hat, lässt sie sich gut in Felder zu je 4 Tasten aufteilen.
Nebenstehend ist die Innenansicht meines Stellpultes abgebildet. Im Zentrum des Drahtknäuls ahnt man die Platine, an die die Tasten angeschlossen werden. Nach unten führt ein Flachbandkabel zum Encoder/Booster, der die seriell übermittelten Daten an die Decoder ausgibt.

Ausblick

Somit haben wir eine Möglichkeit, mit nur zwei Kabeln bis zu 486 Weichen zu schalten. Das reduziert den Verkabelungsaufwand enorm - es fehlt nur noch das Salz in der Suppe: die Steuerung der Lokomotiven. Die in den Lokomotiven verbauten Decoder, sofern sie Märklin-kompatibel sind, verwenden grundsätzlich dasselbe Protokoll. Damit die Lok-Adressen nicht den Adressraum der Weichen verringern, wird dabei mit nur der halben Geschwindigkeit gesendet, sodass die Weichendecoder Lok-Datenpakete grundsätzlich als fehlerhaft ignorieren und die Lokdecoder ebenso mit den Weichendaten verfahren. Ich habe auch schon erfolgreich Lok-Datenpakete erzeugt und Lokomotiven gesteuert. Was noch fehlt, ist ein Handregler als Benutzerschnittstelle, der Weichen und Lokomotiven gleichermaßen steuern kann. Dabei soll der Handregler kabellos, auf Funk- oder Infrarotbasis arbeiten und bis zu 8 Handregler simultan an einer Basisstation arbeiten können. Mal sehen, vielleicht wird das ja noch etwas diesen Sommer...

Bibliographie

Hier finden sich die im Text verstreuten Literaturquellen und Links zum Thema noch einmal zum Nachschlagen und Wiederfinden
http://www.ti.com/sc/docs/products/analog/l293d.html Datenblatt des L293 von TI
http://mot-sps.com/books/dl110/pdf/mc145026rev3.pdf Datenblatt des MC145026/27 von Motorola
http://home.nexgo.de/dr.koenig/digital Das Märklin-Datenformat (Homepage Michael König)

zurück zum Anfang

Seite zurück Startseite
Erik Buchmann
EMail an: Owner@ErikBuchmann.de