DCC/MM Universaldecoder selbst gebaut


I
n der Märzausgabe 2003 der Elektronikzeitung "Elektor" fand ich eine Beschreibung einer Einplatinen Entwicklungsplattform für einen ATMEL AT90S2313 Mikrocontroller. Ich war sofort von den Eigenschaften dieses Controllers begeistert und begann Ideen zu entwickeln, wie ich einen solchen Baustein für Aufgaben auf der Modellbahn einsetzen kann. Der Beschluss war schnell gefasst und ich bestellte die Platine bei Elektor und die Bauteile bei Conrad.
Nachdem ich wenige Tage später alles zusammengelötet hatte, wurde das "Entwicklungssystem" an den RS232 Port des PCs angeschlossen und das Unerwartete geschah: Eine Beispielapplikation von Elektor wurde runter geladen und lief sofort. Im Display las ich "DisplayTech 162".
Nun konnte ich mich an die eigentliche Arbeit machen. Von Littfinski hatte ich schon diverse Weichendecoder in verschiedenen Ausprägungen im Einsatz, mit Halbleiter Impulsausgängen für Weichenspulen und mit Relaisausgängen für Motorweichen. Als Einstiegsprojekt schien mir ein solcher DCC Zubehördecoder also sehr geeignet. Bei den Littfinski Geräten besorgt ein Zilog Controller die Dekodierarbeit, bei mir sollte es halt der ATMEL sein.

Die Eigenschaften, die den ATMEL in meinen Augen so geeignet erscheinen ließen:

  • Er hat 2 KByte Flash Programmspeicher, also ausreichend für die Zerlegung des DCC-Protokolls
  • Mit 128 Byte SRAM (statischer Schreib-/Lesespeicher) und 128 Byte EEPROM z.B. zur Speicherung der Decoderadresse
  • Zwei Zeitgeber / Zähler mit Interrupt Eigenschaften, z.B. für das Ausmessen der Zeitdauer der DCC-Signalen
  • Genügend E/A-Ports mit den verschiedensten umschaltbaren Eigenschaften.
  • Zuschaltbare interne Pull-Up-Widerstände, wenn die Ports als Eingang laufen
  • Komparator für Analogspannungen mit Interrupt Möglichkeit

Funktionsprinzip

P
rogrammierung in Assembler war für mich nicht ganz neu. Ich hatte in der 8-Bit-Heimcomputer-Zeit schon umfangreiche Erfahrungen mit dem Zilog Z80 Mikrocontroller gemacht und sehr komplexe Programme in Assembler geschrieben. Die größte Schwierigkeit, die ich bei meinem Projekt sah, war die Zerlegung (Dekodierung) des DCC-Signals, die ich mit Hilfe von E/A- und Timer Interrupt erledigen wollte.
Ich machte mich daran, den Vorgang in einem Flussdiagramm niederzulegen, das sich allmählich über mehrere DIN-A4 Seiten erstreckte. Ich war davon ausgegangen, dass ich "Einsen" und "Nullen" des Signals schon lesen konnte, hatte aber dafür noch keine genaue Lösung. Wie sollte ich nun aber das grundlegende Erkennen der Bits erledigen?

Decodierung des DCC-Signals

Nach einigem grafischen Zerlegen von Signalen hatte ich folgende Lösung, die unabhängig von der Polarität des DCC-Signals funktionieren sollte:

Die Regeln dieses Algorithmus sind im obigen Diagramm bildlich dargestellt. In Worten:

  • Jede positive Flanke (oder aber jede negative Flanke) des Signals erzeugt einen Programm Interrupt (eine Programmunterbrechung). Welche Flanke gemessen wird, bestimmt die Verdrahtung des DCC-Signals am Decodereingang.
  • Der Interrupt aktiviert einen 87 µs Timer, der beim Ablauf einen weiteren Interrupt auslöst. In dieser Timer Interruptroutine wird der aktuelle Pegel des Signals nochmals gemessen, ist das "0", dann haben wir eine "1" gemessen, ist das immer noch "1", dann haben wir eine "0" gemessen. Die 87µs sind 3/4 der Periodenzeit des "1"-Signals. Für die Verarbeitung der Information stehen bis zum nächsten Timer-Interrupt mindestens wieder 116 µs zur Verfügung, in der der ATMEL Controller bei 10 MHz Taktfrequenz ca. 800 Anweisungen verarbeiten kann (mein ganzes Progrämmchen ist nur ca. 630 Worte/Anweisungen lang).
  • Die einzelnen Bits werden gezählt und gespeichert und zwischendurch immer wieder kontrolliert, bis am Ende eine "Präambel" (das Achtungssignal - "jetzt geht es los"), ein Adressbyte, ein Befehlsbyte und ein Prüfbyte zusammenkommen.
  • Nun wird nur noch die Nutzinformation rausgefiltert, mit der die Ausgänge entsprechend angesteuert werden.

Das DCC Weichentelegramm

W
ie sieht ein solches DCC-Telegramm für einen Zubehörartikel aus? Nun, jedes Telegramm beginnt mit einem "Achtungspfiff", einer Folge von mindestens 10 bis maximal 14 digitale "Einsen". Wenn danach ein "Null"-Bit folgt, beginnt erst die eigentliche Übertragung. Für einen Zubehördecoder werden zwei Byte (eine Folge von 8 Bit) und ein Prüfbyte übertragen. Nach dem ersten "Null"-Bit kommt zunächst das Adressbyte, das für Zubehörartikel immer mit der Folge "10XXXXX " anfängt. Nach dem Adressbyte folgt wieder ein Null-Bit als "Trennzeichen" zum nachfolgenden Befehlsbyte. Das Befehlsbyte enthält den Rest der Adresse und die Information für die normalerweise 4 Magnetartikel, die vom Decoder gesteuert werden. Da im Normalfall ein Magnetartikel, wie eine Weiche, 2 Spulen hat, die jeweils stromlos oder stromführend sein können, sind 16 Informationen erforderlich, die binär kodiert in den letzten 4 Bit des Befehlswortes Platz finden (2 Spulen x 2 Zustände x 4 Magnetartikel = 16). Nach dem Befehlsbyte wird wieder eine digitale "0" übertragen, die vom Prüfsummenbyte gefolgt wird. Das Telegramm wird nach dem Prüfsummenbyte mit einer digitalen "Eins" abgeschlossen. Der Decoder bildet nun aus Adressbyte und Befehlsbyte ebenfalls die Prüfsumme (Bitweise XOR-Verknüpfung beider Bytes) und vergleicht sein Ergebnis mit dem gerade gelesenen Prüfsummenbyte. Wenn die Summen gleich sind, kann die Information ausgewertet werden, sonst wird sie verworfen und der Bediener der Weiche muss die Taste noch mal betätigen. Bildlich dargestellt, sieht ein Telegramm für Zubehörartikel und seine Aufbereitung also wie folgt aus:

DCC-Telegramm

Nun wird das Telegramm im Decoder weiterverarbeitet. Die beiden Adressteilen werden korrekt zusammengefügt, so dass sich eine 9-Bit Adresse ergibt. Die 3 Adressbits im Befehlsbyte sind die höherwertigen Bits der Adresse. Sie werden invertiert gesendet, so dass der Decoder die in der nachfolgenden Abbildung dargestellten Arbeiten ausführen muss. Mit dieser 9-Bit Adresse lassen sich theoretisch 512 Decoder mit jeweils 4 Ausgängen adressieren, also mehr als 2000 Magnetartikel oder mehr als 4000 Spulen. Das dürfte auch für große Anlagen mehr als ausreichen.

Verarbeitung des Weichentelegramms

Die eigentliche Arbeit für den Decoder kommt dann, wenn die so zusammengebastelte Adresse genau seiner im EEPROM gespeicherten oder an den Dipschaltern eingestellten Adresse entspricht. Jetzt erst kann er die im Befehlsbyte kodierten Ausgänge entsprechend setzen:

Befehlsbyte

In der Praxis - zumindest ist das so bei meiner IntelliBox - ist das Bit B immer auf logisch 1. Man geht wohl davon aus, dass der Weichendecoder die Spule nach einer Zeit automatisch ausschaltet oder dass die Weichenspulen über eine Endabschaltung verfügen. Die IntelliBox sendet ein Weichenbefehl solange wiederholt aus, bis der Anwender seinen Finger von der Taste nimmt oder die voreingestellte maximale Zeit abläuft. Drückt der Anwender nur sehr kurz, wird der Weichenbefehl solange wiederholt, bis die minimale Zeit abläuft. Für Weichen und andere Magnetartikel liegt es deshalb nahe, die Spulenausgänge nach einer Mindestzeit auch wieder zurückzunehmen.

Natürlich gibt es auch Decoder mit Relaisausgängen oder bi-stabilen Relais. Decoder für Lichtsignale benötigen natürlich Dauerausgänge für Signalbilder die sich gegenseitig ablösen.

Die NMRA Recommended Practices (RPs) sehen für Weichendecoder genauso Konfigurationsvariablen (CVs) vor, wie für Lokomotivdecoder. Die CVs gehen von 513 an aufwärts. CV 513 ist z.B. für die Decoderadresse vorgesehen, die CVs 515 bis 518 für die Schaltdauer der 4 Ausgangspaare. Diese RP921 sieht ebenfalls ein Telegramm für die Programmierung der Weichendecoder in laufenden Betrieb der Anlage vor, genau so wie man auch Lokomotiven "on track" umprogrammieren kann. Die Programmierung eines Zubehördecoders wäre daher noch einfach über die Zentrale machbar. Das Auslesen von CVs am Programmiergleis erfordert jedoch einen zusätzlichen elektronischen Mechanismus, mit dem Anfragen der Zentrale bestätigt werden können. Nach NMRA besteht eine solche Bestätigung aus einem erhöhten Stromverbrauch für die Dauer von 6 ms. Ein solcher, 100% kompatibler, Decoder schien mir wegen dieser erhöhten Komplexität als Erstlingswerk weniger geeignet.

Die Einstellung der Decoderadresse hat also mit anderen, einfacheren, Mitteln zu erfolgen. Ich habe mich dazu entschlossen mit einem kleinen Taster einen Programmierungsmodus zu aktivieren, der von einer LED angezeigt wird. Die Adresse des ersten Weichenbefehls, den der Weichendecoder nun im Schienensignal erkennt, legt die Adresse des Decoders fest. Bei meiner IntelliBox geht diese Adressierung nach der Formel:

Decoderadresse =( IB_Weichennummer-1)/4 + 1

Wurde eine Weichenadresse erkannt, geht die LED wieder aus und der Decoder reagiert von nun an auf alle Befehle, die an diese Adresse gerichtet sind. Die Adresse wird nullspannungssicher im EEPROM abgelegt und bei jedem Hochfahren der Anlage wieder in den Arbeitsspeicher (RAM) kopiert.

Bei mindestens 100.000 Schreibzyklen des EEPROM kann die Adresse fast beliebig häufig geändert werden. Wahrscheinlich gibt der Taster eher auf als der EEPROM Speicher.


Schaltung und Aufbau des 4-Fach Zubehördecoders

D
Der Aufbau des Decoders geht mit einfachen Mitteln vonstatten. Ein Viertel einer Experimentierplatine in Europakartenformat reicht für einen Decoder. Weil der ATMEL Controller intern schon Pull-Up-Widerstände hat, kommt man mit recht wenig externen Bauteilen aus. Nicht zu vermeiden ist ein Optokoppler, der das Schienensignal von der Stromversorgung entkoppelt. Die ULN2803 Leistungs-Endstufe reicht mit 0,5 A Dauerstrom für das Schalten von Weichen mit Doppelspulenantrieb. Jeder Ausgang allein schafft 500 mA, der gesamte Baustein darf mit ca.1A belastet werden. Die Freilaufdioden, die zum Schalten von induktiven Lasten nötig sind, sind bereits im ULN2803 integriert.
Die Stromaufnahme der Controller-Schaltung schwankt durch die Ansteuerung des Treibers derart, dass eine einfache Stromversorgung mit einem Vorwiderstand und einer Zenerdiode mit 5,1V Spannung nicht ausreicht. Der deswegen eingesetzte MC 7805 Spannungsregler ist mit 1 A zwar etwas überdimensioniert aber recht preiswert zu haben. Besonders wenn die Schaltung aus dem DCC Schienensignal gespeist wird, ist die höhere thermische Belastbarkeit des MC 7805 von Vorteil.

Prototype schon mit 6n139
Prototype V1 mit 6N139 als Optokoppler und 2 x ULN 2003 als Ausgangstreiber


Erste praktische Erfahrungen

E
ie ersten Exemplare des Decoders wurden gebaut und getestet. Als Schwachpunkt stellte sich der Optokoppler heraus. Optokoppler sind recht langsame Bauelemente. Besonders die zunächst von mir gewählten TIL111 verursachten durch Streuung und mangelnde Flankensteilheit Probleme am Interrupteingang des ATMEL. Die nun in der Version 2 eingesetzten 6N139 sind zwar auch nicht besonders schnell, haben aber dafür eine recht hohe Stromverstärkung, die Streuungen in der DCC-Eingangsspannung und damit im Eingangsstrom spielend leicht abfängt. Fotostrom und Lastwiderstand sind so gewählt, dass die höchste Flankensteilheit des Optokopplers erreicht wird. Neben dem 6N139 stand auch der 6N137 zur Auswahl an. Da dieser ein so guter Frequenzgang / Flankensteilheit hat, ist er eher störungsempfindlich und deswegen ausgeschieden.

Brown Out Effekt

E
in weiteres Problem mit dem Prototyp war der so genannte "brown out" Effekt. Er kann beim Ein- und Ausschalten der Versorgungsspannung auftreten und verursacht unkontrolliertes Ausführen von Teilen des Controllerprogramms. Die Folge ist meistens ein korrupter EEPROM Speicher. Das hat wiederum zur Folge, dass der Decoder seine Adresse oder seine Betriebsart 'vergisst'. Dieser Effekt kann nur verhindert werden, wenn man in der kritischen Phase (relativ langsam absinkende oder ansteigende Versorgungsspannung) den Reset-Eingang auf Null hält. Hierfür gibt es verschiedene Bausteine, welche die Versorgungsspannung überwachen und den Reset bei weniger als ca. 4,5 V auf Null ziehen. Alle haben den Nachteil der Kosten und/oder des zusätzlichen Platzbedarfs.

Bei diversen Tests hat sich die externe Beschaltung des Resets mit einem Baustein TL 7705 als absolut zuverlässig erwiesen. Alle Zwischenlösungen mit passiven Bauelementen wurden für die Version 2 deswegen ad Acta gelegt. Der TL7705 ist ein so genannter "Voltage Supervisor" von Texas Instruments, der relativ preisgünstig ist aber dafür einige externe Bauteile benötigt.


4-fach Selbstbaudecoder WDecD-90 und WDecM-90

S
chaltplan und Stückliste des von mir auf den Namen WDecD-90 getauften Decoders (Weichendecoder DCC auf der Basis des AT90S2313) habe ich weiter unten zur nicht kommerziellen Nutzung im privaten Bereich veröffentlicht. Die Software ist in Form von programmierten Prozessoren WDecD-90 bei mir erhältlich. Seit November 04 gibt es eine funktionsgleiche Variante mit gleicher Hardware für das Märklin-Motorola Gleisformat, die ich WDecM-90 genannt habe. Die Software beider Decoder in der Version 2 kennt acht verschiedene Betriebsarten:
  • Bedienung von 4 Doppelmagnetartikeln mit 0,25 s Impulsen
  • Bedienung von 4 Doppelmagnetartikeln mit 0,5 s. Impulsen
  • 4 x 2 Dauerausgänge für 2-begriffige Signale, Doppelspulenantriebe mit Endabschaltung oder mit (bistabilen) Relais für motorische Weichenantriebe
  • Kombination von 2 x 2 Dauerausgängen und 2 x 2 Impulsausgängen
  • Kombination von 1 x 2 Dauerausgängen 2 Blinksignalen und 2 x 2 Impulsausgängen
  • 8 unabhängige Dauerausgänge, die mit einem Taster ein-, bzw. ausgeschaltet werden können
  • Kombination von 2 x 3 Dauerausgängen für 3-begriffige Signale und 1 x 2 Impulsausgängen 0,25 s
  • 2 x 4 Dauerausgänge für die Ansteuerung von 2 4-begriffigen Signalen.

Für die Ansteuerung von 3- und 4-begriffigen Lichtsignalen sind die Modi 7 und 8 zuständig. Applikationsbeispiele finden Sie in der Bedienungsanleitung. Speziell für die Anwendung als Signaldecoder, kann die Version 2 die zuletzt angezeigten Signalbilder speichern. Ist die Speicherung - vielleicht wegen der begrenzten Anzahl der Schreibzyklen des EEPROMs - nicht erwünscht, kann eine Brücke gesteckt werden, die Pin 8 des ATMELs mit Masse verbindet.


Bedienungsanleitung und Stückliste

D
er Selbstbau eines Weichendecoders hat abgesehen vom handwerklichen Vergnügen auch noch einen wirtschaftlichen Vorteil. Etwas Lochrasterplatine und die Komponenten schlagen mit weniger als 10 Euro zu Buche.

Alle erforderlichen Bauteile zu sehr günstigen Preisen gibt es bei Reichelt, Conrad, Darisus und vielen anderen Händlern im Netz.

Download mit rechter Maustaste,'Ziel speichern unter'
Bedienungs- und Bauanleitung
WDecD-90 V2.1 (146 kB)
Download mit rechter Maustaste,'Ziel speichern unter'
Stückliste DCC-Decoder
V2 (6 kB)
Die programmierten Atmels gibt es auf Anfrage beim Webmaster
WDecD-90.hex V2.1
WDecM-90.hex
Die programmierten Atmels gibt es auf Anfrage beim Webmaster
WDecD-90.eep V2.1
WDecM-90.eep

!Benutzung dieser Information nur für private Zwecke. Der Autor schließt jede Haftung für Schäden durch die Anwendung der hier veröffentlichten Schaltung und Informationen aus!


AT90S2313, ATTiny2313 oder ATTiny2313A?

D
er Prozessor AT90S2313 wurde von ATMEL abgekündigt und kann nur noch aus Restbeständen bezogen werden. Als Ablösung schlägt ATMEL den ATTiny2313 vor, der vom Befehls- und Speicherumfang mit dem AT90S2313 kompatibel ist. Der ATTiny bietet zusätzlich einige Eigenschaften, über die der AT90 nicht verfügte:
  • interner RC Clock Generator
  • interner Brown Out Schutz
  • zusätzliche Funktionen der I/O Ports
  • erweiterte Konfigurierbarkeit mittels sog. "Fuses"

Der Code für den AT90 ist 1:1 auf dem ATTiny lauffähig. Das setzt aber voraus, dass die Schaltung mit einem 10MHz Quarz ausgestattet wird, weil der Code von einem 10 MHz Takt ausgeht und bei 8 MHz des internen RC-Generators nicht funktionieren würde. Außerdem bleibt der Chip so mit den bestehenden Platinen und Schaltungen kompatibel. Weil man nun ein interner Brown Out Schutz aktivieren kann, kann der TL7705 als Spannungswächter entfallen.
Für die Prozessoren für die Selbstbaudecoder liefere ich also seit geraumer Zeit ATTiny2313 für 10 MHz Quarz mit aktiviertem Brown Out Schutz aus. Diese Prozessoren funktionieren auch in bestehenden Schaltungen, die mit einem TL7705 als Spannungswächter/Resetschaltung ausgestattet sind. Auch der ATTIny2313 wurde mittlerweile abgelöst. Der neue ATTiny2313A ist jedoch absolut kompatibel und bietet nur einige weiteren Features.


Frequently Asked Questions

Frage: Ich habe noch AT90S2313 (oder ATTiny2313) liegen. Können diese noch für den WDecD-90 oder für den WDecM-90 gebraucht werden?

Antwort: Ja, sprechen Sie mich bitte an! Ich programmiere auch Ihre AT90S2313 oder ATTiny2313 mit dem Code für die Decoder.

Frage: Was ist der Unterschied zwischen dem selbstlernenden DCC Decoder WDecD-90 und dem NMRA kompatiblen Decoder WDecN-90, der auch auf diesen Seiten beschrieben wird? Beide sind doch DCC Decoder.

Antwort: Der einfache Weichendecoder WDecD-90 versteht aus der gesamten Menge von Befehlen, die von der NMRA standardisiert wurde, gerade mal einen Befehl, nämlich den Weichenbefehl (und auch nur das Einschalten der Ausgänge). Der Decoder kennt keine CV und lässt sich nur über einen Taster programmieren. Der NMRA kompatible Decoder dagegen beherrscht alle von der NMRA definierten Befehle und wird vorschriftsmäßig über CV programmiert.

Frage: Ich arbeite an einem ähnlichen Projekt. Kann ich den Quellcode für den Decoder einsehen?

Antwort: Nein, der Quellcode wurde nie veröffentlicht und bleibt weiter unter Verschluss.

Frage: Warum wurde der Hex-Code für die Decoder vom Web entfernt?

Antwort: 1. Weil er kommerziell verwertet wurde und 2. weil er immer wieder disassembliert wurde, was mir 3. wegen der dadurch entstandenen Rückfragen und Diskussionen viel zu viel Zeit kostete.


Beispiele von Selbstbaudecodern

Der fertige Zubehördecoder des Verfassers
Der fertige DCC Zubehördecoder in der Version2, Abm. 50 x 80 mm

Die Rückseite des Decoders
Die Rückseite


Hier sind einige Beispiele von Nachbauten von Hobby-Kollegen. Als Erstes ein Bild des Nachbaus von Jörg Leuschke, der gleich 4 Exemplare auf einer Lochrasterplatine aufbaute.

Zubehördecoder (4-fach) augebaut von Jörg Leuschke auf einer Streifenrasterplatine
Nachbau von Jörg Leuschke, der die 4 Reset-Eingänge der ATMELs über einen TL7705 Baustein steuert. Hier kommt der 8-fache Ausgangstreiber ULN2803 4-mal zum Einsatz


Zubehördecoder von Peter de Heij auf einer Lochrasterplatine
Der Nachbau von Peter de Heij aus den Niederlanden. Version mit 2 x ULN2003, Steckbrücke für die Speicherung, ausgewachsener Sicherung, Taster und LED.


Decoder Nachbau von Marco Nardi
Dieser Nachbau von Marco Nardi hat schon eine geätzte Leiterplatte als Träger.


© 2003 - 2016 Gerard Clemens letzter Update 25.11.2016


Zurück nach oben