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