In der Märzausgabe 2003 der damaligen 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 ein Code Beispiel von Elektor heruntergeladen. Das Unerwartete geschah: Der Code lief sofort. Im Display las ich „DisplayTech 162“.
Nun konnte ich mich an die eigentliche Arbeit machen. Von Littfinski Datentechnik 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 deswegen sehr geeignet. Bei den Littfinski Geräten macht 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-Signale
- 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
Programmierung 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 mithilfe von E/A- und Timer-Interrupts 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?
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 (Checksum) zusammenkommen.
- Nun wird nur noch die Nutzinformation rausgefiltert, mit der die Ausgänge entsprechend angesteuert werden.
Das ABC des DCC Weichentelegramms
Wie 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“, „Präambel“ genannt. 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üfsummen-Byte ü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 4 Magnetartikel, die normalerweise 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 (C=Checksum) 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 eventuell noch mal betätigen. Bildlich dargestellt, sieht ein Telegramm für Zubehörartikel und seine Aufbereitung also wie folgt aus:
Nun wird das Telegramm im Decoder weiterverarbeitet. Die beiden Adressteilen werden korrekt zusammengefügt, sodass sich eine 9-Bit Adresse ergibt. Die 3 Adressbits im Befehlsbyte sind die höherwertigen Bits der Adresse. Sie werden invertiert gesendet, sodass 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.
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:
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 einen Weichenbefehl so lange 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 so lange 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 bistabilen 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. In 2003 galt noch Festlegung, dass für Zubehördecoder die CVs bei der Nummer von 513 beginnen. Heute starten die CVs für Zubehördecoder genauso bei 1 wie die für Lokomotivdecoder. CV 513 (CV1) ist z. B. für die Decoderadresse vorgesehen, die CVs 515 bis 518 (CV3 bis CV6) für die Schaltdauer der 4 Ausgangspaare. Diese RP921 sieht ebenfalls ein Telegramm für die Programmierung der Weichendecoder im laufenden Betrieb der Anlage vor, genauso 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 die 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 Programmier-Modus zu aktivieren, der von einer LED angezeigt wird. Die Adresse des ersten Weichenbefehls, den der Weichendecoder nun im digitalen Schienensignal erkennt, legt die Adresse des Decoders fest. Bei meiner IntelliBox, wie bei der Redbox und der Mastercontrol von Tams 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
Der Aufbau des Decoders geht mit einfachen Mitteln vonstatten. Ein Viertel einer Lochrasterplatine in Europakartenformat 100 × 160 mm 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 der meisten Weichen mit Doppelspulenantrieb. Jeder Ausgang allein schafft 500 mA, der gesamte Baustein darf mit ca. 1 A 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.
Erste praktische Erfahrungen
Die 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 aus der Bastelkiste verursachten durch Streuung und mangelnde Flankensteilheit Probleme am Interrupt-Eingang des ATMEL Prozessors. 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 wurde auch der 6N137 mit Erfolg getestet.
Brown Out Effekt
Ein weiteres Problem mit dem Prototyp war der sogenannte „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, indem 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 deswegen ad Acta gelegt. Der TL7705 ist ein sogenannter „Voltage Supervisor“ von Texas Instruments, der relativ preisgünstig ist, aber dafür einige externe Bauteile benötigt.
Selbstbau-Decoder WDecD-90 und WDecM-90
Schaltplan, Stückliste und Binärcode des von mir auf den Namen WDecD-90 getauften Decoders (Weichendecoder DCC auf der Basis des AT90S2313) habe ich damals zur nicht kommerziellen Nutzung im privaten Bereich veröffentlicht. Der Code wurde aber dennoch umgehend für kommerzielle Zwecke genutzt und deswegen von der Seite entfernt. Seit November 2004 gibt es einen in der Funktion identischen Decoder mit gleicher Hardware für das Märklin-Motorola Gleisprotokoll, den ich WDecM-90 genannt habe. Die Software beider Decoder kennt acht verschiedene Betriebsarten:
- Bedienung von 4 Doppelmagnetartikeln mit 0,25 s Impulsen
- Bedienung von 4 Doppelmagnetartikeln mit 0,5 s. Impulsen
- 4 × 2 Dauerausgänge für 2-begriffige Signale, Doppelspulenantriebe mit Endabschaltung oder mit (bistabilen) Relais für motorische Weichenantriebe
- Kombination von 2 × 2 Dauerausgängen und 2 × 2 Impulsausgängen
- Kombination von 1 × 2 Dauerausgängen, 2 Blinksignalen und 2 × 2 Impulsausgängen
- 8 unabhängige Dauerausgänge, die mit einem Taster ein-, bzw. ausgeschaltet werden können
- Kombination von 2 × 3 Dauerausgängen für 3-begriffige Signale und 1 × 2 Impulsausgängen 0,25 s
- 2 × 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 können die Decoder die zuletzt angezeigten Signalbilder speichern und beim Einschalten der Anlage wieder anzeigen. 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.
AT90S2313, ATTiny2313 oder ATTiny2313A?
Der Prozessor AT90S2313 wurde von ATMEL abgekündigt und kann nur noch aus Restbeständen bezogen werden. Als Ablösung schlug ATMEL den ATTiny2313 vor, der vom Befehls- und Speicherumfang mit dem AT90S2313 kompatibel ist. Auch dieser Prozessor ist nicht mehr aktuell und wurde vom ATTiny2313A abgelöst. Die Firma ATMEL wurde von der Firma MicroChip übernommen, die aber das ATMEL Programm in ihr Portfolio übernommen hat. Der ATTiny2313(A) 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 AT90S2313 war zwar 1:1 auf dem ATTiny2313(A) lauffähig, setzte aber voraus, dass die Schaltung ebenfalls mit dem für den AT90S2313 noch notwendigen 10MHz Quarz ausgestattet wurde. Mittlerweile wurde der Decoder auf der Basis ATTiny2313 von der Firma Darisus gebaut und vertrieben. Der Code für die kommerziellen Decoder wurde angepasst – Entfall des Quarzes und Verwendung des eingebauten Brown-Out-Schutzes. Die neuen Decoder erhielten im Namen den Zusatz „-TN“ für „Tiny“ statt „-90“.
Die Prozessoren für die Selbstbau-Decoder wurden aber weiterhin mit dem Code für den AT90 ausgeliefert. Da der Brown-Out-Schutz nicht im Code verankert war, sondern über Fuses aktiviert wird, konnte auch das Layout des Selbstbau-Decoders vereinfacht werden. Der TL7705 als Spannungswächter konnte entfallen.
Seit 2016 hat die Firma Darisus den Vertrieb des WDecD-TN eingestellt. Damit kann ich den Binärcode für diesen Decoder für die Selbstbau-Decoder frei verwenden. Weiter unten stelle ich den Code zum Download zur Verfügung. Mit diesem Code kann der Quarz entfallen und wird der interne Brown-Out Schutz aktiviert. Die korrekte Einstellung der Fuses dazu finden Sie ebenfalls in der Tabelle.
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 oder WDecN-TN, der auch in diesem Blog beschrieben wird? Beide sind doch DCC Decoder.
Antwort: Der einfache Weichendecoder WDecD-90 bzw. WDecD-TN 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.
Beispiele von Selbstbau-Decodern
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.
Fertige Decoder WDecD-TN und WDecM-TN
Von Mitte Mai 2005 bis Ende 2016 wurden die Decoder als Fertigmodell bei der Firma Darisus GmbH gefertigt und vertrieben. Die Decoder basierten hard- und software-technisch auf den oben beschriebenen Decoder, aber hatten eine überarbeitete Hardware, die es erlaubte auch die Variante WDecN-TN auf derselben Platine aufzubauen. Anstelle eines 10 MHz Quarzes wurde der interne 8 MHz RC-Oszillator des ATTiny2313 verwendet. Der Funktionsumfang der WDecD-TN und WDecM-TN war mit dem der Selbstbauvarianten WDecD-90 bzw. WDecM-90 identisch.
Diese Decoder können Sie heute nur noch selbst bauen und die dazu passenden neuen Atmel ATTiny2313A Prozessoren mit dem veröffentlichten Code selbst programmieren.
Nach wie vor programmiere ich auch die Bausteine für Sie, falls Sie nicht über die erforderlichen Kenntnisse oder entsprechender Hardware-Ausstattung verfügen.
Nachbau des WDecD-TN
Ein aktueller Nachbau ist der Decoder von Jens Nielsen:
Dieser Decoder ist nicht nur auf der privaten Modellbahn von Jens Nielsen im Einsatz, sondern auch auf der Anlage des 1. Rudolstädter Modellbahnclub e. V. Jens stellt dazu seine „Target“ Layout Datei sowie auch die .stl 3D Dateien zum Drucken eines passenden Gehäuses bereit. Die erforderlichen Dateien finden Sie als .zip File in der Download-Tabelle. Beachten Sie, dass das Gehäuse und das Target File zusammengehören. Andere Decoder-Layouts passen nicht zum Gehäuse!
Mein aktuelles Layout:
Informationen für den Nachbau |
---|
WDecD-TN und WDecM-TN Bestückungsplan |
WDecD-TN und WDecM-TN Schaltplan |
WDecD-TN und WDecM-TN Stückliste mit Bezugsquellen |
Warenkorb Reichelt |
WDecX Platinen Layout (Eagle) + Gerber Dateien |
Gehäuse .stl-Datei für das aktuelle Layout – Boden |
Gehäuse .stl-Datei für das aktuelle Layout – Deckel |
Gehäuse .stl Datei für die Beschriftungsstreifen |
Schwarz-Weiß-Bild der Kupferseite |
Firmware WDecD-TN für ATTiny2313A (Fuses Extended 0xFF, High 0xDB, Low 0xE4) |
Firmware WDecM-TN für ATTiny2313A (Fuses Extended 0xFF, High 0xDB, Low 0xE4) |
Handbuch WDecD-TN und WDecM-TN (etwas anderes Layout) |
WDecD-TN Target Layout mit Gehäuse von Jens Nielsen (1. Rudolstädter Modellbahnclub e. V.) |
© 2003 – 2023 Gerard Clemens – Letzer Update 30.07.2023
Schreibe einen Kommentar