DCC Lichtdecoder

Eine Zusammenfassung darüber, wie ich meinen eigenen DCC-Lichtdecoder bastelte.

Szenen in denen die Licht-Decoder in der Anlage arbeiten:
  1. Decoder STR1 und STR2: Straßenszene --> hier
  2. Decoder BLS1 und BLS2: Bahnhof Bilsingen --> hier
  3. Decoder BHF1 und FW1: Hauptbahnhof und Oberstadt mit Feuerwehr --> hier
  4. Decoder SERP1 und SERP2: Straßenszene auf der Serpentine --> demnächst
  5. Decoder BÜ1 und BÜ2: Szene um den Bahnübergang --> demnächst.
.

.

Es folgen die Blog-Einträge zu dem Thema (neueste zuerst).

.

Okt 2016 ... DCC-Decoder V4.0

1.10.2016
Der Sommer ist vorbei, jetzt ist Moba wieder dran.

Bevor ich meine nächsten Lichtdecoder verbaue (die Platinen sind schon fertig), werde ich die Dinger noch etwas ändern.
Ich trenne die Leitungen für den Adressschalter, er ist nutzlos weil ich die Adressen nun im Programm ablege - die Programme werden sowieso alle speziell adaptiert an die Lichter die gesteuert werden sollen, also kann die Adresse da gleich mit reinprogrammiert werden.

Damit wird ein wichtiger Pin der Microcontrollers frei, nämlich der hochfrequente PWM-Ausgang - da werde ich also eine Brücke rein legen bei den schon fertigen Platine, aber das ist ja einfach.
Mit diesem Pin werde ich nun den Schalttransistor für die LED Spannungsversorgung pulsen und damit die Lichtstärke dimmen per Software. Das erspart mir die Anpassung der Vorwiderstände; ich kann also auf den Platinen immer die gleichen Widerstände einbauen.
V4 0 DCC-Decoder Okt2016


5.10.2016:
so, die Änderungen in der Hardware und dem Programm sind gemacht ..... und es funktioniert.

Kurze Zusammenfassung was der Decoder jetzt kann:
  • Jeder Decoder hat eine feste Adresse einprogrammiert, damit fällt das Adress-Mäuseklavier weg.
  • Jeder Decoder kann in 2 Modi umgeschaltet werden:
    • Modus 1: der s.g. "Broadcast-Mode"; alle Decoder hören auf die gleichen Functionkeys; bei meinen Lichtdecodern ist sind zZ. nur ein Funktionkey nämlich "Alles AUS / alles AN";
    • Modus 2: der s.g. "Local-Mode"; der Decoder hört nur auf seine speziell an ihn adressierten Signale; Broadcastsignale werden ignoriert; beim Ein- und Ausschalten werden vorgegebene zeitliche Sequenzen durchlaufen für jede Lichtgruppe (im Bahnhof zB: Gruppe1 = 5 Lampen auf Bahnsteig1, Gruppe2 = 5 Lampen auf Bahnsteig2, Gruppe3 = 3 Lampen in der Fußgängerbrücke, Gruppe4 = 3 Lampen im EG); wobei jede Lampe wiederum aus mehreren LEDs bestehen kann, aber als eine Lampe geschaltet wird. Lampengruppen können mit Flackereffekten eingeschaltet werden, oder aus Endlosschleifen bestehen (zB Zimmerbeleuchtungen in Häusern, oder FlackerFeuer, Blinklichter auf Feuerwehren)
  • Im "Broadcast-Mode" werden alle Gruppen automatisch nacheinander mit einer Zeitsteuerung durchlaufen; sie sind gedacht für Tag-Nacht Übergänge im Nominalfall
  • Im "Local Mode" wird jede Sequenz einer Lampengruppe mit einem eigenen Kommando ein/ ausgeschaltet; das ist für Demonstrationen und Tests gedacht.
  • die Fahrspannung wird zum Dimmen der Lichtspannung benutzt; alle Lampen an demselben Decoder werden gleichermaßen gedimmt, also nicht individuell pro Lampe, sondern individuell pro Decoder. Der Microcontroller hat dafür einen PWM Ausgang, dazu lädt man in ein Register den PWM-Modulationsgrad 0...255 und dann macht die Pulserei die Hardware alleine automatisch ohne Programmaktivitäten; die Fequenz ist im KHz Bereich also so hoch dass die LEDs nicht sichtbar flackern.

Als DCC Zentrale benutze ich RocRail, die über einen USB-UART Umsetzer mit dem Decoder verbunden ist (ist ein ELV Platinchen).
Pro Decoder wird in RocRail ein Fahrregler mit einer "Lokadresse" definiert.
Zusätzlich gibt es noch den "Broadcast"-Fahrregler.

Hier mal ein Screenshot; gezeigt die beiden Fahrregler "Broadcast" und der Fahrregler "Bahnhof BHF1"
- Der Broadcastregler hat nur eine Funktionstaste "alles An/Aus" definiert;
- der BHF1-Regler hat An/Aus Kommandos für jede Lampengruppe (Bahnsteig 1 + 2, Brücke, EG);
Alle Regler (aber nicht der Broadcastregler) haben das Zusatzkommando "LOCAL", mit dem sie zwischen den beiden Modi umgeschaltet werden können
rocrail1 2

Der Testaufbau zum Programmieren und Testen:
Das LCD hängt nur dran während der Entwicklung. In der Anlage hat's kein LCD. Der PICkit ist der Brenner, er lädt das Programm vom PC in den PIC-Microcontroller.
Das Platinchen oben links auf dem Steckboard, das ist der USB-UART Umsetzer; das Ausgangs Tx-Signal ist TTL-compatibel 0..5V und kann im zeitlichen Verlauf direkt als DCC Signal decodiert werden.
DSC00858s
Und so sieht's auf dem Bildschirm aus:
Bildschirm IDE
rechts unten: Programmieren mit PMP (PIC Micro Pascal)
oben rechts: RocRail mit den "Fahrreglern"
links: Programm in den Micro laden/brennen mit PICkit2
So, jetzt wird der Decoder BHF1 in die Anlage eingebaut und die LEDs angeschlossen.

Den Einbau der beiden Decoder BHF1 (Lichter im Bahnhof) und FW1(Feuerwehrszene in der Oberstadt) könnt ihr ... hier...   sehen.

Mai 2016 ... DCC-Decoder V3.0

17.06.2016:
Die 4 Platinen der neuen Serie sind fertig bestückt und funktionieren
DSC00090s


21. Mai 2016
zäh ernährt sich das Eichhörnchen.
In den letzten Tagen hab ich richtig gegen und mit meinem PIC Microcontroller gekämpft und wurde immer unzufriedener.
Schließlich hat mich der Ersteller des pmp Pascal-Compilers, den ich zum Proggen benutze, auf die richtige Spur gesetzt.
Durch die Ausgaben auf dem kleinen Display hatte ich die Resourcen des Micros überbeansprucht. Dazu muß man wissen, dass die kleinen Micros nur einen sehr begrenzten Speicher für den s.g. Stack haben, wesentlich weniger als zB ein PC. Und bei mir gab es laufend Überläufe im Stack, sodass das Maschinchen quasi abstürzte.
Im Stack werden die Rücksprungadressen bei Aufrufen von Unterprogrammen zwischengespeichert, damit das Programm am Ende des Unterprogramms wirder zum aufrufenden programm zurückfindet.

Also einiges neu programmiert und nicht unbedingt benötigte Unterprogrammstufen eleminiert- leider auf Kosten der Modularität des Codes - und nun läuft's.
Der Micro läuft jetzt mit 20 MHz externem Oszillator.

Damit funktiojetzt das Display und das Programmieren der Lichtfunktionen kann weitergehen.

Hier ein Bildchen was vor mir auf dem Tisch liegt:
DSC08325s
Auf dem Display zeige ich mir zunächst nur als Programmierhilfe einige Parameter an.
Links oben 4 Zeichen als 0/1, das sind die Tagesphasen (Morgen, Tag, Abend, Nacht), die werden alle Decoder als Broadcast-Kommando bekommen. Und daneben rechts die Decoder speziellen Zustände, max 8 0/1 Flags die Funktionen ein/aus schalten:
b: Blinklichter der Feuerwehren an/aus
a: Autolichter von Nicht-Feuerwehrautos, wie zB Bremslichter
s: Straßenbeleuchtung an/aus
h: Häuser Innenbeleuchtung
f: Feuer1 im Brandhaus
f: Feuer2 im Brandhaus
-: überleg ich mir noch

Wie gesagt, das LCD wird im normalen Einsatzbetrieb nicht angesteckt sein, sondern nur bei der Programmierung und zur Fehlersuche.

Der andere Decoder, den ich für meine Oberstadt dann benötige - Platine ist schon fertig -, wird dann andere spezielle Funktionen haben statt der Feuerwehren:
b: Füßgängerbrücke zu den Bahnsteigen (verdrahtet als 3 Gruppen)
1: Bahnsteig 1 mit 5 Lampen, die mit Flackern angeschaltet werden
2: Bahnsteig 2 mit 5 lampen, ebenfals mit Flackern
e: das EG des Bahnhofs mit 3 Lampen-Gruppen die einzeln geschaltet werden


17. Mai 2016:
kleiner Zwischenstandsbericht.

Jetzt kann ich zu Testzwecken an den Lichtdecoder ein LCD Display stecken und einen USB-Anschluß für DCC am Laptop hab ich nun auch:
DSC08317s
Auf dem Laptop läuft Rocrail und simuliert eine DCC-Zentrale. Über einen USB-UART Umsetzer (kleine Platine oben links im Bild neben dem LCD) kann ich damit das DCC-Protokoll fahren.

Auf dem Bildschirm sieht es dann so aus:
rocrail1 1
Rechts das Hauptfenster zur Bedienung von Rocrail, da sind alle Decoder mit ihren Adressen gelistet. Zusätzlich, da es sich hier um ein Lichtprojekt mit Tageszeiten handelt, gibt es eine Broadcast-Adresse die alle Decoder verstehen, über diese Adresse bekommen alle Decoder die Tagesphasen (Morgen, Tag, Abend, Nacht) gesagt über bestimmte Funtionkeynummern...siehe im Bild oben den Fahrregler "Broadcast".
Die anderen Decoder bekommen für ihre besonderen Funktionen andere Funktionkey definiert, hier zB die Oberstadt mit ihren Häusern, Straßenlaternen und der Feuerwehrszene.
unten das schwarze Fenster ist normalerweise minimiert, es zeigt was Rocrail am DCC Bus macht und interne Befehle.
Die Functionkeys habe ich so verteilt:
FK0 ... FK4: Broadcast für Tagesphasen, für alle Decoder gleich,
FK5 ... FK12: spezielle Funktionen, für jeden Decoder speziell,

Da DCC ja auch regelmäßig die "Lokgeschwindigkeit" schickt, hab ich sie auch dekodiert und werde überlegen was ich für die Lichtsteuerung damit anfangen kann. Evtl könnte ich mit PWM die Lichtstärken einstellen...mal sehen.

10.5.2016:
Die Tests mit der neuen Decoderplatine gehen weiter.
Ich habe mit einem externen 20 Mhz Quarzoszillator Probleme gehabt - mit einem 4 MHz hatte ich ja schon Erfolg - und wollte alles mal wieder gegen die Wand ballern. Der Prozessor wollte einfach nicht anlaufen.
Dann hab ich auf den internen Oszillator umgeschaltet, der zwar keine 20MHz wie gewünscht hat, aber 8 MHz wird hoffentlich für DCC-Empfang auch reichen.
...und siehe da, damit läuft es.
Die Decoderplatine hat eine Stiftleiste, an die ich später - bei passendem Buchsenstecker - das LCD dran schalte. zZ muß ich mich damit behelfen, die Decoderplatine kopfüber auf das Steckboard zu stecken. Funktionell läuft's nun. Diese Platine im Bild ist noch nicht voll bestückt, es ist nur der Prozessor mit Drumrum drauf.
DSC08312s
DSC08311s

8.5.2016:
Seit einigen Tagen bastele ich verzweifelt daran rum, an meinen Decoder zum Testen ein LCD Display anzustöpseln. Ich war fast verrückt geworden, bis ich endlich den Programmierfehler gestern gefunden hatte.

Nun zeigt das Display zumindest das an, was es soll. Nun geht's weiter mit der Decoderprogrammierung; ich wollte das Display dazu nutzen, um das Decoderprogramm auszutesten und Fehler zu finden.

Bis ich nun den Fehler gefunden hatte, dienten LEDs an den LCD-Zuleitungen dazu, anzuzeigen was zum Display geschickt wurde, und damit hab ich den Fehler gefunden. 
Oben links im Bild der Programmierstecker vom PIC-Brenner PicKit2, der selbst mit USB am PC hängt.
DSC08309s

April 2016 ... DCC-Decoder V3.0



30.4.2016:
die erste Platine V3.0 ist fertig und funktioniert; das Programm hakt aber noch irgendwo, die grüne LED (sie soll toggeln wenn über den DCC-Bus ein FK geändert wird) blinkt ständig, arbeitet also falsch.
DSC08301s



24.04.2016:
Ich habe heute in meinem Fundus geschaut, welche Bauteile für die 4 neuen Platinen ich vorrätig habe.... und hab die dann mal gesteckt - noch nicht gelötet.
Standardbauteile wie Widerstände, Transistoren, LEDs und Dioden sind ausreichend vorhanden. Wie ich sehe, ist eigentlich alles vorhanden, ein Quarz fehlt allerdings und ohne die Dinger laufen meine Micros nicht, auch Widerstandsnetzwerke an den Ausgängen hab ich nicht genug ... also muß ich doch beim R.... bestellen.

rechts 4 neue, links ein fertiges Muster von den Prototypen (erste Bauteile nur probe-gesteckt)
DSC08287s

Im oberen Teil der Platine liegt alles rund um den 28-beinigen PIC microcontroller und ein 5 V Regler. Oberhalb des Micros die 8-polige Stiftleiste wird der Anschluß des LCD-Displays zum Testen/Anzeigen.
Im unteren Teil die 16 bit Schieberegister und die Ausgangstreiber-ICs, ganz unten die 16 Ausgänge zu den LEDs und Lampen.
Links die beiden grauen Teile sind die Buchsen für den DCC-Bus.
Den Adresscodierschalter (rot im Muster) hab ich durch Steckbrücken ersetzt, eigentlich kann man den ganz weglassen, dann müsste aber jeder Decoder mit einer anderen Software geladen werden. Da sowieso jedes Decoderprogramm speziell wird, weil die angeschlossenen Lichter andere Funktionen haben, könnte ich den Codierstecker eigentlich wirklich weglassen und die Adresse im Programm ablegen, zumal über den Programmierstecker (weiße 5 Pin-Stiftreihe) ein Programm sehr bequem und schnell neu geladen ist.

23.04.2016:
heute sind 4 neue Platinen für den DCC-Lichtdecoder entstanden. Ich hatte noch drei 1 Jahr alte beschichtete Platinen von Bungard.
Das Layout einer Schaltung hatte ich so hingepfriemelt, dass 2 Schaltungen auf eine Euro-Platine 160 x 100 mm passen. Neu überarbeitet bei V3.0 der  Schaltung hatte ich das Layout der Massefläche; nun läuft sie sauber außen rund um die Platine.


Der erste Belichtungs- und Ätzversuch ging allerdings völlig daneben, die Belichtung war zu kurz (2min) und ich hatte vergessen, die Osram UV Lampe 5 min vorher warm laufen zu lassen, das UV stimmte also noch nicht. Die Belichtung war zu kurz, das sah ich schon im Entwicklerbad.
Bei Nr. 2 und 3 hab ich dann länger belichtet mit 6-7 min, und siehe da schon im Entwicklerbad sah alles sehr gut aus, im Ätzbad lief dann auch alles gut.
DCC-Platine V3
Fertige Platine aus dem Ätzbad; Prüfung und Markierung in einem Grafikprogramm 
mit großer Vergrößerung
DSC08282
4 Platinen fertig gebohrt und mit Lötlack beschichtet.

21.4.2016:
Ich habe heute mal wieder Lust bekommen, die neue Platine für meinen DCC-Lichtdecoder zu entwerfen....Massekonzept verbessert und kleinere Änderungenn.


Das wird dann meine Serie 2 in Version V3 werden ... V1-Prototyp (2 Platinen) und V2-Serie1 (4 Platinen) hatte ich schon verbaut

Der Decoder kann das DCC-Protokoll verstehen und hat 16 Ausgänge. Der Microcontroller PIC 16F866 wird mit den zur angeschlossenen Hardware passenden Software geladen.
Programm-Module bestehen bereits für Licht-Gruppen:
- Autos
- Bahnsteigleuchten mit Flackereffekt
- Hausbeleuchtung (an/aus von verschiedenen Zimmern)
- Straßenbeleuchtung
- Einzellichter
- Feuer mit Flackern
... der Phantasie sind keine Grenzen gesetzt (Verkehrsampeln; Baustellenblinker)

Der Decoder kann im eingebauten Zustand neu programmiert werden.
Programmiersprache: Pascal für PIC-Microcontroller.
Auf der Platine sind 4 LEDs montiert zur Anzeige von Betriebszuständen.
Neu: Es kann ein LCD-Display zum Testen angeschlossen werden.
Spannungsversorgung: 10V und die separate Spannung für die Lichter (LEDs und oder Glühlämpchen).
V3 0 DCC-Decoder Mai 2016  V3 0-3D

Mai 2013 ... 4 Decoder sind fertig

Meinem neuen PIC Pascal Cross-Compiler PMP sei dank.... schaut hier auf Philippes WebSite.

Heute hab ich alle 4 Decoder BIL1/2 und STR1/2 mit den neuen Programmen geladen, die ich mit PMP erstellt habe.

Alles funktioniert wie gewünscht. Die Flackereffekte bei den Lampen könnten so bleiben, bei den Autos werde ich die Sequenzen noch optimieren.

Leider ist der PIC mit den beiden hochfrequenten Aufgaben (DCC-Protokoll und PWM-Pulsen) überfordert, sodass ich die Helligkeitssteuerung mit PWM zunächst aufgebe und die LEDs nur An/Aus schalte.
Im MoBa-mit-Spass Forum bekam ich den Tip, für die Helligkeiten der Lichter es doch mal mit einem zweiten PIC auf der Decoderplatine zu versuchen, der nur die PWM-Pulserei macht. Ich werde mich jetzt damit mal beschäftigen, verbinden könnte ich die beiden PICs mit einem I2C-Bus, wofür die Interfaces in den PICs vorhanden sind.

Mai 2013 ... PIC-microPascal (PMP)

Ich hab mir die Freeware PMP (PIC MicroPascal) installiert und werde mich mal mit Pascal auf PICs beschäftigen. Ich kenne Turbo Pascal ja schon ausgiebig.
Auf den ersten Blick gefällt mir PMP, ein sehr vertrautes, Turbo-Pascal ähnliches Erscheinungsbild der IDE.

shot1.png

PMP generiert Assembler-Files für dem MPLAB-Assembler von Microchip. Die MPLAB-IDE muß installiert sein, was bei mir der Fall ist.

Mit Hochsprachen Compiler-Systemen & IDEs ist es leichter möglich, einen Satz von Libraries in Form von Pascal-Units aufzustellen und zu pflegen. In meinem bisherigen Assembler-Projekt hab ich inzwischen zu viele wiederverwendbare(!) Subroutines, aber das Einbinden in die verschiedenen Programme erweist sich bei Assembler oft als fehlerträchtig, weil ich bisher noch nicht geschafft habe Subroutinenvariablen innerhalb der Subroutines einzukapseln, sondern ich mußte sie als COMMONs deklarieren, was gefährlich ist für größere Software-Projekte. Auch die Variablenübergaben rein und raus aus Unterprogrammen ist in Hochsprachen wesentlich einfacher als mit Assembler.

Außerden sind Arrays & Vektoren mit Assembler schwierig. Naja, IF-THEN-ELSE und DO-Loops lassen sich mit Hochsprache eben doch besser schreiben als in Assembler.

Ich werde jetzt beginnen, einige Vergleichstests von PIC-Assembler gegen PMP-Pascal zu machen und schauen wie sich der Code in Größe und Schnelligkeit unterscheidet...und es interessiert mich, wie PMP-Pascal die Variablen, Vektoren und insbesondere Unterprogramm- und UNIT-Variablen deklariert (sprich wo und wie im Speicher ablegt).

April 2013 ... Lichtdecoder-Programm neu

...das ist das Konzept für meinen Lichtdecoder Version2, eine Handskizze

version2

Rot markiert, das gibt es schon, es sind dies der DCC-Decoder und die s.g. Lichtobjekte.

Lichtobjekte können sein:
  1. Lichterketten (kann auch eine einzige Lampe sein) die mit / ohne Flackern einschalten
  2. Warnlicht-Lauflichter an Baustelle (zyklische Folge)
  3. Hausinnenbeleuchtung (zyklisches an/abschalten von Zimmern nach Zufallsprinzip)
  4. Feuerflackern
  5. Verkehrsampeln an Straßenkreuzungen (zyklische Folge)
  6. Autos (Vorderlampen, Rücklichter mit 2-3 Helligkeitsstufen, gelbes oder blaues Blinklicht) nach Kommando
  7. ... weitere sind noch jederzeit möglich

Blau markiert: Kommandosequenzen, die im Mikrocontroller abgelegt sind (und in einer späteren Version mit CV-Kommandos geändert werden können).
Es gibt Sequenzen für 4 "Tagesphasen"
  1. Morgens
  2. Tagsüber
  3. Abend
  4. Nacht
  5. eine spezielle Phase "Bahnübergang"; diese Phase wird an den Status einer Bahnschranke gekoppelt, sodass bei Autos unmittelbar am BÜ Effekte geschaltet werden wie "Standlicht wenn Schranke geschlossen ist" und "Bremslicht an wenn Schranke schließt"

Grün
markiert die Kommandos, die von der Sequenz an die jeweiligen Lichtobjekte gegeben werden; es gibt natürlich auch Warte/Idle Kommandos für die Zeitsteuerung.
Gelb markiert ein LCD Display, an dem man sich bei Tests die Zustände aller Lichtobjekte anzeigen lassen kann.

Umgeschaltet zwischen den Tagesphasen wird noch "per hand" mit den Funktionstasten F0-F4 einer Roco-LokMaus. Das könnte auch so bleiben. Wenn mal viel Zeit ist, könnte ich das noch an den PC anschliessen und in die MoBa-Gesamtsteuerung einbauen.
Aber so mit der Maus ist's auch gut, vor allem Kinder mögen das, mit Knopfdruck etwas ein/ausschalten.

... alles natürlich weiterhin in PIC-Assembler geschrieben.

Dez 2010 ... PIC-Microcontroller

Ich beginne mich für Assemblerprogrammierung zu interessieren.
Dazu installiere ich die IDE von MicroChip und lerne die Assembler-Programmierung für die PICs.

Das Decoderprogramm wurde auf einem Steckboard entwickelt.
Hilfreich dabei war ein an den Decoder angeschlossenes LCD Display, auf dem ich die empfangenen DCC-Daten anzeigen konnte.
Weiter war aber ein Oszilloskop unentbehrlich, auf ihm konnte ich mir das zeitliche Verhalten und Decodieren anschauen.
Maus_mit_Steckboard.jpg  dcc

Dez 2010 ... Ich lerne DCC

Ich hatte mich Ende 2010 entschieden, die Steuerungen meiner zukünftigen stationären Lichtsysteme (Autos, Straßen/Bahnsteig-Beleuchtungen) digital mit DCC Funktionsdecodern zu steuern.

Dazu kaufte ich mir auf einem MoBa-Flohmarkt sehr günstig ein RocoMaus-System, die MausZentrale mit Booster und Trafo.

 
RocoMaus