Railnet

Locobuffer trošku jinak

Elektronika | Zdeno Janeček, 28. 11. 2019 (73 zhliadnutí)

Starý Locobuffer už ma svoje odsloužené a má svoje mouchy. Za největší problém považuji neschopnost přenést víc než 32 bajtů v jednom balíku, kdy se stává, že bajty nad toto množství se prostě ztratí. Vyzkoušel jsem asi 10 podobných variant, včetně svých vlastních a nikdy jsem nebyl spokojený. Jedná se hlavně o časování, kdy zpoždění dosahuje velkých hodnot, dokonce až na úrovni celých paketů. Na tento problém jsem narazil, při budování zařízení s ovladačem zhlaví "Pultík", který nemá problém poslat i 50 paketu v řadě za sebou. Proto se to musí ošetřit jinak.

Další problém je nutnost optického oddělení, které odstraní zemnící a "jiné" smyčky.

Starý LocoBuffer ma omezený buffer a teda dokáže přijmout na vysílání jen určitý počet bajtů. Odhaduji to právě na těch 32 bajtů a potom se už bajty ztrácejí. Potíž je v tom, že bajty rychleji přicházejí, než je zařízení stačí odeslat. Například příjem 19200 Baudu a vysílání 16666 Baudu. A u kombinace 57600 na 16666 je to ještě horší. Hlavní problém spočívá v tom, že každý bajt je třeba přijmout cely a zařadit ho do fronty a potom ho odeslat. Tím dochází ku zpoždění, které se postupně nasčítává. Asi nejlepší převodník byl "16548" na 16666, teda MS-SH, který pracoval v toleranci 0.8% a teda byl bezproblémový. Je smutné, že tento přenosový kmitočet Wokna zrušily, protože práce s ním byla spolehlivá a blbuvzdorná.

Teda největší problém byl a bude, zásobník na přijímané a vysílané znaky. Našel jsem si obvod FT230XS, který má buffer 512 bajtů pro oba směry a to jsem pokládal za dostatečnou velikost. To je 128 paketů po čtyři bajty, (třeba s opcode B0h) a to musí stačit i na obrovské zhlaví, v reálném čase. Teda je splněný požadavek na podobnou spolehlivost jako u původního MS-SH.

Schéma:

Jednou z požadovaných vlastnosti je optické oddělení, protože spojení několika "Ground" neděla nikdy dobrotu a je zdrojem někdy těžko řešitelných problémů. Procesor Attiny25/45/85 je použitý z důvodu časování Loconetu, aby nedocházelo ku kolizím. S pomocí Attiny ovládáme CTS, pro vysílání od PC (USB).

Board a rozmístěni součástek

Deska je jednostranná, bez propojek a nastavovacích prvků. Nejvíce součástek si vzalo optické oddělení a změna úrovní pro Loconet a USB. Deska je pohled ze strany součástek.

Lze napsat, že nejdůležitější součástka je převodník UART/USB a to FT230XS. Je to SMD provedení a proto se s ním musí podle toho zacházet. Ale protože je jen jedna, dá se to zvládnout i s mýma mizernýma očima a s pomoci světelné lupy. Chce to jen pečlivost a v mém věku mít někde opřené ruce.

Procesor Attina25 má jen dvě úlohy a to zablokováni vysílání USB, při přijmu z Loconetu přes CTS a spočítání času pro povolení vysílání do Loconetu. Jako vždycky, všechno souvisí se vším, teda nic není až tak jednoduché. Sběrnice Loconet je jednodrát a vyžaduje, při rozděleni na příjem a vysílání, svoje podmínky. Teda je tam zrcadlení z vysílání do příjmu a to znamená, že se musí rozlišit, kdo vysílá. Pokud teda vysílá Loconet do USB, tak se nic nezrcadlí a MUSÍ se zablokovat vysílání USB pomocí CTS. V případě, že vysílá USB do Loconetu, tak se nesmi zablokovat CTS, protože některé zařízení přímo vyžadují zrcadlení, teda zpětný příjem. Ono je to vlastně správné, protože probíhá kontrola platnosti dat. Pro uvolnění vysílání USB, zhozením CTS, se musí splnit podmínka uplynutí času 800uS. Teda minimálně 10 bitů UARTu (600uS) a plus nějaká rezerva pro START bit dalšího vysílání, od poslední změny do "1" na Loconetu. Další podmínka je, že to MUSÍ být příjem od Loconetu. Teda zpětný příjem NESMÍ shodit CTS.

Loconet má tři úrovně priorit, teda asi 700uS až 1000uS pro PC, 1200uS až 1380uS pro centrálu a vyšší než 1560uS pro všechno ostatní. Tento čas se počítá od poslední změny úrovně do "1" na Loconetu.

Program je dost jednoduchý a pracuje jen přes přerušení.

Program je v Bascom Basic od Mselec.com.

Toto se dá pomocí COPY + PASTE přenést do Bascom a zkompilovat.

'------------------------------------------------------------------------------   '------------------------------------------------------------------------------   '--------- Program pro locobuffer na Attina 25/45/85 -----------   '------------------------------------------------------------------------------   '------------------------------------------------------------------------------    'zasobniky a jine nastaveni     $regfile = "attiny25.dat"     $crystal = 8000000     $hwstack = 16     $swstack = 16     $framesize = 8       'rozmisteni pinu:    'pin1 - /reset    'pin2 - portb.3 = TXD  , pouze sleduje    'pin3 - portb.4 = NC    'pin4 - Ground    'pin5 - portb.0 = /RTS    'pin6 - portb.1 = /CTS , jediny ovladaci prvek    'pin7 - portb.2 = RXD     'pin8 - Vcc                Ddrb = &B0_0010                     'PB1 = CTS      Portb = &B1_1111        'obslouzi preruseni od INT0, ktere indikuje prijem od Loconetu      Config Int0 = Rising                'hrana nahoru      On Int0 Prer0 Nosave      Enable Int0        'pocitani casu 800uS od posledni zmeny 0>1 na prijmu Loconetu      Config Timer0 = Timer , Prescale = 64 , Clear Timer = 1      On Oc0a Cas0 Nosave      Ocr0a = 100                          'cas 125nS * 64 * 100 = 800uS      Enable Oc0a        'obslouzi preruseni od PCINT.3, ktere indikuje prijem od USB      On Pcint0 Prer1 Nosave      Set Pcmsk.3      Enable Pcint0        'priznaky programu     'gpior0,0 = rozliseni mezi prijmem od Loconetu a USB        Enable Interrupts                     'povoleni vsech preruseni   '-------------------------------------------------------------------------------    'hlavni smycka programu   '-------------------------------------------------------------------------------      Do         ‚nekonečná smycka      Loop   '-------------------------------------------------------------------------------    'podprogramy obycejne   '-------------------------------------------------------------------------------   '-------------------------------------------------------------------------------    'podprogramy od preruseni   '-------------------------------------------------------------------------------   'protoze poradi obslouzeni preruseni jsou natvrdo zabudovane a   'INT0 je rychlejsi nez PCINT0,tak mame zabezpecene priority obslouzeni přerušeni.   'Nelze zapisat TCNT0=0, protoze to vola preruseni Timer0 a to tady neni vhodne .     Prer0:      sbis gpior0,0       cbi  portb,1                        'zakazani vysilani, /CTS       push  r20        ldi  r20,1                             'nemeni SREG        sts  tcnt0, r20                    'vynulovani citace 0       pop  r20     reti    '------------------------------------------      Prer1:       sbic  portb,1                       'preskok        sbi   gpior0,0      reti    '------------------------------------------      Cas0:       sbi   portb,1                       'povoleni vysilani, /CTS       cbi   gpior0,0      Return    '-------------------------------------------------------------------------------------------   

Program běží čisto přes přerušení, je to jednodušší a hlavně to zabezpečuje priority, které bych v hlavním programu těžko dosahoval. Ono právě rozlišení, odkud přišel signál, je klíčové a dá se to rozlišit jen časem. Teda pokud přijde signál dříve od Loconetu, tak se musí zablokovat vysílání USB přes CTS. Pokud přijde od USB, tak se neděje nic, je povolený zpětný příjem. Jako vždycky není problém nastaveni, ale vypínání.

Popis funkce: Převodník je udělaný úplně jinak, než je obvyklé. Teda signál se nenahrává do procesoru, ale jde ze vstupu na výstup napřímo. Teda něco "podobné" jako staré MS-SH. Co tam je jiné, je buffer na 2 x 512 byte, kde se ukládají údaje, pokud je přenos zablokovaný. A ten je zablokovaný jen tehdy, když se něco přijímá z Loconetu. Taky přenosová rychlost USB je někde úplně jinde a to na 12Mpps, teda jeden byte se přenese za 1-2uS a může se hned vysílat.

Je nutné nastavit provoz vstupu a vystupu FT230XS na 16666 Baudu. Je trošku problém, že toto umí jen jedna aplikace a to JMRI při použití rozhraní MS-100 v menu:

> PanelPro > Upravit > předvolby > Připojení a volba: Loconet

Tam se nastaví:

> Digitrax > Loconet MS100 > použitý port USB > DCS 100 (Chief)

Tím se nastaví automaticky přenosová rychlost 16000 Baudu, což je v normě do 1%.

Zařízení je naprosto spolehlivé, pokud od něho nechcete vyšší rychlost než je schopné přenést. Teda posílat trvale víc jak 1500 byte za vteřinu je opravdu nereálné.

Tři piny na kraji desky jsou pro měření a testování RxD a TxD.

Toto zařízení bylo vyvinuté pro soubor věcí pro ovládaní kolejiště pomocí programů TrainController a JMRI.

S jinými programy nemám zkušenosti a nemůžu garantovat funkčnost. Konstrukce je navrhnutá pro soubor projektu Pultík, ale může se používat i samostatně, za splnění podmínek pro napájení.

[Akt. známka: 0 / Počet hlasov: 0] -      + 

K tomuto článku nebol doposiaľ priradený žiadny komentár!

Pridať nový komentár