@grizeldijev opis formule za lokomotivski naslov izgleda zelo v liniji s tem, kako se uporablja dolge DCC naslove. Dolgi DCC naslovi so med 0 in okoli 10000. V resnici DCC naslavljanje nudi 14 bitov, vendar za dolge naslove ni na voljo ves nabor (14 bitov bi pomenilo 16384), ampak le 10239. Nekateri proizvajalci so to zaradi enostavnejšega uporabniškega vmesnika potem zmanjšali na 0-9999 (4-mestne decimalne številke).
- V CV17 se vpiše 192 + MSB (prištevanje 192 je efektivno postavljanje zgornjih dveh bitov). Iz @grizeldijevega citata Rocove dokumentacije sledi, da je tam omenjeni Adr_MSB očitno vrednost CV17, maskiranje z 0x3F pobriše zgornja dva bita.
- V CV18 se vpiše LSB. Namesto maskiranja (addr & 0xFF) se lahko naredi celištevilčno aritmetiko: LSB=addr-(addr/256)*256.
Namesto maskiranja z 0x3F, ki se ga opravlja na MSB za zagotovitev, da je rezultat 6-bitna vrednost, se lahko naredi tudi celoštevilčno aritmetiko: MSB-(MSB/64)*64. Ker predpostavimo, da je v Adr_MSB res vrednost iz CV17, ki mora po definiciji imeti leva (prva) dva bita postavljena, lahko tole poenostavimo v MSB-192.
Če je torej znan naslov lokomotive (npr. 1234), se poračuna Adr_MSB in Adr_LSB takole:
Adr_MSB = 192 + (address/256) (za primer: Adr_MSB = 192+4 = 196 = Adr_MSB)
Adr_LSB = address - (address/256)*256 (za primer: Adr_LSB =1234-(1234/256)*256 = 1234-4*256 =1234-1024 = 210 = Adr_LSB )
Iz Adr_MSB in Adr_LSB pa se poračuna naslov takole:
address = (Adr_MSB-192)*256 + Adr_LSB
za primer: address = (196-192)*256+210 = 4*256+210 = 1024+210 = 1234 = address
Seveda se lahko vse zgornje namesto z celoštevilskimi operacijami naredi z bitnimi operacijami:
Adr_MSB = (address >> 8 )|0xC0
Adr_LSB = address & 0xFF
in
address = ((Adr_MSB & 0x3F) << 8 ) | Adr_LSB
Seveda so oklepaji še kako pomembni, saj ni nepomembno v kakšnem vrstnem redu so operacije opravljene.
V vsakem primeru (celoštevilčna aritmetika ali bitne operacije) pa je treba poskrbeti, da je address 16-bitna spremenljivka/vrednost, Adr_MSB in Adr_LSB pa 8-bitni. V nasprotnem primeru se lahko zgodi, da se kje valjajo kakšni postavljeni biti ki vse skupaj odnesejo v nedefinirani smeri.
Čez nekaj časa ... sem šel pogledat dokumentacijo s povezave. Takoj za tekstom, ki ga je @grizeldi dal v google translate, piše še tole:
Bei Lok-Adressen ≥ 128 müssen die beiden höchsten Bits in DB1 auf 1 gesetzt sein:
DB1 = (0xC0 | Adr_MSB). Bei Lokadressen < 128 sind diese beiden höchsten bits ohne Bedeutung.
Kar pomeni naslednje: če je lok naslov 128 ali večji, morata biti zgornja bita v DB1 (Adr_MSB) postavljena na 1, kar se doseže (druga vrstica) z logičnim OR z vrednostjo 0xC0 (ki je v binarnem prikazu 11000000, v decimalnem pa 192). Kar je identično prištevanju 192 kot je to v mojem primeru. Ta citat v bistvu dokazuje, da sta DB1 in DB2 res kar CV17 in CV18.
Pa še mimogrede: DCC standard določa, da se lahko uporabljajo kratki in dolgi naslovi. Kratki naslovi so tam nekje do 99 ali 127 (odvisno od implementacije) in se shranjujejo v CV01. Dolgi naslovi so lahko teoretično prav tako od 1 naprej in se vpisujejo v CV17 in CV18. Ko DCC centrala (recimo z21) naslavlja lokomotive, najprej pošlje en byte naslova. Če je levi bit (MSB) naslova 0, dekoder ve, da gre za kratki naslov (zato omejitev do 127). Če levi bit ni 0, dekoder pogleda dva leva bita in če sta 11 (decimalno je to 3), dekoder ve da gre za dolgi naslov, sestavljen iz dveh bytov. Zato se mora pri MSB (=CV17) vedno postaviti dva leva bita (= prišteti 192) in od tu je omejitev na 14-bitno dolžino naslova.
Več o tem je v
https://sites.google.com/site/markgurri ... -addresses.
Rocova implementacija v z21 očitno predpostavi, da gre pri naslovih do 127 za kratke naslove ("Bei Lokadressen < 128 sind diese beiden höchsten bits ohne Bedeutung", torej brez pomena ... v dekoderjih so kratki naslovi zapisani v CV01). Dalo bi se ugotoviti, ali se lahko kljub temu uporablja dolgo naslavljanje z naslovom, nižjim od 128 (CV17=192, CV18<128), mislim pa, da ne.