2RelayDec
ÚvodTento 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:
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
IntroductionThis 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:
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éruTato verze dekodéru 2RelayDec podporuje následující funkce:
HardwareHardware 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.SoftwarePo 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 functionsThis version of decoder support following following functions:
HardwareHardware 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.SoftwareMy 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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. |
ProgrammingFollowing 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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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).Například hodnotu 3sec nastavíme jako CV3=1, CV4=44 (1*256 + 44 = 300) *10ms = 3000ms = 3sec. |
Configuration of switching timeDecoder 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).For example value of 3sec is configured as CV3=1, CV4=44 (1*256 + 44 = 300) *10ms = 3000ms = 3sec. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Address
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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ěrCí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. ConclusionProject 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. |