Unidecoder

Unidecoder - so habe ich eine selbst erstellte Schaltung und die dazugehörige PCB genannt, die folgende Aufgaben unter einen Hut bringen soll:

Ursprünglich hatte ich vor, das ganze mit dem ATmega 328 zu realisieren. Durch die 8 MHz war dieser schnell genug, hat auch eigentlich genug Pins - ich bin aber dann an dreierlei Dingen mit dieser CPU gescheitert:

  1. Für mein erstes Design wollte ich auf SMD-Technik gehen, was aber als komplette Bestückung zu teuer gewesen wäre. Den ATmega 328 gibt es als DIL-Bauform aber nur mit 2 Pins weniger.
  2. Beim ATmega verliert man für die Programmierschnittstelle den SPI-Bus (S88)
  3. Durch einen Verdrahtungsfehler habe ich mir dann leider alle ATmegas bis auf einen zerschossen... (leider ist das Programmierinterface seeehhhr grottig dokumentiert, DI und DO vertauscht bedeutet spätestens nach dem 5. fehlgeschlagenen Versuch dass die CPU kaputt ist).

Die Lösung war dann, einen PIC zu verwenden: Der PIC16F1786 zeigte sich als brauchbar, auch viele andere PICs mit PLL und 28 Pins sollten funktionieren. Die PLL ist wichtig, da für den nicht-optimierenden Compiler die Taktfrequenz der CPU (FOSC/4) bei ca. 8 MHz liegen sollte, um die Protokolle in Echtzeit dekodieren zu können. Das MM-Protokoll für die Gleisdecoder ist hier mit der relativ kurzen Bitzeit von ~100µs sehr anspruchsvoll.

Bremsspannungserzeugung

Die Firma Mörklin stellte in den 1990er Jahren ein einfaches Prinzip vor, wie eine digital gesteuerte Lok vor einem "Halt" zeigenden Signal gebremst werden kann.

Erzeugung einer Bremsspannung nach System Märklin

Man muss dazu wissen, dass die Märklin-Loks damals nur das Märklin Motorola Protokoll sprachen. Dieses Protokoll liefert in der Mehrzahl Zustände, bei denen der Mittelleiter negative Spannung aufweist. Steuerpulse werden dagegen mit umgekehrter Polarität eingeleitet.

Was das von Märklin "Bremsmodul" genannte Bauteil machte war folgendes: Die Spannung am Mittelleiter wird bei "Halt" zeigendem Signal mittels einer Diodenschaltung auf "Minus" geklemmt, die positiven Pulse des Steuersignals also gewissermaßen "ausgeblendet".

Die oben stehende Schaltung zeigt eine solche Bremsspannungs-Erzeugung. Man braucht übrigens keine Angst zu haben, dass die sonst für das Gleichrichten von "ordinärer" Netzspannung verwendete 1N400x-Dioden "zu langsam" wären. Die für die digitale Modellbahn verwendete Schaltfrequenz liegt bei ~ 5kHz effektiv, was durchaus noch mit einer Si-Diode der 1A-Kategorie zu leisten ist.

Kurzschlussgefahr beim Übergang

Schwierig ist nur der Übergang von einem "normalen" auf den "bremsenden" Gleisabschnitt. Da Märklin-Loks einen Schleifer mit einer Länge von bis zu 10 cm haben, wird für einen Moment bei jedem von der Zentraleinheit an das Gleis gegebenen Steuerpuls ein Kurzschluss gegen die Bremsspannung ausgelöst. Daher haben Märklin Bremsgeneratoren einen zusätzlichen Anschluss für einen Übergangsbereich, der mit zwei Dioden gegen den "normalen" und den "bremsenden" Gleisabschnitt geschaltet ist und bei "Halt" zeigendem Signal diesen Bereich nur in den negativen Polungen mit Spannungen versorgt, bei den positiven Polungen aber spannungslos bleibt. Dieser Bereich muss mindestens eine Schleiferlänge lang sein, darf aber andererseits nicht viel länger sein, da er praktisch nur 60% der "normalen" Betriebsspannung bereitstellt.

Vor allem die Decoder von Uhlenbrock haben damit aber ihre Schwierigkeiten: Die Loks werden bei "Halt" zeigendem Signal bereits vor der Bremsstrecke merklich langsamer, beschleunigen dann aber am Anfang der Bremsstrecke erst einmal wieder auf die ursprüngliche Geschwindigkeit, bevor sie sich dann bremsen.

Strombegrenzung

Die beim Unidecoder angewendete Lösung ist effektiver: Es wird auf den Übergangsbereich komplett verzichtet. Stattdessen wird der Strom, den die Bremsspannungsquelle liefern kann begrenzt. Diese ist auf ca. 1300mA limitiert, was für einen Zug mit Beleuchtung beim Bremsen auf jeden Fall ausreicht, aber auch von der Zentraleinheit bereitgestellt werden kann, ohne dass sie einen Kurzschluss detektiert. Aus Sicht der Zentraleinheit ist diese Begrenzung sogar noch kleiner, es werden im Kurzschlussfall effektiv ca. 350mA detektiert - Grund ist die beim Senden der MM-Anteile des Protokolls überwiegenden negativen Pulsanteile, so dass nur ca. 40% der Zeit mit positiver Versorgungsspannung auf dem Mittelleiter gesendet wird.

Strombegrenzung Bremsspannung

In der oben gezeigten Schaltung ist V- die eigentliche Bremsspannung, sie wird über eine negative Einweggleichrichtung aus der Gleisspannung erzeugt.

Die Strombegrenzung funktioniert, indem der hinter F2 bereitgestellte Strom durch Q3 fließen muss. Über R47 wird dabei ein Spannungsabfall erzeugt. Ist dieser größer als ca. 0.6V, wird Q4 durchgesteuert. Dadurch wird die Basisspannung von Q3 aber weggezogen, das ganze stabilisiert sich bei einer Spannung von ca. 0.6V über R47. Wenn der Steuerpuls der Gleisspannung "durch" ist fällt die Begrenzung wieder wegen des fehlenden Spannungsabfalls auf R47 zusammen, ebenso wenn die Lok den Übergangsbereich hinter sich gelassen hat.

Die Schaltung ist recht einfach, da die Bremsspannung im Gegensatz zur Gleisspannung eine negative Spannung ist, also nie ihre Polarität wechselt.

Q3 muss natürlich ein Leistungstransistor sein, damit der Strom von über 1A auch getragen werden kann.

Verlustleistung

Die Problematik besteht jetzt nur darin, dass diese Strombegrenzung mit einer Verlustleistung von ca. 8W arbeitet, solange die Lok im Übergangsbereich mit dem Schleifer auf beiden Bereichen steht. Leider gibt es aber kein Garantie dafür, dass die Lok dort immer schnell weg fährt: Es ist denkbar, dass die Lok mit Fahrstufe 0 dumm geparkt da rumsteht. In diesem Fall kann man versuchen die Leistung mit einem Kühlkörper wegzuschaffen - 8 W sind aber schon eine Menge, selbst ein mittelgroßer Kühlkörper schafft es da je nach Einbaulage (unter der Eisenbahnplatte?) nicht, dauerhaft bei einer Grenzschichttemperatur von <125°C den Leistungstransistor kühl zu halten. Auch R47 wird warm, denn je nach Stromgrenze können auch bei 0.6V schon schnell mehr als die 250 mW eines Standard-Widerstands 203 frei werden.

Keine übermäßige Verlustleistung

Die elegantere Lösung ist aber, nach ca. 20s den Strom einfach abzuklemmen - denn ändern wird man an dieser Tatsache dass die Lok da dumm geparkt ist mit der Bremsstrecke nicht. Das "Strom abschalten" lässt sich mittels einer PTC-Fuse realisieren. Diese reagiert auf die steigende Temperatur des Leistungstransistors der den Strom begrenzt und schaltet die Stromquelle praktisch ab. Nach wenigen 10 Sekunden ohne Last ist die Elektronik dann wieder bereit Strom zu liefern, wenn die Lok weiterbewegt wurde. Man darf auch nicht vergessen, dass die Lok in dieser Position ja Strom bekommt, und zwar von der Zentraleinheit - die Bremsstrecke ist da nur ein Störenfried.

Anordnung der Bauelemente für die Strombegrenzung.

Das dicke Ding in der Bildmitte ist Q3

Ein Kühlkörper ist dann eher hinderlich, denn er verlängert einerseits die Ansprechzeit, bis die PTC-Fuse abschaltet, andererseits verlängert er die Dauer, die der Transistor zum Abkühlen ohne Last benötigt, da der Kühlkörper ja auch eine Wärmekapazität darstellt. Im obigen Beispiel ist F2 diese PTC-Fuse.

Der in der Abbildung oben unter dem Transistor sichtbare Widerstand ist der Strom-Mess-Widerstand, bei mir sind es 0.47 Ohm. Das gelbe dahinter ist die PTC-Fuse, diese ist mit 0.65A so selektiert, dass sie auch schon dauerhaft die 1.4A, die durch die Strombegrenzung gehen würde gar nicht verkraften würde - braucht sie ja auch nicht, da im Zeitmittel nie mehr als ca. 0.6A anliegen werden, der Kurzschluss tritt ja nur bei den positiven Spannungen am Mittelleiter auf. Erwärmt sich der Bereich unter dem Transistor nur um ca. 30 - 50°C, was durchaus noch keine Gefahr für die Elektronik darstellt, dann wird die PTC-Fuse abschalten.

Märklin Bremsstrecke und die reale Eisenbahnwelt

Eigentlich ist so eine Bremsstrecke wie Märklin sie ausgetüftelt hat schon genial: Die Lok bleibt nicht mehr schlagartig stehen, sondern bremst langsam ab. Der vorgesehene, stromlose Bereich wirkt wie ein "Durchrutschweg" bei der realen Eisenbahn, wenn eine Lok bis zum Signal nicht ausreichend gebremst hat, dann bleibt sie spätestens dort stehen.

Dumm nur, dass Realität und das sonst so geniale Mittelleitergleis ein fundamentales Problem mit der Bremsstrecke haben: Die Lok "merkt" nicht dass sie "falsch herum" in eine auf "Halt" geschaltete Bremsstrecke fährt - sie bleibt einfach dumm stehen, weil sie ja aus der falschen Richtung erst auf den stromlos geschalteten Abschnitt fährt.

Zwar gibt es für "Gleichstromer", also Leute, die ein Zweileiter-Gleis nutzen eine halbwegs praktikable Lösung (Bremsspannung wirkt nur wenn sie auf der "richtigen" Schiene liegt, so dass sie in Gegenrichtung ignoriert wird), aber das funktioniert nur ohne den schützenden spannungslosen Abschnitt.

Gegenfahrt

Das eigentliche Problem ist die sogenannte "Gegenfahrt". Das bedeutet, dass eine Lok oder ein Zug entgegen der eigentlichen Wirkungsrichtung des Signals fährt. Eisenbahntechnisch gelten Signale nicht, wenn der Lokführer sich von "hinten" annähert, denn sie schützen nur den vor ihnen liegenden Bereich. Die Lok auf der Modelleisenbahn kann das aber anders als ein echter Lokführer nicht erkennen bzw. ein "Halt" zeigendes Signal ignorieren. Für viele Modellbahner ist hier Schluss, die einzige Lösung im größeren Maßstab ist der Einsatz eines PCs, die Signale sind nur noch schmückendes Beiwerk, nur der Computer weiß, wo Strecken abgeschaltet sind oder es werden gar keine Bremsstrecken mehr eingesetzt.

Die Lösung heißt: Gegenfahrterkennung. Zwar gibt es bereits Bremsstrecken, die eine solche Erkennung auf der Ebene von Gleisbelegtmeldern haben und sich bei Auffahrt eines Zuges in Gegenrichtung automatisch abschalten (d.h., die Bremsstrecke wird dann im Gleis auf "Fahrt" geschaltet bis der Zug die Strecke passiert hat), aber diese Lösung war mir wegen der vielen Gleisbelegtmelder zu aufwändig. Mein Lösung sieht anders aus:

  1. Da zwei elektrisch vom Rest der Strecke getrennte Bereiche nötig sind, habe ich mir in die Mittelleiter Rückmelder eingebaut.
  2. Die Steuerung der Bremsstrecke "merkt" sich, aus welcher Richtung der Zug kam und schaltet die Bremsstrecke ab, wenn der Zug aus der Gegenrichtung kommt.
  3. Später habe ich dann noch die Anschlussmöglichkeit eines "echten", d.h. auf Radkontakt basierenden GBM in den Bereich des Halteabschnitts vorgesehen, was bewirkt, das die Durchfahrt des Zugs für die Zentraleinheit erst mit dem Verlassen des letzten Abschnitts beendet wird.

Während der Gegenfahrt behält das Signal aber seinen Zustand bei. Die Bremsstrecke wechselt nach Durchfahrt des Zugs wieder in die eigentlich vom Signal definierte Stellung. Folgt später noch ein Schleifer, z.B. wegen des Schlusslichts, dann wechselt auch die Bremsstrecke wieder in die "Fahrt"-Stellung bis der letzte Wagen passiert hat, alternativ kann sie auch über den zusätzlichen GBM-Eingang über den Radkontakt die Belegung feststellen und ggf. freigeben.

Bremsstrecke(n)

Warum gleich 2 Bremsstrecken? Naja, ich habe einen Bahnhof mit 3 Gleisen, wobei 2 dieser Gleise für Betrieb mit wechselnden Fahrtrichtungen ausgelegt sind. Ergo gibt es mindestens ein Gleis, das in beide Fahrtrichtungen als Bremsstrecke nutzbar sein muss.

Bei "klassischer" Steuerung der Modelleisenbahn ist das kein Problem: An jedes Ende des Bahnhofgleises einen Halteabschnitt aus 2x 5106 gesetzt (36 cm ohne Fahrspannung), schon hält die Lok punktgenau.

Wie aber das auf digitale Verhältnisse umsetzen? Das Problem ist, dass mein Bahnhofsgleis nur ca. 1.4 m lang ist. Da lassen sich keine zwei Bremsstrecken mit je 60 - 90 cm Länge unterbringen (die Stopp-Abschnitte und das eine Gleis vor der Weiche benötigen auch noch Platz, wenn ich nicht möchte, dass die Lok nachher im Weichenbereich stehen bleibt).

Elektriker kennen die Lösung: Was ich brauche ist eine Kreuzschaltung. Ein Relais mit 2x Umschalter wird dazu verwenden, den gemeinsamen, mittleren Bereich des Bahnhofsgleises so umzuschalten, dass es von beiden Richtungen aus als gemeinsame Bremsstrecke verwendbar ist. Durch geschickte Verschaltung der beiden "normalen" Bremsstrecken-Relais habe ich dazu noch den Vorteil, dass der Stoppabschnitt des in Gegenrichtung befahrenen Endes auch noch ein Teil der Bremsstrecke wird.

Diese Umschaltung ist nur möglich, wenn ein Unidecoder 2 Bremsstrecken steuert. Je nach Bestückungsoption sind das dann wirklich 2 unabhängige Bremsstrecken oder aber eine gemeinsame.

Durch geschickte Verschaltung der Relais kann der Halteabschnitt der Gegenrichtung auch noch (wie oben gezeigt) als Teil des Bremsabschnitts mitbenutzt werden.

Einer der beiden Bremsabschnitts-Ausgänge bleibt bei dieser Verschaltung ungenutzt.

Auf den ersten Blick sieht es merkwürdig aus, wenn bei komplett auf "2x Halt" geschalteter doppelseitiger Bremsstrecke der mittlere Abschnitt wieder scheinbar auf "Fahrt" steht: Tut er nicht. Er hat nur normale Gleisspannung anliegen. Wirksam wird die aber nicht, da eine Lok ja nicht da hinkommt. Egal von welcher Seite ein Zug einfährt, er fährt erst einmal in Gegenrichtung ein - die Gegenfahrterkennung wird aktiv und schaltet von dieser Seite das Gleis auf "Fahrt", so dass die Bremsstrecke wirksam wird.

Gleisbesetzt-Melder

Um zu erkennen, aus welcher Richtung ein Zug kommt, benötigt man Melder. Sehr häufig werden die für Dreileiter-Systeme typischen "Gleisbelegt-Melder" (GBM) in Form einer isolierten Schiene verwendet. Wenn die isolierte Schiene Massekontakt hat, ist das Gleis belegt. Vorteil: Funktioniert über die gesamte Länge eines Zugs - Nachteil: man muss relativ aufwändig eine Schiene isolieren, wenn man nicht "zufällig" ein Satz Kontaktgleise herumliegen hat.

Der ursprüngliche Gedanke war, lediglich zwei Melder je Bremsabschnitt zu verwenden, und zwar als strombasierte Melder. Jeder Melder detektiert den Stromfluss in einem Abschnitt des Gleises (Brems- und Halteabschnitt). Durch diese zwei Melder kann man die Einfahrtsrichtung des Zuges detektieren, und man kann auch feststellen, wann der Zug wieder aus dem Gleis herausgefahren ist.

Diese Melder habe ich noch um einen spannungsbasierten Melder für den Halteabschnitt ergänzt, später kam noch ein weiterer Eingang für einen simplen Schaltgleis-Kontakt hinzu.

Strombasierte Melder

Die "normalen" strombasierten Melder verwenden das bekannte Prinzip des Stromsensors: Ein eigentlich relativ hochohmiger Shunt sorgt dafür, dass ab ca. 10 mA Stromaufnahme auf dem Gleisabschnitt eine Spannung von 0.6V anliegt, die ausreicht einen Transistor durchzusteuern. Indem Dioden parallel geschaltet werden erreicht man, dass über den Sensor aber auch 500mA fließen können, ohne dass der Spannungsabfall größer wird.

Exemplarisch einer der vier Stromsensoren: BREMS2 ist der Anschluss aus der Schaltung, X41 geht zur Anlage und RB5_!GBM_B2 ist der Rückmeldeeingang.

Normalerweise packt man solche Sensoren dann über Optokoppler getrennt von der restlichen Schaltung auf das Board, da man das Problem hat, dass der Rückmelder ja keine definierte Masse zum Gleis haben darf. Hier ist der Vorteil meiner Gleisversorgung, dass der Optokoppler durch einen hochohmigen Widerstand + eine Diode ersetzt werden kann, da ich definiert ca. 20V habe, bis ich auf dem Potential der CPU bin. In die andere Polarität des Gleissignals greife ich nicht ein, diese wird einfach über die 2. parallel geschaltete Diode durchgeleitet, ohne einen Sensor zu steuern. Ich muss nur über einen Kondensator dafür sorgen, dass die Spannung am Eingang der CPU niedrig genug bleibt, auch wenn ein Steuerpuls die Sensorik kurz abschaltet.

Die oben stehende Abbildung zeigt einen solchen Melder. Der Strom wird von "BREMS2" aus an den Anschlusskontakt X41 zum Mittelleiter des Gleises weitergereicht. Die Diodenschaltung bewirkt, dass sich in eine Richtung eine Spannung von ca. 1V aufbaut, dies steuert Q10 durch. Immer wenn die Gleisspannung an B negativ gegen 0 (Gleismasse) ist, wird ein Strom über R34 aus C24 gezogen falls die minimale Spannung von ca. 0.8V über R3 abfällt, was einer Mindest-Stromaufnahe von ca. 5 mA entspricht.

Dabei kann die Spannung am Ausgang des Melders bei durchaus gegenüber der CPU-Masse GND negativ werden: Die parasitär in der CPU vorhandenen Dioden bewirken aber, dass die Spannung nie auf weniger als ca. -0.5V fällt (für ein sauberes Design wären Schottky-Dioden nötigt, dazu weiter unten mehr).

Strombasierte Melder funktionieren aber nicht auf dem Halteabschnitt des "Halt" zeigenden Signals. Dort ist der Strompfad nicht geschlossen, entsprechend ist dort keine Erkennung der Belegung über einen Stromsensor möglich. Auch muss ich in SW schnell genug filtern, wenn wegen eines Kurzschlusses oder einer Spannungsabschaltung kein Gleissignal mehr da ist - sonst würde die Zustandslogik der Bremsstrecke die Belegung "vergessen" und das Chaos beim Wiederanschalten der Gleisspannung wäre vorprogrammiert.

Erkennen einer Lok auf dem Halteabschnitt

Der Halteabschnitt wird noch mit einem zusätzlichen spannungsbasierten Melder abgetastet. Der hat aber dummerweise das Problem, dass er durch eine ähnliche Konstruktion (Widerstand + Diode laden einen Kondensator) auch auf die Gleisspannung selbst reagiert, das heißt, bei direktem Anschluss an das Gleis führt das dazu, dass dieser Melder anders als der strombasierte Melder bei unbelegtem, aber bestromtem Halteabschnitt immer "belegt" anzeigt. Das ist nicht unbedingt ein Nachteil, denn so zeigt der Melder schon cm vor dem eigentlichen Befahren des Halteabschnitts eine Gegenfahrt oder das Ankommen der gebremsten Lok im Halteabschnitt an: Der Schleifer wirkt nämlich wie ein Schaltkontakt, der das auslösende Signal "Gleisspannung" an den GBM führt. Will man aber den GBM parallel zum Stromsensor bei auf "Fahrt" geschaltetem Gleis betreiben, hat man das Problem dass der spannungsbasierte GBM bei Fahrt immer eine Belegung detektieren würde.

Lösung 1: Separater Portpin

Verwendet man einen separaten Portpin, dann hat man die Funktion beider Melder sichergestellt. Man muss aber beim Umschalten des Relais zwischen beiden Sensoren umschalten, was in SW zu passieren hat:

Geschickter geht es aber immer, denn man kann mehrere solcher Melder mit einem "wired or" verknüpfen, muss aber die "belegt" Erkennung des spannungsbasierten Melders bei "Fahrt" zeigendem Signal irgendwie los werden...

Lösung 2: Gleicher Portpin, aber anderer Prüfpunkt

Der spannungsbasierte Melder macht ja nichts anderes, als dass die Spannung an einem bestimmten Punkt gemessen wird. Aber der Melder muss ja nicht zwingend am Gleisanschluss liegen: Es gibt auch die Möglichkeit, stattdessen den bisher ungenutzten Kontakt des Relais zu verwenden. Denn das Relais arbeitet ja als 2x Umschalter, an je einem Mittelkontakt liegen der Bremsabschnitt und der Halteabschnitt. Während beim Bremsabschnitt die Umschalterfunktion benötigt wird, um zwischen Gleis- und Bremsspannung zu wechseln, wird beim Halteabschnitt nur Gleisspannung oder "nichts" geschaltet. Legt man den spannungsbasierten Melder auf diesen freien Kontakt, dann ist das "belegt" bei auf "Fahrt" geschaltetem Relais weg!

Ergänzung: (optionaler) Gleiskontakt

Für die fertige Version meines Unidecoders habe ich die Sensorik des Bremsabschnitts noch um einen Gleiskontakt ergänzt. Das erlaubt eine bessere Erkennung in zwei Fällen:

Anders als für die beiden anderen Kontakte wird hier ein echter Gleiskontakt benötigt, d.h. eines der beiden Gleise wird elektrisch vom anderen isoliert. Die restliche Sensorik benötigt keinen zusätzlichen Anschluss ans Gleis! Das ist der große Vorteil des Unidecoders: Die Anzahl der Leitungen vom und zum Gleis bleibt gering, da die Stromsensorik komplett im Decoder eingebaut ist und nicht separat verkabelt werden muss.

Ein kombinierter Sensoreingang für den Stoppabschnitt der Bremsstrecke. An H2_OFF kann noch optional ein Schaltgleis angeschlossen werden.

Eine "klassische" Lösung benötigt ein separates Modul, das dazu mit jeweils 2 Leitungen zwischen der Bremsstrecken-Schaltung und jedem Gleisabschnitt verbunden werden muss.

Decoder für (mindestens) das MM-Format

Ursprünglich hatte ich vorgehabt, den Decoder ähnlich wie das von den Modellbahnherstellern gedacht ist direkt per Decoder anzusteuern. Das hätte aber je Bremsstrecke einen Doppelausgang des Decoders gekostet, außerdem habe ich mir irgendwann gesagt: Warum nicht zusammen mit dem Signal steuern?

Damit der Unidecoder weiß, was er zu tun hat (=welche Bremsstrecke wie geschaltet werden soll) ist ein Decoder für das MM-Format in SW implementiert. DCC wäre auch elektrisch möglich, wird von der SW aber im Moment noch nicht dekodiert.

Da der Decoder anders als ein "dummer" Weichendecoder durchaus noch andere Sachen zu erledigen hat, wenn die Zentraleinheit Kommandos über das Gleissignal verschickt läuft der MM-Decoder im Interrupt. Diese Lösung ist dahingehend etwas ungewöhnlich, dass in dieser Betriebsart ca. 2.000 bis 14.000 Interrupts / s verarbeitet werden müssen, da jede steigende Flanke des Gleissignals + ein nachgeschalteter Timer für die Detektion verwendet werden müssen.

Der Vorteil dieser Implementierung ist es, dass der PIC (wenn auch mit auf ca. 30 - 60% reduzierter Rechenleistung) für den Rest der Steuerung praktisch kontinuierlich zur Verfügung steht und es keine Segmentierung der verfügbaren Rechenleistung durch die Ansteuerung der Zentraleinheit gibt.

Der Decoder simuliert am Bus einen alten K83 Gleisdecoder. Der Kontakt "Rot 1" ist für die "Halt"-Stellung des 1. Bremsabschnitts fest definiert, während "Rot 3" das gleiche für den 2. Bremsabschnitt macht. Der entsprechende "Grüne" Kontakt schaltet das Signal auf "Fahrt".

Die aus dem XC8 Compiler ausgeworfene Firmware hat keine feste Adresse einprogrammiert, sondern startet in einem Programmiermodus. Es ist über einen Jumper möglich, diesen Programmiermodus wieder zu erzwingen und den Decoder neu zu programmieren. Bei der Programmierung entscheidet die sogenannte "Subadresse", d.h. die Auswahl eines der 8 Ausgänge darüber, welche Betriebsart der Decoder annimmt:

  1. Die Anzahl der Signalstellungen reicht von 2 bis 4. Entsprechend werden dann andere Kontakte z.B. "Grün 2" noch für "Fahrt" mit beansprucht.
  2. Es gibt Einstellungen für Pulskontakt zum Signal und für Dauerkontakt. Bei Dauerkontakt-Ausgabe können Lichtsignale direkt an den Unidecoder angeschlossen werden.
Sub-Adresse Signal-Ausgänge Signal ist persistent Rest ist persistent Verwendung
0   (Rot 1) 2 x 2 nein nein 2 x Formsignal, 2x Weiche
1 (Grün 1) 2 x 3 nein nein 2 x Formsignal, 2x einzelner Schaltkontakt
2   (Rot 2) 2 x 3 nein ja 2 x Formsignal, 2x einzelner Dauerkontakt f. z.B. Beleuchtung
3 (Grün 2) 2 x 2 ja nein 2 x Lichtsignal, 2x Weiche
4   (Rot 3) 2 x 3 ja nein 2 x Lichtsignal, 2x einzelner Schaltkontakt
5 (Grün 3) 2 x 3 ja ja 2x Lichtsignal, 2x einzelner Dauerkontakt f. z.B. Beleuchtung
6   (Rot 4) 1 x 4, 1 x 2 ja nein 2x Lichtsignal, 1x Weiche
7 (Grün 4) 2 x 4 ja - 2x Lichtsignal

Nur wenn das Signal auf Stellung "Hp0" ist (die Zentraleinheiten legen dieses Signal zwingend immer auf "Rot 1" des simulierten Schaltpults), dann ist die "Halt"-Stellung der Bremsstrecke aktiv.

Dass überhaupt eine Unterscheidung zwischen den Subadressen 0 einerseits und 1/2 gemacht wird, liegt daran, dass auch bei einem Aktivieren der Stellung "Hp2" (Langsamfahrt) über den Ausgang "Grün 2" das "Halt" aufgehoben werden muss. Bei einer identischen Ansteuerung auf Subadresse 0 ist das nicht der Fall.

Die definierte Aufteilung spiegelt auch die teilweise fixen Vorgaben der CS2 wieder: Eine Weiche muss eben auf "Rot" und "Grün" der gleichen "Wippe" liegen, ich kann die Weiche nicht so definieren, dass sie auf den bei Sub-Adresse 1 noch freien "Rot 2" und "Rot 4" liegt.

Für die Lichtsignale mit mehr als 2 möglichen Stellungen muss auf der Zentraleinheit das "Profi-Lichtsignal" selektiert werden. Nur dann scheint die Ansteuerung zu passen, ansonsten stimmen die dargestellten Signalstellungen nicht mit dem überein, was schließlich ausgegeben wird. Jede selektierte Stellung schaltet nur einen Ausgang, die passende Ansteuerung der LEDs muss dann über z.B. eine passende Verschaltung der LEDs erledigt werden (bei fertigen Signalen helfen dann nur noch Dioden-Matrizen).

Persistente Signalausgänge werden so geschaltet, dass die persistenten Signale beim "Setzen" des Ausgangs zunächst weggenommen werden, das Signal also vorbildähnlich für kurze Zeit "schwarz" wird. Erst wenn das "Rücksetzen" des Ausgangs von der CS2 befohlen wird, geht der selektierte Ausgang an.

Es wird vom Unidecoder kein Überblenden / Dimmen durchgeführt.

8x Treiber für die Ansteuerung von Signalen und Weichen

Da die Stellung der Bremsstrecken vom Bus gelesen wird, macht es Sinn, auch gleich alle 8 Ausgangssignale der entsprechenden Ansteuerung zu lesen und auf einem parallelen Baustein auszugeben.

Wieso 8? 2 Ausgänge werden doch pro Bremsstrecke verbraucht?

Naja, wie man oben schon lesen konnte, werden diese Kontakte eben doch nicht "verbraucht", sondern es lassen sich parallel noch Signale ansteuern.

Blatt 1 des Unidecoder-Schaltplans (CPU + ULN 2803)

Als Treiber wird der "Klassiker", der ULN 2803 verwendet. Das ist ein Darlington-Array, das pro Ausgang 500mA schalten kann. Eine Stromüberwachung per µC schaltet alle Ausgänge ab, wenn mehr als ca. 800 mA Strom gezogen werden. Dabei wird zwischen Strom für "persistente" Funktionen (max. 250 mA in Summe) und dem durch Impulskontakte ausgelösten Spitzenstrom von ca. 500mA unterschieden.

500mA reichen scheinbar aus, um zwei M-Gleis-Weichen eines Gleiswechsels zusammen über einen Ausgang mit gleichgerichteter Wechselspannung (16 V) zu schalten.

Bei Überstrom schaltet der Unidecoder in zwei Stufen zurück:

  1. Zunächst wird nur die Impulsfunktion abgeschaltet, die im Moment aktiv war. Das Strom-Limit geht dann wieder auf 250mA zurück.
  2. Reicht das nicht oder war keine Impulsfunktion aktiv, werden alle Ausgänge abgeschaltet. Alle Signale werden schwarz, die Stellung der Bremsstrecken bleibt aber davon unberührt.
  3. Wenn man merkt, dass etwas nicht stimmt, kann man die Signale wieder durch die zugeordneten Schaltimpulse aktivieren. Dabei sollte man in der Lage sein, den Kurzschluss orten zu können.

Eine weitere 650mA PTC-Fuse schützt auch die Versorgung des ULN 2803.

Für eingefleischte "Wechselstromer" wie mich war wichtig zu verstehen, dass der ULN 2803 durch die integrierten Freilaufdioden für eine Wechselspannung vom alten Märklin-Trafo quasi einen Kurzschluss darstellt. Wichtig ist es daher, ihn mit einer Diode vor einer versehentlich eingespeisten WS zu schützen. Ich habe mittlerweile die Wechselstrom-Einspeisung meiner Modelleisenbahn durch eine Brückengleichrichtung als mit 100 Hz pulsierende Gleichspannung implementiert.

S88-Bus für die Rückmeldung

Da der Unidecoder für seine Funktion ohnehin eine Anzahl von Gleisbesetzt-Meldern benötigt, macht es Sinn, diese Funktion auch direkt in Form eines Rückmeldebusses an die Zentraleinheit geben zu können.

S88-Busanschluss in 3 Varianten: Links die "klassische" Märklin-Variante, mitten meine eigene 6-pol-Lösung und links die als S88N bekannte Lösung mit Netzwerkkabeln.

Der S88-Bus ist bei den Modellbahnern eigentlich unersetzlich. Da aber Märklin sich für den in der Microcontroller-Technik als "SPI-Bus" bekannten Bus für die Verwendung von CMOS-Schieberegistern entschieden hatte, macht er gerne Probleme.

Hintergrund ist, dass im für die S88-Rückmelder definierten "Slave-Mode" praktisch alle mir bekannten Microcontroller eine Flanke auf dem Takteingang des SPI-Bus als neuen Takt erkennen und annehmen, ohne dass Sie sinnvolle Überprüfungen machen, ob dies ein gültiger Takt ist. Das musste ich beim Testen der ersten Implementierungen leider auch feststellen. Die Lösung sah dann so aus, dass ich die Flanke künstlich langsamer machte. Indem jedes Signal über den S88-Bus an den Microcontroller über ein Tiefpassfilter mit 2.2kOhm Serienwiderstand und 100pF Kapazität parallel zum Eingang geführt wird, wird der ansonsten so empfindliche Bus wirklich brauchbar. Die ursprünglich verwendeten 82 Ohm / 2.2nF habe ich dann wegen zu geringer Impedanz geändert, da ja bis zu 20 Module am Bus liegen.

Notwendig ist das, da insbesondere PIC-CPUs auf ihren Eingängen nicht die besser geschützten CMOS-Pegel verwenden (Schaltschwellen bei 5V-Betrieb ca. <1.5V für Low und >3.5V für High), sondern die eigentlich ungünstigeren TTL-Pegel (<0.6V für Low, >2V für High). "Echte" TTL-Eingänge haben da weniger Probleme, da sie einen eingebauten Pull-Down-Widerstand von ~2 ... 10kOhm haben (je nachdem, ob es "S-" oder "LP-TTL"-Eingänge sind. Mit den hochohmigen Eingängen der PICs machen diese TTL-Pegel aber nur unnötige Probleme, vor allem, wenn die CPU mit 32 MHz rennt und 8 MHz als FOSC an die SPI-Einheit gehen.

Rückmeldeformat

Anfangs hatte ich vorgesehen, dass die CS2 nur ein einziges Datenbyte auf den Bus legen sollte. Das hätte auch recht gut mit der reinen Rückmeldefunktion gepaßt.

Märklin hat aber beim Update der CS2-Firmware auch die Möglichkeit eingebaut, automatische Schaltbefehle nur bedingt auszuführen. Um zu erkennen, was das bedeutet folgende Situation:

Einfache Blockstreckensteuerung

Bei einer geraden Blockstrecke ohne Ausweiche und Verzweigung gibt es zwei sehr einfache Regeln, wie die Blockstrecke gesteuert wird:

  1. Wird der Streckenblock vom Zug verlassen, ändert sich das Signal auf "Rot" (Hp0), da der nachfolgende Streckenblock durch den gerade durchgefahrenen Zug blockiert ist.
  2. Wenn der nachfolgende Streckenblock vom weiterfahrenden Zug verlassen wird und "frei" gemeldet wird, dann ändert sich das Signal am Streckenblock auf "Grün" (Hp1), da ja ein Zug in den nachfolgenden Streckenblock einfahren kann.

Problematisch wird diese einfache Regel, wenn es eine Ausweiche, Gegenverkehr oder eine Verzweigung gibt.

Mögliche Lösung mit der CS2

Die CS2 mit neuerer Firmware (die aktuelle Firmware 4.2 kann das zumindest) erlaubt es, bei automatisierten Abläufen sogenannte "bedingte Aktivierungen" zu definieren. Das bedeutet, dass in Abhängigkeit von Schalteingängen Gleisbelegt- oder Gleisfreimeldungen Signale auf "Halt" oder "Fahrt" schalten können.

Damit das aber mit dem Unidecoder funktioniert, musste die Firmware so geändert werden, dass auch der aktuelle Status der geschalteten Weichen rückgemeldet werden können, außerdem musste je nach benötigter Funktion auch die Belegterkennung für eine Gegenfahrt einzeln ausgegeben werden - mit der Aufteilung der Vorwärts-Melder in zwei Abschnitte ergaben sich dadurch mehr als die 8 Bits, die der PIC16F1786 in einem SPI-Datenbyte übertragen kann.

Rückmeldeformat des Unidecoders

Der Unidecoder verwendet in der aktuellen Firmware das folgende Datenformat für die Rückmeldung (die Datenbytes sind entsprechend der 1. und 2. Bremsstrecke aufgeteilt):

Bit im Byte 1 S88-Kontakt Bedeutung Bit im Byte 2 S88-Kontakt Bedeutung Kommentar
8 1 BS 1 elektrisch auf "Fahrt" 8 9 BS 2 elektrisch auf "Fahrt" Bits können flackern
7 2 GBM 0 (sep. Kontakt) 7 10 LED "Aktivität" ist an 1 = belegt
6 3 Weiche 1 auf Geradeausfahrt 6 11 Weiche 2 auf Geradeausfahrt 1 = grün
5 4 Signal 1 auf Fahrt 5 12 Signal 2 auf Fahrt 1 = grün
4 5 Bremsstrecke 1 belegt 4 13 Bremsstrecke 2 belegt 1 = belegt
3 6 Gegenfahrt BS 1 aktiv 3 14 Gegenfahrt BS 2 aktiv 1 = belegt
2 7 Fahrt BS 1 am Signal 2 15 Fahrt BS 2 am Signal 1 = belegt
1 8 Fahrt BS 1 aktiv 1 16 Fahrt BS 2 aktiv 1 = belegt

Wie man sieht, passt die Signalisierung des Unidecoders zum Pegel den die CS2 erwartet: Ein belegtes Gleis erscheint als "1" auf dem Bus. Die Byte- und Bitnummern erscheinen nicht in der CS2 - diese kennt nur die Nummer des Kontakts. Die CS2 nummeriert diese entsprechend den Eingängen z.B. des CMOS-Bausteins 4014. Der SPI-Bus übeträgt aber mit der Nomenklatur "MSB first", d.h., das 8. Bit des 1. Bytes wird zuerst übertragen und ist damit "Kontakt 1" des Unidecoders in seiner Rückmeldefunktion.

S88-Adressierung

Die Adressierung beim S88-Bus erfolgt rein über die Anordnung in der Kette der Anschlüsse. Der erste Rückmelder ist am nächsten an der CS2, danach folgt der 2. Rückmelder und so weiter. Um nicht durcheinander zu kommen, plane ich, die Unidecoder entsprechend ihrer Busadresse auch über den S88-Bus zu verdrahten, auch wenn dies ca. 5m mehr Leitungslänge bedeuten wird.

S88-Timing der CS2

Der S88-Bus ist ursprünglich von Märklin nur für den Einsatz mit einfachen CMOS-Schieberegistern des Typs 4014 vorgesehen gewesen. Diese Bausteine arbeiten mit nur einer Flanke, die sowohl das Laden der Daten als auch das Weiterschieben der Bits im Schieberegister auf der gleichen Taktflanke erledigen (beim 4014 ist das die steigende Flanke).

Leider entspricht dieses Verhalten nicht der Implementierung eines synchronen, seriellen Schieberegisters in einem Mikroprozessor beziehungsweise des sogenannten SPI-Busses, der sich eigentlich ideal für die Verwendung mit einem synchronen Schieberegisters eignet. Der Grund ist, dass der SPI-Bus und die Mikroprozessoren zweistufig arbeiten:

  1. Die (in diesem Fall) fallende Flanke bewirkt das "Schieben" der Daten, auf dieser Flanke ändern sich die Datenzustände auf der Leitung
  2. Die steigende Falle bewirkt das Übernehme der Daten in den Prozessor.

Erschwerend kommt bei der S88-Implementierung der CS2 noch hinzu, dass man das ungünstige Timing der CS2 auch durch Konfigurationsänderungen nicht ändern kann: Die CS2 erlaubt zwar, die Bitzeiten in weiten Grenzen zu variieren (von 200µs bis ca. 1000µs), aber das ändert nur den relativ uninteressanten Bereich des positiven Taktteils - die negative Pulsbreite bleibt sinnloserweise bei 15µs "eingefroren".

Wirklich zum Problem wird das, wenn der Mikroprozessor den S88-Bus mit 16 Bit Datenbreite benutzen soll: Da der S88-Bus eine "Daisy-Chain" Konfiguration des seriellen Busses implementiert, müssen alle Daten vom DIN jedes angeschlossenen Moduls nach Ausgabe der eigenen Datenbreite durch das DOUT weitergeschleust werden.

Das Problem bei µControllern ist jetzt, dass die Datenbreite, die intern im SPI-Modul gespeichert ist immer nur 8 Bit breit ist. Das bedeutet, dass bei einer Modul-Datenbreite von 16 Bit der µC nach jedem Byte neue Daten in das Modul schreiben muss - und zwar bevor die steigende Flanke das Bit auf dem Bus "einfriert" - die zur Verfügung stehende Bearbeitungszeit des Interrupts liegt also nur bei ca. 10µs!

Wenn nur der S88-Bus alleine bedient werden muss, funktioniert das noch - wenn aber das Gleissignal dazukommt, dann geht das nicht mehr. Als Resultat habe ich dann nach der Erweiterung der Datenbreite auf 16 Bit als "Notlösung" die Entscheidung getroffen, dass ich nur 14 der eigentlich 16 Bit breiten Antwort nutze. Die anderen 2 Bits werden nur für relativ unwichtige, informative Signale verwendet.

Das bedeutet aber auch, dass ich die Signale von Kontakt 1 und Kontakt 9 eines anderen Moduls auf dem Bus nicht sinnvoll auswerten kann. Betroffen ist das Bit 25, also der Kontakt 9 des 2. Moduls (ich hatte noch nie mehr als 2 Module am Bus). Interessanterweise "passen" die Gleissignale scheinbar so zur S88-Kommunikation der CS2, dass bestimmte Bits weniger beeinflusst werden als andere.

S88-Störungen der CS2

Die CS2 erzeugt durch das Gleissignal signifikante Störungen auf dem S88-Bus. Das hat nach meiner Vermutung viel damit zu tun, dass die CS2 einen potentialfreien S88-Bus bereitstellt. Dieser Bus ist zwar potentialfrei, aber es gibt parasitäre Kapazitäten, die direkt aus der CS2 heraus zwischen Gleissignal und S88 Bus Stromspitzen "verteilen". Diese Spitzen sind so ausgeprägt, dass man bei Messungen am S88-Bus Peaks mit ±2V auf den Bussignalen findet. Die Lösung sind bei mir die beschriebenen Tiefpassfilter aus 2.2k / 100pF (rechnerisch  eine Zeitkonstante von 220ns), die die Störungen auf <0.6V begrenzen.

Um den Einfluss der Störungen bewerten zu können, muss man folgendes wissen:

  1. Die Eingangspins eines PIC-Microcontrollers sind generell relativ störanfällig, da der PIC bei allen sich bietenden Gelegenheiten die Eingangspegel seiner Pins auf TTL setzt (ein Low muss <0.6V sein, aber bei >2.0V wird bereits "high" erkannt). Eine Störung von +2V kann also schon ein "High" signalisieren wo gar keines ist.
  2. Bei einer SPI-Schnittstelle zählen auf dem Takt nicht die Pegel, sondern die Flanken. Eine falsch erkannte Flanke auf dem Takt bewirkt ein Weiterschieben der Daten - wenn die Flanke vom fast mit gleicher Frequenz kommenden Gleissignal erzeugt wurden, dann war's halt Pech, der gesamte restliche Transfer liefert nur Müll, die Belegtmelder zeigen ein regelrechtes "Blinkmuster".

Probleme im S88-Timing der CS2 in Kombination mit meinem Unidecoder bei 16 Bit Datenbreite

Hinterher ist man immer Schlauer: Die CS2 ist - was das Timing des S88-Busses angeht - unter Entwicklern von Rückmeldemodulen als schwieriges Kind verrufen. Das will ich im Folgenden erläutern:

Ein kompletter Frame (2 Module) Fehler beim Senden des 25. Kontakts

Die CS2 benutzt ein extrem asymetrisches Timing für den S88-Takt. Das stört bei den CMOS-Schieberegistern nicht weiter, wenn die steigende Flanke die ganze Arbeit macht. Wenn aber wie beim MSSP des PIC nur Konfigurationen verfügbar sind, die im Slave-Mode ein alternierendes Abtasten und Schieben der Daten erlauben, dann grenzt dieses Timing an Sabotage...

Die oben stehenden Bilder zeigen einen solchen Fehler. Am System hatte sich zwischen beiden Bildern nichts geändert. Die Zeitachse des 2. Bilds ist nur doppelt so breit. Trotzdem ist das 25. Bit vom schmalen Puls zu einem ganzen Bit ausgewachsen...

Bit 16 der Übertragung. Grenze Bit 24/25 der Übertragung - ok Bit 25 der Übertragung - Fehler

Die Nadeln in den Signalen von Takt (rot) und DOUT sind übrigens die Pulse des Gleissignals (hier ist die CPU-Seite des Tiefpasses gezeigt). Steigende Flanken des Gleissignals machen "dicke" Nadeln, fallende Flanken nur ca. halb so große.

Die Bitgrenzen Bit 16 / 17 und  Bit 24 / Bit 25 die hier gezeigt ist werden per Software gesteuert, hinter dem Datenbyte das gesendet wird "lauert" ein permanenter High-Pegel (aktivierter Prozessor-Pull-Up auf S88_IN ohne weiteres Modul). Die Kollision hat mit meiner Zerlegung des Gleisprotokolls zu tun, dabei wird ~50µs nach der steigenden Flanke des Gleissignals per Timer 0 Interrupt der Pegel des Gleissignals bestimmt und bei passendem Pegel ein Bit entweder der MM2-Adresse oder der MM2-Daten gebildet. Diese Dekodierung enthält eine Bitverschiebe-Operation - diese wird beim PIC über einen Unterprogramm-Aufruf erzeugt, der mehrere µs in Anspruch nehmen kann...

Die Bits im S88-Datenstrom, die von der HW des PIC16 generiert werden sind völlig innert gegen Störungen, hier genügt es, die Signale auf elektrischer Ebene zu filtern. Merkwürdigerweise sind auch nicht alle Bits gleichmäßig vom hier gezeigten Fehler betroffen, ich habe ihn bisher nur beim Bit 25 gesehen (auch wenn das Timing des S88-Busses geändert wird). Evtl. hat es damit zu tun, dass die CS2 auch eine zentrale Steuerung ihres Timings durchführt und die sich verheerend auswirkende Konstellation eines DCC-1-Pulses ~50µs vor der Low-Phase zwischen Bits 24 und Bits 25 nicht passieren kann...

Der S88-Takt der CS2 ist nicht stabil. Zwar sind die Low-Phasen sehr stabil bei ~15µs, aber die High-Phasen zeigen u.U. Toleranzen, die mehrere 10µs umfassen und sich so ausdehnen können, dass bei 20 Bits der Takt um 100 und mehr µs schwankt - schlechte Karten, wenn man versucht, die S88-Bus komplett in SW zu implementieren und nur eine Flanke des Takts in HW zu lesen.

Störungen

Wie schon beim Abschnitt S88-Bus erwähnt ist man als digitaler Modellbahner nicht gefeit vor Störsignale. Eine Haupt-Störquelle ist das Gleissignal.

Der typische Ansatz, dieses Störsignal zu minimieren liegt darin, dass man für jeden Decoder den Ansatz eines Lokdecoders wählt: Der Decoder erhält seine Spannungsversorgung über einen Brückengleichrichter, so dass eine kontinuierliche Versorgung mit ~20V garantiert ist.

Da das Gleissignal eine relativ "teure" Versorgung ist, hat es sich für stationäre (= nicht im Zug bewegte Decoder) eingebürgert, eine separate Speisespannung, gerne auch die "klassische" 16 V Wechselspannung ebenfalls über einen Brückengleichrichter zur Versorgung von z.B. geschalteten Spulen an Weichen etc. zu verwenden. Aus Sicht eines mit M-Gleis groß gewordenen Modelleisenbahner macht das zwei Probleme:

  1. Beide Spannungen sind nicht mehr elektrisch gegeneinander verschaltbar
  2. M-Gleis-Weichen haben die Beleuchtung gegen Gleismasse verschaltet. Die Spulen benutzen die Versorgung der Beleuchtung (die gleichgerichtet werden muss) und geschaltete Masse (die nicht die Gleismasse ist - siehe 1.)

Mit anderen Worten: So wirklich "Wechselstrom-tauglich" ist diese Lösung nicht.

"klassische" Modelleisenbahnversorgung

Die klassische Modelleisenbahn-Spannungsversorgung mit einem der guten, alten blauen Märklin-Trafos brachte 3 Leitungen mit sich:

  1. Der "rote" Anschluss für die Steuerspannung der Loks => Gibt es noch, heißt jetzt nur "B"
  2. Der "braune" Anschluss für das Gleis => Gibt es noch, heißt jetzt einfach "0"
  3. Der "gelbe" Anschluss für die Lämpchen => Den muss man neu machen, denn Wechselspannung frisst der ULN2803 nicht.

Die Lösung sieht also so aus: Gleismasse und die separate, nicht über die CS laufende Spannungsversorgung für die geschalteten Verbraucher teilen sich eine Masse.

... digitalisiert

Damit der ULN 2803 mitarbeitet, muss man aber die Spannung aus dem WS-Trafo erst über einen Gleichrichter senden, sinnvoll ist es einen Brückengleichrichter zu verwenden. Die Potentialfreiheit des Sekundärausgangs des Trafos kann man auch dafür ausnutzen, den negativen Anschluss des nachgeschalteten Gleichrichters auf "0" (Gleismasse) zu legen.

und S88?

Anders als frühere Varianten von Märklin-Zentraleinheiten hat die CS2 tatsächlich einen S88-Bus-Anschluss, dessen Masse NICHT mit der Gleismasse verbunden ist.

Wirklich helfen tut das aber nicht. Grund: Das Gleissignal ist auf einer digitalen Modelleisenbahn sehr dominant, dominant in dem Sinn, dass man auf allen möglichen anderen Signalen Spannungsverschiebungen findet, die synchron mit dem Gleissignal oszillieren - so wie man ein 50Hz-Signal findet, wenn man nur den Oszilloskop-Tastkopf in die Luft hängt.

Diese kapazitiv vom Gleissignal eingestreuten Störungen sind das eigentliche Problem hinter Störungen bei der digitalen Modelleisenbahn. Aus meiner Sicht macht es daher keinen Sinn, diese Störungen durch komplette galvanische Trennung aller drei Spannungen noch zusätzlich zu hegen - da wollen Ladungen verschoben werden, je kürzer der Weg ist, umso weniger Störungen werden sie machen!

Also sieht meine Lösung so aus, dass ich mittels einer kleinen Zusatzplatine die in meiner Schaltung "GNDIO" genannte S88-Masse an Gleismasse verbinde. Die Masse wird zwar noch weiter separat über den S88-Bus geführt, ist aber auf jedem Unidecoder über einen 88-Ohm-Widerstand an die Masse des Unidecoders geführt. Der zusätzliche Widerstand bewirkt lediglich, dass der S88-Bus nicht als "Ersatzmasse" verwendet wird.

Masse

Man muss sich darüber im Klaren sein, dass bei der gezeigten Lösung ein mit (immerhin!) 5V betriebener Microcontroller auf einer Modelleisenbahn-Anlage werkelt, auf der 20V mit einigen A Stromstärke vor sich hin werkeln.

Das ganze kann nur funktionieren, wenn die Masseversorgung auf der Anlage sauber ist - daher wurde jeder Unidecoder auch mit einem zusätzlichen "0"-Kontakt an der Steckerleiste für den Gleisanschluss versehen.

Zu beachten ist beispielsweise bei den spannungsbasierten Rückmeldern, dass diese bei einer im Halteabschnitt (stromlos) stehenden Lok wegen der im Lokdecoder vorhandenen Brückengleichrichtung + ca. 2V Spannungsabfall dahinter auf ca. 3.5V ansteigen kann, ohne dass man daraus eine Freimeldung für das Gleis ableiten darf. Entsprechend muss dann parallel zu der digitalen (= über den Eingangsport) erfolgten Zustandserkennung eine analoge Messung der Spannung am Pin erfolgen, damit man sicher sein kann, dass mehr als 4 V am Melder anliegen - erst dann ist das Gleis wirklich frei.

Das Konzept des Unidecoders schließt nicht aus, dass er auf einer Modellbahnanlage mit getrennten Massen für das Gleis und die Hilfsspannung benutzt wird. Eine galvanische Trennung ist trotzdem nicht notwendig: Kennt man den Bezug der Massen untereinander, kann man z.B. die Spannungsteiler für das Messen der Gleispolarität anpassen. Dabei müssen die Spannungen aber in eine gewisse Bezug zueinander stehen, aber die Platine kann auch dazu beitragen, dass die Bezüge in der benötigten Größenordnungen bleiben.

Aussichten

Der Unidecoder ist ein Modul für Modellbahnsteuerungen, die es ermöglichen soll, eine Zentraleinheit wie die CS2 viel effektiver als bisher möglich auch ohne PC verwenden zu können. Es bietet für mich Funktionen, die ich in gleicher Form noch bei keiner möglichen Kombination aus verschiedenen Steuermodulen für Modelleisenbahnen finden konnte. Die Integration von Decoder, Bremsstrecke und Rückmeldemodul erspart pro Unidecoder ca. 20 Kabelverbindungen, was auch die Ordnung unter der Modellbahnplatte deutlich verbessert.

Neugierig geworden - dann einfach bei mir melden. Ich bin gerade dabei, meine ersten Module mit Leiterplatte von PCBPool aufzubauen und werde jetzt große Teile der Modellbahn damit ausrüsten.