Jindra Fučík

2RelayDec


Conformance Warrant 2017-0003
Pro verzi 2.5



Úvod

Tento DCC dekodér je určen k ovládání dvou elektromagnetických relé. V zásadě není velký problém ho upravit pro jiné dva výstupy, nebo změnit počet výstupů.
Projekt vznikl zejména jako ukázka některých technik využitelných u DCC dekodérů. Jeho předností jsou zejména tyto dvě vlastnosti:
  1. Dekodér umožňuje nastavit každému výstupu individuální adresu, takže představuje vlastně dva dekodéry
  2. Dekodér podporuje zámek dekodéru pro příslušenství
Jedná se o zajímavosti z pohledu NMRA DCC, neboť norma obě tyto vlastnosti sice naznačuje, ale na druhou stranu nikterak nedefinuje. To v praxi vede k tomu, že se výrobci raději uchylují k různým proprietárním řešením, než aby se dostali do konfrontace s NMRA při posuzování zařízení (paradoxně někdy také podle vlastní normy). Mezi klasické případy lze zahrnout třeba Lenz LS-150, který umožňuje definovat až 6 adres, ale pro jistotu zvolil komplikovanou hru s tlačítkem a ledkou, než aby použil běžné programování CV. Podobně je na tom Roco® 61196, kterému se pro změnu hodí zámek dekodéru, neboť startsetové vybavení Roco MultiMAUS a zesilovač Roco 10764 nedisponuje programovací kolejí, takže je potřeba oddělit programování dekodéru v kolejích od programování lokomotivy stojící na kolejích. Roco pro změnu zvolilo metodu založenou na cvakání přestavníkem.
Při tvorbě jsem se snažil vyhnout se používání indexů, které zvolil například Mike Bolton u svého Dekodéru příslušenství. Zejména proto, že se v takovém indexování špatně orientují samotní uživatelé a také počítačové programy, které mají manipulaci s jednotlivými CV zjednodušit.

2RelayDec


Conformance Warrant 2017-0003
For version 2.5



Introduction

This DCC decoder is designed to control two electromagnetic relays. It is very easy to change it for another two outputs, or change number of used outputs.
Project was created especially as a presentation few techniques useful with DCC decoders. Here is two main project benefits:
  1. Decoder allow to configure individual address for both outputs, then decoder acting as two independent decoders.
  2. Decoder contain decoder lock functionality for accessory
from NMRA DCC point of view those functionality are interesting, because they are indicated in standard, but not fully defined. In reality it mean, that vendors prefers to use some proprietary non-standard behaviour to avoid conflict with DCC conformance (sometimes also conformance with own standard). As a classic representatives we can name for example Lenz LS-150. It allows to define up to 6 independent addresses, but Lenz decided to use complicated game with LED and button, and not use usual CV programming. Similar is Roco® 61196. This decoder missing decoder lock, because start sets based on Roco MultiMAUS with combination of booster Roco 10764 do not have programming track, then it is necessary to separate service mode programming of decoder inside track and locomotive standing on track. Then Roco decided to use method based on switching of switchmachine
During creation of decoder I was tryed to avoid using of index, similar as Mike Bolton used with his Accessory decoder. Tis kind of indexing is unfriendly especially for users without computer knowledge. Applications for helping users with CV manipulation also have problems to present masked and real values of CVs.

schma + PCB.zip

Funkce dekodéru

Tato verze dekodéru 2RelayDec podporuje následující funkce:
  • Kompatibilní se systémem standardu NMRA DCC (zejména Roco® MultiMAUS)
  • Podpora všech 2048 adres pro příslušenství nezávisle pro každý výstup (neplést s adresami lokomotiv)
  • Programování každé adresy zápisem do dvou CV proměnných
  • Nezávislé programování času sepnutí každého výstupu ve velkém rozsahu (0,01sec až 10,9225min) (výchozí nastavení 0,5 sekundy)
  • Změna směru na který reaguje každý výstup (rovně nebo do odbočky)
  • Možnost používání zámku dekodéru (Blokování dekodéru proti nechtěnému zápisu) pomocí standardních funkcí CV15/CV16
  • Reset dekodéru s obnovením továrního nastavení (Zápis CV8=33)
  • Programování ve stránkovém a přímém CV režimu

Hardware

Hardware dekodéru je velice jednoduchý, jedná se vlastně jen o procesor, spínací tranzistory a dvě relé (pokud není připojen k základnové stanici, pak ještě stabilizátor napětí). Nicméně použitý hardware nabyl předmětem řešení a tak je jednoduchost spíše výhodou. Všimněte si, že má procesor stále k dispozici jeden vstupně výstupní vývod a jeden vývod určený pouze jako vstup. Tyto vývody lze volně využít pro další rozšíření, jako třeba tlačítka pro manuální spuštění, třetí výstup nebo podobně. V hardware je pochopitelně možné dělat další úpravy, úplně jsem se na jeho kvalitu nesoustředil.

Software

Po stránce software jsem se také snažil o maximální jednoduchost a čistotu kódu. Program stále využívá základní DCC stack, který optimalizoval Paco F. Cañada. Já jsem do kódu již v minulosti doplnil funkcionalitu zámku dekodéru (CV15 a CV16). Ta je užitečná zejména pokud vlastníte příkazovou stanici bez vyhrazené programovací koleje (Například Roco MultiMAUS + Roco 10764 nebo podobné jednoduché typy). Tyto stanice při programování v servisním režimu programují vždy na celém kolejišti, takže může docházet k nežádoucímu přepsání hodnot.
Proto byl zaveden takzvaný zámek dekodéru. Zámek dekodéru umožňuje zamknout dekodér proti nechtěnému přepsání hodnot CV.
Použití zámku je velice jednoduché. Dekodér umožňuje používat programování (čtení i zápis) pouze v případě, že je hodnota CV15 a CV16 shodná. Ve výchozím stavu je tato podmínka splněna, neboť jsou CV15=0, CV16=0.
Pokud chceme dekodér zamknout proti zápisu (a také čtení), nastavíme libovolnou jinou hodnotu do CV16 (například 1). Potom je hodnota CV15=0 a hodnota CV16=1 různá a dekodér přestane reagovat na požadavky na programování. Dekodér lze odemknout zápisem hodnoty 1 do CV15. Pak bude CV15=1 a CV16=1, tedy shodná hodnota a dekodér lze programovat a číst.
V praxi se nejčastěji používá model, kdy se do CV16 zapíše stejná hodnota jako je adresa dekodéru. Pak při programování jednoduše nejprve provedeme zápis do CV15="adresa dekodéru, který chceme programovat" a následně programujeme. Pokud chceme na stejné trati programovat lokomotivy, nejprve zapíšeme do CV15 hodnotu 0 a následně můžeme programovat lokomotivu. (hodnotu 0 zapisujeme i po skončení programování)
Pro případ, že dostaneme dekodér, který je v zamčeném stavu a nevíme jaká je hodnota v CV16, existuje jednoduchá pomůcka. Do CV15 zapíšeme hodnotu 255, to je univerzální klíč, který odemkne všechny dekodéry, takže jej používáme výhradně pokud je dekodér jediný připojený. Po odemčení dekodéru se většinou používají jednoduché příkazy jako obnovení výchozího nastavení (zápis CV8=33), nebo nastavení nové hodnoty zámku (zápis CV16=0, CV15=0).
Definice takto širokého zámku dekodéru umožňuje vytvoření dostatečného prostoru jak pro dekodéry příslušenství, tak pro lokomotivní dekodéry.

Další funkcí, kterou jsem doplnil je používání několika nezávislých adres v rámci jednoho dekodéru. Každá "hlava" má tedy svou vlastní adresu a není nutné vyhledávat spojité úseky několika adres.
Již v minulosti jsme se mohli setkat s dekodéry, které používají více primárních adres. Jedná se například o dekodér Lenz LS-150, nebo dekodér příslušenství MERG. Velkou nepříjemností dekodéru MERG je používání indexace CV, takže proměnné CV1 a CV9 mají různé hodnoty pro případ, že je aktivní pouze první polovina a jiné pro případ, kdy je aktivní také druhá polovina dekodéru. V praxi jsem si ověřil, že většina uživatelů a většina aplikací pro zjednodušení nastavování dekodérů se s tuto skutečností vůbec nevyrovná. Dekodér Lenz rezignoval na používání CV pro nastavení úplně.
Já jsem ve svém konceptu zavedl úplně nové CV pro adresu. V mém případě CV34 a CV35 pro adresu prvního výstupu a CV36 a CV37 pro adresu druhého výstupu. Abych však nemátl nastavovací aplikace úplně, vytvořil jsem i virtuální obraz těchto CV vystupující jako CV1 a CV9. Zde jsem pochopitelně musel využít indexování prostřednictvím CV33. Je li tedy CV33=0, pak hodnota CV1 ukazuj na hodnotu CV34 a hodnota CV9 ukazuje na hodnotu CV35 (CV1=>CV34, CV9=>CV35). Pokud je hodnota CV33=1, pak hodnota CV1 ukazuj na hodnotu CV36 a hodnota CV9 ukazuje na hodnotu CV37 (CV1=>CV36, CV9=>CV37).
Nastavovací aplikace pak zobrazují hodnotu spráně, pokud si zadáme, že CV35 a CV34 tvoří jednu dvojici s dlouhou hodnotou a CV37 a CV36 tvoří druhou dvojici.
Adresa je pak určená klasicky podle vzorce:
Adresa = CV35 * 256 + CV34 nebo Adresa = CV37 * 256 + CV36
Dekodér je vytvořen pro používání adres kompatibilních s centrálami Roco. Nastavení adresy 1 tedy způsobí, že dekodér bude reagovat na adresu výhybky 1 na ovladači MultiMAUS. (Pokud používáte systém Lenz, musíte nastavovat adresu o 4 větší. To znamená, že adresa 5 = SW-1 na ovladači.)
Pro adresy 1-256 stačí nastavit adresu do CV1(CV34/CV36) a hodnotu CV9(CV35/CV37) nechat rovnou 0. Pro adresy větší než 256 je nutné použít celý vzorec pro výpočet.
Například hodnotu 300 nastavíme jako CV9(CV35/CV37)=1, CV1(CV34/CV36)=44 (1*256 + 44 = 300).
Pozor: hodnota 0 v CV1(CV34/CV36) se interpretuje jako 256.
Příklady nastavení uvedeme v následující tabulce.

Decoder functions

This version of decoder support following following functions:
  • Compatible with NMRA DCC standard signal (especially by Roco® MultiMAUS)
  • Support of all 2048 address for accessory with separate address for every output (do not mix with locomotive address)
  • Programming every decoder address by writing into two CV variables
  • Individual configuration of switching time for every output in wide range (0.01sec up to 10.9225min) (default value 0.5 sec)
  • Individual change of direction every output reacts (turn or straight)
  • Possibility to use decoder lock functionality (Blocking to avoid unwanted CV modification) using standard functionality of CV15/CV16
  • Reset of decoder with restore factory default values (write CV8=33)
  • Programming in paged and direct CV mode

Hardware

Hardware of this decoder is very simple. In reality it is only processor, amplifying transistors and two relays (once is not connected to base station, then it will need some voltage regulator). But used hardware was not subject of solution and then simplicity is preferred. You can found, that processor still have two free pins - one input/output and second input only. Those pins can be used for additional functionality; for example buttons for manual triggering or third output etc. It is possible to done many additional changes on hardware level, it was not my original point of interest.

Software

My focus on software level was also to maximum simplicity of code. Program using basic DCC stack optimized by Paco F. Cañada. Some time ago I was extended this code for Decoder lock functionality (CV15 and CV16). This functionality is useful especially if you have command station without dedicated programming track (For example Roco MultiMAUS + Roco 10764 or similar simple types). Those stations always using service mode programming on full layout, then it is possible to unwanted change of CV values.
Then I decided to use functionality called decoder lock. Decoder lock allow to lock decoder against unwanted change of CV values.
Usage of decoder lock is really simple. Decoder allow to use programming (read and write) only in case, that values of CV15 and CV16 are equal. In default state this condition is met, because CV15=0 and CV16=0.
Once we want to lock decoder for write (and also read), we should setup any other value into CV16 (for example 1). Then value CV15=0 and CV16=1 is different and decoder will stop react to requests for programming. It is possible to unlock decoder by setting up value 1 into CV15. Then we will have CV15=1 and CV16=1, then equal values and it will be possible to program and read decoder
It is practical to use model, when we are locking decoders CV16 with same value as address of decoder is. Then during a programming we simple starting with write into CV15="address of requested decoder" and then we can programming it. Once we want to program locomotives on same track, then before programming we will write CV15=0 and then we can programming locomotives. (value of 0 we are writing also at the end of programming)
In a case we will receive decoder in locked state and we do not know value of CV16, we can use small trick. Value 255 in CV15 nean "universal unlock", which unlock all decoders on track, then we can use it only if decoder is connected alone. After this kind of unlock we are usually using simple commands such as restore factory defaults (write CV8=33), or setup new values of locks (write CV16=0 and CV15=0). This wide definition of decoder lock allows enough space for locomotives and also for accessory decoders.

Next useful function is using of independent addresses inside one decoder. Every "head" can use our independent address and it is no necessary to find continuous blocks of addresses.
We can found few decoders using independent primary addresses in the past. For example decoder Lenz LS-150 using independent address for every output; or accessory MERG using two independent base addresses. Big complication of decoder MERG is indexing of CV registers, then value of CV1 and CV9 is different for situation when only first part is active and different when second part of decoder is active. I was found in practice, that many of users and also many of applications designed for helping users with programming CVs have big problem to read and understand structure of CVs when they are indexed. Decoder Lenz LS150 step out from using CVs for configuration at all.
In my concept I was created brand new address CVs. In my case CV34 and CV35 are used for address of first output and CV36 and CV37 are used for address for second output. But to follow general requirements and for not mishmash configuration applications at all, I was created virtual mirror of those CVs presented as CV1 and CV9. I must use indexing for those virtual CVs of course. For indexing I was used CV33. Then once CV33=0, then value of CV1 pointing to CV34 and value of CV9 pointing to CV35 (CV1=>CV34, CV9=>CV35). Once CV33=1, then value of CV1 pointing to CV36 and value of CV9 pointing to CV37 (CV1=>CV36, CV9=>CV37).
Applications for helping users with configuration then displaying values correctly, especially once you will configure, that CV35 and CV34 are pair of long value and CV37 and CV36 are second pair of long value.
Address is then defined as usual by formula:
Address = CV35 * 256 + CV34 or Address = CV37 * 256 + CV36
Examples of configuration are presented in following table.

Address
Adresa
Address
123...255256257258...300...511512513...600
CV1 (CV34/CV36)123255012442550188
CV9 (CV35/CV37)000001111122

Programování

Následující tabulka uvádí všechna CV používaná dekodérem. Dekodér používá jak nízká CV podle současné verze normy, tak vysoká, doporučená pro příslušenství starou normou.
Při programování pomocí MultiMAUS pravděpodobně využijete především nízká CV.

Programming

Following table present all supported CVs. Decoder using low name CVs defined by actual specification and also high name CVs defined by old specification for accessories.
During programming using MutliMAUS will be used low name CVs.

CV Values
CV#CV#defaultmin-maxvýznammeaning
151350-255Primární adresa, spodní část (virtuální CV)Primary address low part (virtual CV)
351500-255Čas sepnutí výstupu A, horní část
(*2560ms; 1=2560ms, 2=5120ms,...)
Activation time for output A, upper part
(*2560ms; 1=2560ms, 2=5120ms,...)
4516500-255Čas sepnutí výstupu A, spodní část
(*10ms; 1=10ms, 2=20ms,...)
Activation time for output A, lower part
(*10ms; 1=10ms, 2=20ms,...)
551700-255Čas sepnutí výstupu B, horní část
(*2560ms; 1=2560ms, 2=5120ms,...)
Activation time for output B, upper part
(*2560ms; 1=2560ms, 2=5120ms,...)
6518500-255Čas sepnutí výstupu B, spodní část
(*10ms; 1=10ms, 2=20ms,...)
Activation time for output B, lower part
(*10ms; 1=10ms, 2=20ms,...)
7 1.0ROVýrobní verze, aktuálně 1.0, pouze pro čteníManufacturing version, actual is 1.0, read only
8 13ROID výrobce, aktuálně 13 - domácí výrobaManufacturer ID, actual 13 - DIY
952100-7Primární adresa, horní část (virtuální CV)Primary address upper part (Virtual CV)
15 00-255Zámek dekodéru, proměnlivá část (klíč)Decoder lock, variable part (key)
16 00-255Zámek dekodéru, statická část (zámek)Decoder lock, static part (lock)
29 128128Konfigurace (BIT7(128) = dekodér příslušenství)Configuration (BIT7(128) = accessory decoder)
3354500-1Index pro mapování CV1/CV9Index for mapping CV1/CV9
3454600-255Primární adresa výstupu A, spodní částPrimary address for output A, lower part
35547500-255Primární adresa výstupu A, horní částPrimary address for output A, upper part
3654800-255Primární adresa výstupu B, spodní částPrimary address for output B, lower part
37549500-255Primární adresa výstupu B, horní částPrimary address for output B, upper part
3855000-7Bitová konfigurace dekodéru
BIT0 (1) inverze chování výstupu A (prohodit rovně/odbočka)
BIT1 (2) inverze chování výstupu B (prohodit rovně/odbočka)
BIT2 (3) při programování využívat spotřebu relé
Decoder configuration
BIT0 (1) invert activation of output A (straight/turn)
BIT1 (2) invert activation of output B (straight/turn)
BIT2 (3) use relays consumption during programming

Nastavení času sepnutí

Dekodér umožňuje používání velkého rozpětí času sepnutí každého výstupu. Čas lze nastavit v rozsahu 10ms - 10,9225min (655350ms) a hodnotu nekonečno (výstup je aktivní rokud nedojde k opětovnému přehození výhybky do obráceného směru).
Čas sepnutí výstupu = (CV3 * 256 + CV4) * 10ms

Například hodnotu 3sec nastavíme jako CV3=1, CV4=44 (1*256 + 44 = 300) *10ms = 3000ms = 3sec.

Configuration of switching time

Decoder allow use of wide scale of switching time for every output. Time can be configured in values starting from 10ms to 10.9225min (655350ms) and value of infinity (output is active until turnout is switched back to opposite direction).
Output activation time = (CV3 * 256 + CV4) * 10ms

For example value of 3sec is configured as CV3=1, CV4=44 (1*256 + 44 = 300) *10ms = 3000ms = 3sec.

Address
Čas
Time
nekonečno
infinite
10ms20ms30ms1s2s3s1min2min3min10min
CV10123100200441122248096
CV90000001234670234
V každém případě pokud dojde k přehození do obráceného směru v době, kdy je výstup aktivní, ukončí se aktivita výstupu. Pokud v době kdy je výstup aktivní přijde znovu příkaz pro jeho aktivaci, tak se tento příkaz ignoruje. Pokud přijde opakovaný příkaz pro aktivaci výstupu v době, kdy už skončila jeho aktivita, tak se výstup znovu aktivuje, bez ohledu na to, jestli přišel příkaz pro obrácený směr.
Nicméně chování není úplně podstatné a v kódu je zřetelné, kdy se co vyhodnocuje, je tedy možné a jednoduché si chování měnit.

Závěr

Cílem projektu bylo vytvoření vzoru pro řešení dvou situací, které samotná DCC norma nemá dotažené do konce. To by mohlo podpořit vznik dalších dekodérů, které budou z uživatelského pohledu přátelštější a komfortnější.
Jestli se tento záměr podařil ukáže čas.

But once relevant turnout is switched to opposite position when output is activated, then it is deactivated immediately. Once next activation command will comme in time output is activated, then this command is ignored. Once next activation command will come after activation time finish, then output is activated again. It does not matter once de-activation command was received.
But this behaviour is not primary target. It is marked in code when any part is enumerated and behaviour can be easily changed.

Conclusion

Project target was create of example how to solve two elementary situations where DCC standard have no single answer. It can be useful for creation next user friendly decoders with better comfort.
We will see in time if we was successful.

Pokud máte problém s osazováním, nebo s výrobou desek plošných spojů, využijte kontaktní formulář na TOMTO web-shopu, kde si můžete objednat komponenty nebo hotový dekodér. Once you have problems with soldering or creating PCB boards, please use contact form on THIS web-shop, where you can order some parts or finished decoder.

Download: schma + PCB.zip HEX + SRC.zip