Naar aanleiding van mijn Arduino project DCCmonitor, doe ik met dit verhaal weer eens een poging het DCC 'protocol' voor een ieder in begrijpelijke taal samen te vatten. Zeker niet compleet en misschien hier en daar, om wille van de leesbaarheid, niet helemaal correct. Waarschijnlijk alweer achterhaald bij het schrijven ervan omdat DCC nog steeds volop in ontwikkeling is en meer functionaliteit regelmatig wordt toegevoegd. Ik beperk me in dit schrijven in detail dan ook tot alleen de 'commands' die door het project DCCmonitor kunnen worden verwerkt. Overige functies hier en daar misschien wel licht aantippen.
In de tekst gebruik ik soms (vaak) of (meestal). De bewering daar gedaan geldt dan gewoon niet in alle gevallen en om de tekst begrijpelijk te houden ga ik niet op deze uitzonderingen in.
DCC is een afkorting van Digital Command Control. DCC is een digitale methode om een modelbaan te besturen.
Steeds vaker wordt DCC gezien als 'de' standaard. Ofschoon er meerdere besturingssystemen zijn als bv. het Motorola van Märklin. DCC is een openbaar door iedereen te gebruiken systeem. Wat waarschijnlijk de populariteit verklaard. De normen ervoor zijn vastgelegd door het Amerikaanse NMRA (National Model Railroad Association). Website van de NMRA
Op hun site is veel info over DCC en daar zijn ook de DCC normbladen te vinden.
Bij een 'analoge' modelbaan wordt de snelheid van een locomotief ingesteld door de hoeveelheid energie die naar de loc gaat te regelen. Bij een 'digitale' modelbaan is de aangeleverde energie royaal aanwezig om vele locomotieven te laten rijden. Deze energie wordt aangeboden als een blokspanning, polariteit wisselt periodiek. Door de frequentie van dit wisselen van polariteit te veranderen wordt een code in deze voedingsspanning gestopt. In een digitale locomotief zit daarom een 'decoder' deze leest de code en kan daarmee de richting, snelheid en de verschillende functies voor licht of geluiden in de locomotief aansturen. Een code is een reeks van enen en nullen. De verschillende systemen als DCC en motorola hebben verschillende manieren om enen of nullen te vormen. De verschillende systemen kunnen worden gecombineerd. Veel moderne centrales als ECOS en CS3 zijn multi-protocol. Meerdere systemen kunnen door elkaar op dezelfde modelbaan worden gebruikt. Decoders 'luisteren' alleen naar de codes gestuurd in het systeem waarop ze zijn ingesteld. Ook het kort onderbreken van het elektrische signaal wordt gedaan door moderne centrales om decoders even de gelegenheid te geven om codes terug te sturen naar de centrale. MFX , M4 en Railcom zijn onder vele meer hier voorbeelden van.
Moderne centrales hebben vaak twee DCC aansluitingen, waarvan 1 voor het 'programmeertrack' en 1 voor de modelbaan zelf. Alle boodschappen, of 'commands' zoals door het protocol betiteld, zijn bedoeld voor decoders met een specifiek 'adres'. Gewoon net als de postbode: deze brief moet in de bus op nummer 120.
Alleen decoders met dit adres verwerken dit command. Maar er zijn situaties dat dat adres niet bekend is van een decoder. Dan kun je het adres via een CV inprogrammeren. Maar dat gedaan op de modelbaan, POM wordt dit vaak genoemd, Program on Main, veroorzaakt een drama want dan gaan ALLE decoders naar dit adres.
Vandaar het aparte track aansluiting. Bovenstaand is een super versimpelde uitleg. Veel centrales gebruiken het programmeer track ook om decoders uit te lezen. (Vaak) specifiek voor de hardware. Dus niet gespecificeerd in het DCC protocol. DCCmonitor ondersteund dit niet.
Binnen DCC is een nul een pulsbreedte van ~116 µs (microseconde=0.000116 seconde) en een 1 een pulsbreedte ~56 µs. Aan een command van DCC gaan 12 1-pulsen vooraf, de preample. Deze preample wordt direct daarop gevolgd door 1 nul puls. Decoders weten dan 'er komt een DCC command aan'. Ieder command wordt weer afgesloten met een 1-puls. Zijn er geen commands meer te versturen door de centrale is het natuurlijk wel van belang dat het polariteit wisselen doorgaat omdat anders de locs geen energie meer krijgen. Centrales sturen daarom een reeks van 'idle commands'. DCC commands die niks commanderen.
Binair is een ander woord voor het tweetallige stelsel.
Met digitaal wordt bedoeld dat waardes worden weergegeven als getallen.
Codes worden gestuurd als enen en nullen, 1 of 0, Waar of niet waar. True of false . Bits. Een groep van 8bits, noemen we een byte. Het meest rechtse cijfer, bit in een byte noemen we het LSB (least significant bit) en heeft de waarde 1. Het meest linkse bit noemen we de MSB (most significant bit) en heeft de waarde 128. Totaal kan met een byte 255 waardes worden weergegeven. Binair schrijf je dit als: B11111111. Voor de leesbaarheid worden binaire getallen meestal in het hexadecimale stelsel genoteerd. Dit kom je in handleidingen en beschrijvingen van DCC decoders veel tegen.
Wij hebben 10 vingers vandaar dat wij in het decimale, tientallige, stelsel tellen en 10 tekens hebben. 0,1,2,3,4,5,6,7,8,9.
In het hexadecimale, zestientallige, stelsel zijn 16 tekens nodig: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
4 Bits, een half byte, wordt een nibble genoemd.
Een decimaal weergegeven byte met waarde 255 is Binair B11111111 en is hexadecimaal 0xFF. Meer informatie hierover op Wikipedia .
DCC commands kunnen bestaan uit 3 tot 6 bytes. Een command wordt altijd vooraf gegaan door een preample. 12 waar bits. Vanaf hier noem ik een bit met de waarde 1 een waar en een bit met de waarde 0 een onwaar. Na de preample volgt direct een onwaar direct gevolgd door het 1e byte, direct weer gevolgd door een onwaar direct gevolgd door het 2e byte ......en zo door tot het laatste byte. Na het laatste byte volgt direct een waar en daarmee is het verzenden van dit command klaar.
Het eerste byte in een DCC command verteld voor welke decoders deze command bedoeld is.
En het bevat de laagste bits van het adres.
Waarde 0 (0x00) is algemeen command voor alle loc decoders. Wordt weinig gebruikt, wordt niet verwerkt door DCCmonitor.
Waardes 1-127, (msb(bit7), bit6~bit0 adres ) Bedoeld voor loc decoders met een 7 bits adres. (adressen 1~64)
Waardes 128-191 (msb waar, bit6 onwaar, bit5~bit0 adres) Voor accessoire decoders
Waardes 192-231 (msb waar. bit6 waar, bit5 onwaar, bit4 onwaar, bit3~bit0 adres) Voor loc decoders met een 14bit adres (adressen 1~9999)
Waardes 232-254 (B11101000-B11111110) bedoeld voor toekomstige uitbreidingen. worden niet verwerkt door DCCmonitor.
Waarde 255 (B11111111) is een idle packet, een command wat niks doet.
Voor loc decoders, in het protocol 'Multi Function Digital Decoders' genoemd, met een 14 bits adres wordt het 1e adresbyte direct gevolgd door nog een 2e adresbyte. Het 3e byte is dan het 1e instructiebyte. Voor alle andere DCC commands is het 2e byte het 1e instructie byte. Voor commands bedoeld voor een loc decoder heeft dit byte CCCDDDD als formaat. De 3 msb's (bit7~bit5) zijn de instructie bits gevolgd door 5 data bits. Betekenis van de instructie bits is:
000 Commands bedoeld om de configuratie van decoders te kunnen aanpassen. Zeer uitgebreide functie, ga ik verder niet op in, meer info hierover in de normbladen bij de NMRA. Niet ondersteund door DCCmonitor.
001 Geavanceerde in bedrijf instructies. Ook hiervoor verwijs ik naar de normbladen, DCCmonitor ondersteund deze commands niet. Onder veel meer zitten hier commands om analoge waardes door te geven. Tot maximaal 255 functies. Ook decoders met 128 snelheid stappen maken gebruik van deze geavanceerde functies. DCCmonitor verwerkt alleen commands voor loc decoders met 28 of 14 snelheid stappen.
010 Command met snelheid stap voor loc decoders achteruit rijden
011 Command met snelheid stap voor loc decoders vooruit rijden
4 Bits (bit0~bit3) geven 14 snelheid stappen. Waarbij B0000 stop instructie is en B0001 'noodstop' instructie. B0010 is dus de eerste snelheid stap en B1111 stap 14. De betekenis van Bit4 van het instructie byte wordt bepaald door de in de loc decoder ingestelde waarde in bit1 van CV#29. Bij onwaar is het commando bedoeld voor decoders met 14 stappen, bit4 stuurt dan de koplampen van de loc aan. Is bit1 van CV#29 waar dan geeft dit bit een halve snelheid stap aan. De snelheidstap bepaald door bit0~bit3 wordt dan in de decoder met 2 vermenigvuldigd en verminderd met de waarde van bit4. Zo wordt een snelheid in 28 stappen verkregen. Moderne decoders hebben dan nog de functie om zelf onder voorwaarden een extra tussenstap in te voegen zodat 56 snelheid stappen ontstaan. De loc decoder met 128 snelheid stappen volgt een ander pad binnen de geavanceerde bedrijfsinstructies, niet ondersteund door DCCmonitor meer info weer in de normbladen hierover. Van DCCmonitor zelf zijn de CV's niet in te stellen, CV#29 bit1 is vast gezet op waar. Een loc met 14 snelheidstappen aangestuurd met een 28 snelheid stappen command zal telkens de koplampen aan en uitzetten, dit verschijnsel is ook te zien met DCCmonitor. Een veel voorkomend probleem.
100 Command stuurt Functies FL (koplichten) en F1~F4
Bit0~bit3 schakelen de Functies F1~F4. Als de loc decoder ingesteld is op 28 snelheid stappen dus CV#29 bit1 waar dan schakelt bit4 de koplampen.
'FL' wordt deze functie vaak genoemd in de handleidingen.
101 Command stuurt Functies F5~F12
Als bit4 waar dan schakelen bit0~bit3 F5~F8. Als onwaar F9~F12.
110 Nog geen toepassing voor, nog vrij voor toekomstige uitbreiding
111 Command voor CV instellen. Configuration Variable Access.
Instellingen van een decoder kunnen met CV commands worden gedaan. Een volledige lijst van aanbevolen CV is weer bij de NMRA te vinden. Verder is deze lijst ook altijd te vinden in de documentatie van de loc of loc decoder.
Een kort CV command is mogelijk, wordt niet verwerkt door DCCmonitor, het lange CV command is meest gangbaar.
1e instructie byte bit4 onwaar, bit3 en bit2 instructie en bit1 en bit0 de msb van het CV nummer of CV adres. Een direct volgend 2e instructie byte bevat dan het lsb van het CV-adres en een direct weer volgend 3e instructie byte bevat de waarde. Een 10-bits adres met max waarde 1024 en een max waarde van 255. Wat een decoder moet doen met het ontvangen CV wordt aangegeven met de twee instructie bits. (bit3 en bit2)
00 (nog) geen betekenis)
01 controle van de waarde. Verwacht een terug bericht van de decoder.
10 Waarde in CV schrijven (alleen deze commands worden door DCCmonitor getoond)
11 Aparte bits in de CV waarde aanpassen. Sommige CV waardes zijn decimaal 0~255, vaak hebben de afzonderlijke bits in de waarde een betekenis. Dan is manipuleren van alleen dat ene bit makkelijker. DCCmonitor toont de CV waardes decimaal en binair.
Commands voor CV instellen worden door de centrale maar 1 keer gestuurd.
Moderne decoders kunnen ook functies F13~F28 gebruiken. Hiervoor wordt instructie 110 (toekomstige uitbreidingen) gebruikt. Meer info in de normbladen. DCCmonitor ondersteund deze commands niet.
Commands van punten 3,4,5 en 6 worden zo vaak als mogelijk, meestal als een blok van 4 commands, door de centrale doorlopend uitgezonden. Eigenlijk niet een 'command' maar meer de 'status' van een bepaalde loc. Dus ook als een loc even 'stroomloos' heeft gestaan krijgt hij snel na het herstellen van de verbinding weer een nieuwe status voor richting, snelheid en de functies.
Punten 1,2 gaan we niet verder op in heeft veel uitzonderingen en bij veel van deze instructies wordt van de decoder verwacht een bevestiging terug te sturen. Voor meer info de normbladen bij NMRA. DCCmonitor verwerkt deze commands niet.
Accessoires zijn 'stationaire' zaken op de modelbaan. Denk aan wissels, lampjes in gebouwen, draaischijven en ontkoppellaars. Commands voor accessoires in het protocol 'Basic Accessory Decoder Packet' genoemd zijn echte aan/uit commands en worden niet doorlopend, zoals bij commands voor loc decoders gestuurd maar (meestal) 4x.
Bit7 van het 1e instructie byte is altijd waar, bit6~bit4 vormen de msb van het decoder-adres geïnverteerd.
Op een accessoire decoder kun je vaak 4 accessoires aansluiten. Dit vindt zijn oorsprong in de structuur van het DCC command. Het decoderadres is het adres voor een groep van 4 oplopende DCC adressen. Als voorbeeld: decoder adres 2 heeft de DCC adressen 5-6-7-8. Decoder adres 100, DCC adressen 397-398-399-400. Bij het aanpassen van waardes in de decoder stuur je een CV instelling die geldt voor de hele decoder, om een specifieke accessoire, een 'channel' wordt dit in het protocol genoemd, aan te sturen zijn dus 4 verschillende CV's nodig. Wel is er in het protocol de mogelijkheid om een CV van een channel apart in te stellen, fabrikanten kiezen zelden om dit te gebruiken.
Bit 3 geeft aan of de poort (port) van het aangestuurde channel aan of uit gezet moet worden. Bit2 en bit1 selecteren een van de 4 channels en bit0 selecteert de poort van dit channel. Rechtdoor of afslaand, zoals bij een wissel.
Verder bestaat binnen het protocol nog een 'Extended Accessory Decoder Control Packet'. Niet ondersteund door DCCmonitor. Dit command is bedoeld zodat fabrikanten los kunnen gaan op zelf bedachte specifieke functies die ze voor hun accessoires nodig hebben. Denk dan bijvoorbeeld aan specifieke decoders voor draaischijven.
Ook bij Accessoire decoders kunnen de instellingen, CV, worden gedaan met DCC commands.
Het 1e instructie byte msn (=most significant nibble bit7~bit4) is dan als hierboven. Het lsn (bit0~bit3) is (meestal) B0000.
Het direct volgende 2e instructiebyte daarvan is de msn altijd B1110 en het lsn en het volgende 3e instructie byte en 4e instructie byte zijn dan gelijk aan die van de CV commands voor loc decoders. Dus instructie bits, 10bits adres en 1 byte data met de waarde.
Commands voor CV instellingen worden altijd maar 1x gestuurd. Moderne decoders kunnen voor CV instellingen een bevestiging sturen. Dit sturen van een bevestiging is (meestal) optioneel en wordt niet ondersteund door DCCmonitor.
Het laatste byte in een DCC command is een checksum. 'Error detection bits' noemen ze het in het protocol.
Om te voorkomen dat commands verkeerd worden gelezen wordt ieder command afgesloten met dit byte.
De checksum is de xor van alle ontvangen bytes in dit command. Hoe werkt dit?
Van alle bytes worden de bit0 bij elkaar opgeteld. Alleen de '1 onthouden' zoals we op school hebben geleerd doen we niet.
Dus 1+0=1 0+0=0 en 1+1=0 (want we doen niet aan 1 onthouden...) de uitkomst ervan komt in de checksum byte.
Dit wordt gedaan voor alle bits. Nu wordt vergeleken door de decoder of het door de centrale in het command gestuurde checksum (het laatste byte) gelijk is aan het door de decoder berekende checksum. Als gelijk dan is het command valid, goed. Zo niet dan wordt het command genegeerd.