Decodierung des DCC-Signals

Das am Port B2 anliegende DCC-Signal löst einen Interrupt aus. In dieser Interruptroutine wird ein Timer gestartet, der nach ca. 87µs in dessen Interruptroutine den Port B2 abgetastet, wenn "H"-Signal anliegt, handelt es sich um eine "0", ansonsten um eine "1". Die NMRA- Spezifikation sagt nämlich aus, dass eine "1" einen Puls von nominal 58µs hat, eine "0" eine Dauer von 116µs. Der Abtastzeitpunkt nach 87µs liegt somit etwa in der Mitte des "0"-Pulses. Die genaue Beschreibung bitte ich der "S-9.1 Electrical Standards for DCC" Spezifikation zu entnehmen.

 

In einem weiteren Schritt wird nun das Format des Signals und der Inhalt ausgewertet. Beim ATTiny 15 erfolgt die Auswertung schrittweise, also Byte für Byte, wobei bei einem Fehler die Auswertung abgebrochen und zur Programmschleife zurückgesprungen wird. Nur in der Programmschleife werden die decodierten Befehle ausgeführt, was allerdings in der simplen Steuerungslogik des ATTiny 15 Programmes nicht weiter stört. Bei den Versionen für ATTiny 45 und 85 ist die Auswertung völlig überarbeitet worden und komplett in Interruptroutinen implementiert worden. Dies hat den Vorteil, dass der Controller in den Zeiten zwischen der Signalerkennung andere Aufgaben wie z.B. die Lastregelung oder Lichtdimmung übernehmen kann. Die Informationen werden also gesammelt und erst bei Vollständigkeit und Korrektheit in den Verarbeitungsprozess übernommen.

 

Entsprechend der Spezifikation in "S-9.2 Communications Standards for DCC" und "RP 9.2.1 Extended Packet Formats For Digital Command Control" wird nach Erkennung der Preambel das Adressbyte, das oder die Instruktionsbytes und das Prüfbyte decodiert und in Registern abgelegt. Ist das Kommando vollständig und Fehlerfrei, so wird bei einem Broadcast Kommando bzw. bei Übereinstimmung mit der eigenen Adresse oder der aktivierten Companion-Adresse das Kommando ausgeführt. Ausnahmen bilden Service-Mode Kommandos ( Siehe Spezifikation in "RP 9.2.3 Service Mode For Digital Command Control" ). Diese dienen der Programmierung auf dem Programmiergleis und sollten nur dort angewendet werden, sonst könnte es passieren, das auf der Anlage eine Menge gleich programmierte Loks gleichzeitig losfahren :-).

 

Motorregelung mittels PWM

Die H-Brücke wird durch Port B1 getastet, dieser ist als Ausgang des Timer 1 im PWM-Mode programmiert. Die Vorteiler des Timers und der Zählwert werden durch CV 9 gesetzt. Während sich bei ATTiny 45 bzw. 85 der Wert für CV 9 recht einfach berechnet, etwa 31Khz / Teiler ( für einen Wert von 9: ergäbe sich 126Hz, für 8: 252Hz für 7: 504Hz u.s.w bis 2: 16KHz) - bzw. 11: 31Hz ) ist das für den ATTiny 15 etwas komplizierter.

 

Bei einer Systemfrequenz von 16KHz ergeben sich Vorteiler, Fahrstufenschritte und PWM-Frequenzen abhängig vom Fahrmodus wie folgt:     

Fahrstufe 128 28 28 28 (14)          
PWM OCR1B 127 124 93 62 (31) 127 124 93 62
Teiler (Schritte) 1 4 3 2 CCCC        
                   
2 6300 6450 8600 12900 0110 38 39 52 77
4 3150 3225 4300 6450 0111 19 19 26 39
8 1575 1613 2150 3225 1000 9 10 13 19
16 787 806 1075 1613 1001 5 5 6 10
32 394 403 538 806 1010 2 2 3 5
64 197 201 269 403 1011 1 1 2 2
128 98 100 134 201 1100 1 1 1 1
256 49 50 67 100 1101 1 1 1 1
512 24 25 33 50 1110 1 1 1 1
1024 12 13 17 25 1111 1 1 1 1

 

14 Fahrstufen: ZZ = 00 ist intern wie 28 Fahrstufen, jedoch immer doppelt
28 Fahrstufen: ZZ = 01 intern 56 Fahrstufen, VV = 01
  ZZ = 01 intern 84 Fahrstufen, VV = 10
  ZZ = 01 intern 112 Fahrstufen, VV = 11
126 Fahrstufen ZZ = 10 intern 126 Fahrstufen, VV = 00

Mögliche Werte für ZZVV sind daher 0000, 0101, 0110, 0111 und 1000

 

Das PWM-Byte für CV 9 ergibt sich wie :        ZZVVCCCC

 

Beispiel 28 Fahrstufen, 201Hz ( ~5ms ) Benutzung von 4 Unterschritten je Fahrstufe:   01 11 1011  =  0x7B = 123 dezimal.

Wohlgemerkt nur für den ATTiny 15.

 

Der PWM-Timer arbeitet nun konstant mit der eingestellten Frequenz und zählt bis zum jeweiligen maximalen Wert hoch. Beim Erreichen des maximalen Wertes fängt der PWM-Timer wieder mit dem Wert 0 an hochzuzählen, Port B1 wird dazu eingeschaltet. Entsprechend der eingestellten Fahrstufe wird das Vergleichsregister OCR1B mit einem Wert geladen der z.B. bei Fahrstufe 14 im Mode 28 Fahrstufen 14/28 des maximalen Zählwerts entspricht. Erreicht der Zähler den Vergleichswert, wird der an OCR1B angeschlossene Port abgeschaltet. Somit vergrößert bzw. verkleinert sich die erzeugte Pulslänge in Abhängigkeit der Fahrstufe bei gleichbleibender Frequenz. ( PWM = Puls Weiten Modulation. )

 

Lastregelung mit den ATTiny 45 bzw. 85

Die Referenzspannung und der Multiplikator des ADC wird durch CV 55 festgelegt. Bit 0 stellt die Referenzspannung mit dem Wert 1 auf 2,56V ein, mit Wert 0 auf 1,1V. Bit 1 = 0 wertet die ADC-Bits 8:1 aus, Bit 1 = 1 die ADC-Bits 9:2. Die höchste Empfindlichkeit von 0,5Vmax ergibt sich aus dem Wert 2, die niedrigste von 2,5Vmax aus dem Wert 1. Der Wert 0 entspricht etwa 1Vmax und der Wert 3 1,25Vmax.

 

Mit CV 56 wird eine Mittelung der Messwerte eingestellt. 1: 4 Meßwerte, 0: 2 Meßwerte. CV 57 richtet eine Verzögerung der Messung ein, Faustformel: Wert * 1/8 ms. Die Verzögerung sollte etwa 1-1,5ms betragen, da beim Abschalten der H-Brücke für die Messung der Motor eine negative Spitze erzeugt, bevor die induzierte Spannung am ADC anliegt. Mit dieser Verzögerung wird diese Spitze ausgefiltert. CV 58 stellt das Meßintervall ein. Faustformel: Wert * 16ms. CV 59 stellt die maximale Regeldifferenz ein, Werte zwischen 1 und 30 sind hier sinnvoll. CV 60 stellt die Anzahl der Zyklen zwischen den Messungen von 0 bis 3 ein und CV 61 gibt den Dividenden zur Lastabweichung vor. Die Werte hier sind 7 =8; 3,5 oder 6 =4, 1,2 oder 4 =2 oder 0 = 1.

 

Die Lastregelung muß natürlich in CV 29 Bit 6 = 1 eingeschaltet und zuvor eingemessen worden sein. Das Einmessen eines Motors geschieht entweder auf einer geraden Stecke oder besser noch auf dem Rollenprüfstand. Die Lok wird auf den Rollenprüfstand gesetzt und mit dem Programmiergleis verbunden. CV 48 mit 5 programmieren und die Lok auf die maximale Modellgeschwindigkeit bringen ( nicht den Fahrregler auf "volle Pulle" stellen, sondern wirklich die maximale Modellgeschwindigkeit einstellen ). Der Rollenprüfstand hat z.B. einen Geschwindigkeitsmesser, der die aktuelle Geschwindigkeit der Lok anzeigt.  Mit Drücken der F9 - Taste an der DCC-Steuerung wird der Messwert in CV 94 übernommen. CV 65 speichert einen Faktor ab, der die Fahrstufe mit der maximal möglichen in Verhältnis setzt. Die Beleuchtung blinkt lange, wenn der Wert übernommen wurde. Blinkt die Beleuchtung 3 mal kurz, war die Messung fehlerhaft. Die mittlere Modellgeschwindigkeit speichert man mit F8 auf CV 80 ab, hier erzeugt man einen Knick in der Lastkurve, wenn notwendig. Die mindeste Geschwindigkeit, bei der der Motor gerade noch dreht, wird mit F7 auf CV 67 abgelegt. F10 löscht alles und man kann nochmals beginnen, F5 beendet die Programmierung, es werden die Werte zwischen CV67 und CV94 selbständig berechnet und im EEProm abgelegt.

 

Die Lastregelung funktioniert nun so, dass bis zur maximalen Fahrstufe am DCC-Regler die zuvor programmierte und eingemessene maximale Modellgeschwindigkeit über den Korrekturwert in CV 65 eingestellt und durch stetige Messung der Dynamospannung konstant gehalten wird. Das funktioniert also von Fahrstufe 1 bis zur Fahrstufe 28, wobei Fahrstufe 1 1/28 der maximalen Geschwindigkeit beträgt. Durch Programmierung des mittleren Wertes lassen sich gerade im unteren Bereich noch schwächer - oder aber auch stärker ansteigende Werte festlegen. Ändert sich die Dynamospannung, so wird über die Vorgaben in CV 56 bis 61 die PWM so nachgeregelt, dass wieder die der Fahrstufe zugeordnete Dynamospannung erreicht wird. Mit dieser Lösung kann immer der volle Regelbereich des DCC-Reglers ausgenutzt und die Loks feinfühlig gesteuert werden. Intern werden die 14, 28 oder 126 Fahrstufen immer in 112 Fahrstufen umgewandelt. Dazu werden die Meßwerte in den CV's 67 bis 94 in der Initialisierungsphase in den Arbeitsspeicher auf 112 Werte exrahiert. Von dieser Tabelle wird über die Messwerte die Lastregelung vorgenommen.

 

Funktionen und die Mapping-Tabelle CV33 bis CV46

CV 37 bis CV 46 beinhalten die Übersetzungstabelle für die Funktionsausgänge. Mit dieser Tabelle lassen sich bestimmte Ausgänge auf die Funktionen Licht vorwärts, Licht rückwärts und F1 bis F12 zuordnen. Siehe dazu auch die Beschreibung in "RP 9.2.2 Configuration Variables For Digital Command Control". Dieses Mapping wird durch die Controllersoftware unterstützt, es gibt allerdings eine Ausnahme bezüglich der Zuordnung des Vorwärts und Rückwärtslichtes. Dies ist wegen der festen Kopplung an das Richtungssignal nicht möglich, es ist aber schaltbar.

 

Dimmfunktion

Die Dimmfunktion erfolgt über den internen Watch-Dog-Timer beim ATTiny 45 bzw. 85. Mit CV 53 wird die Dimmzeit ( (x + 1) * ca. 100ms eingestellt, CV 54 gibt das Dimmen auf einen bestimmten Port frei, der Port entspricht dem im DCCReg:3:0  definierten. So ist z.B. Bit 3=1, also Wert 8 die Lichtfunktion. Beim Ein- oder Ausschalten des Fahrtlichtes oder aber auch bei Richtungswechsel werden nun die Beleuchtung langsam Ein- und Ausgeschaltet, es gibt einen Nachleucht- bzw. Überblendeffekt.

 

Decoder mit ATTiny 15

Das waren die ersten Versuche einen Lokdecoder zu entwickeln. Aus einer Versuchsanordnung heraus ist diese Schaltungsversion entstanden, wegen der geringeren Speicherkapazität von nur 1 KB konnte jedoch keine Lastregelung implementiert werden. Die ATTiny 45 haben da schon 4KB und der ATTiny 85 sogar 8KB Programmspeicher. Trotzdem die gesamte Firmware in Assembler geschrieben wurde, ist der Programmspeicher völlig ausgereizt. Der ATTiny 15 ist seit einiger Zeit abgekündigt, findet sich aber immer noch in diversen Börsen und Auktionshäusern für wenig Geld. Die Programme für den ATTiny 15 sind nicht geeignet, um sie auf einen ATTiny 25 oder höher auszuführen.

 

Ein simpler Lokdecoder kann auf der Downloadpage herutergeladen werden, einen Wagendecoder finden Sie auch dort.

 

Decoder mit ATTiny 45 bzw. 85

Die Controller ATTiny 45 haben 4KB Programmspeicher, 256 Byte internen SRam und 256 Byte EEProm, der ATTiny hat jeweils das Doppelte. Zunächst schien es, dass der ATTiny 45 ausreicht, Lastregelung, Dimmer, und viele kleine weitere Features passten da schon hinein, aber es kamen weitere Wünsche dazu und der Programmspeicher immer knapper. Zukünftige Entwicklungen basieren deshalb ausschließlich auf ATTiny 85 Controller, egal ob es sich um einen Lok- Wagen- oder oder um einen Spezialdecoder handelt. Die Quelldateien werden in nächster Zukunft zusammengeführt und mit CV 62 in den richtigen Mode geschaltet. Im Downloadbereich ist die jeweils letzte eigenständige Version vorhanden.

 

Auch bin ich bei der Überlegung, BIDI mit zu implementieren, nachdem die Schaltung BIDI-Fähig gemacht worden ist ( der Rückkanal fehlt ). Die größte Änderung wird der Controller erfahren, es wird ein ATTiny 84 im QFN/MLF Gehäuse werden. Damit erhöhen sich die Ports auf 12 und es würde wohl auch möglich sein SUSI zu implementieren...

 

Firmware update

Die Controller ATTiny 45 und 85 verfügen über die Möglichkeit, ihren eigenen Programmspeicher zu beschreiben. Wenn der Bootlader von Peter Dannegger verwendet wird, ist dieser in den oberen Speicherbereich zu laden. Entweder ist der Controller noch unprogrammiert, so dass der Befehlszähler bis zum Bootlader hochfährt (0xff entspricht dem Befehl "NOP") oder es sollte eine Sprungadresse dorthin auf der Adresse 0 eingetragen werden. Das Bootloaderprojekt enthält auch ein Terminalprogramm, mit dem der Controller programmiert werden kann. Als Parameter sind die COM-Portschnittstelle, die Übertragungsgeschwindigkeit und die *.hex Datei bzw. die *.eep Datei anzugeben. Wenn der Bootloader mit 2 - Leiter Übertragung erzeugt wurde, empfiehlt es sich Port B3 oder Port B4 zu definieren. Die Firmware sollte immer über den Bootlader geladen werden, da der Bootlader die Einsprungadressen so modifiziert, das er bei einem Reset sich selbst immer zuerst aufruft um dann zur Marke "Reset" im Programm zu springen. Ich habe diesen Bootlader ein klein wenig modifiziert, da er etwa 300ms wartet, ehe der Rücksprung erfolgt. Der Bootlader liest zuerst CV 63 und testet auf Bit 7 = 0. Ist der Wert 0, erfolgt der Rücksprung sofort, anderenfalls wartet der Lader 0,3s auf mögliche Verbindungsaufnahmen. Der Anschluß des RS232- Ports an den Controller erfolgt über einen speziellen Adapter, der RxD und TxD auf einen Leiter zusammenführt.