Pro spojení počítačů se v průmyslovém prostředí používá často sériové komunikační sběrnice podle standardu RS485. Jedná se o poloduplexní sběrnici, ve které je nutné řídit přepínání směru vysílání, resp. počítač by měl být na příjmu a pouze při snaze o vysílání musí přepnout svůj budič na vysílání.
U počítačů typu PC je sériové rozhraní realizováno obvodem UART 16C550, přičemž řada aplikací je napsána pro starší typ 16C450, který neobsahuje FIFO fronty. Nevýhodou tohoto obvodu ( a též 16C550 bez FIFO) je skutečnost, že nastavuje přerušení od vysílače v okamžiku vyprázdnění registru THRE do vysílacího posuvného registru, kde je převeden na sériová data a vysílán na linku. V praxi to znamená, že zapsáním znaku do THRE se nastaví přerušení od vysílače již v období vysílání start bitu zapsaného znaku. V případě posledního znaku zprávy musí uživatel (programátor) čekat, dokud se neodvysílá celý znak, aby mohl přepnout směr vysílání na příjem. Toto čekání se realizuje zpravidla dvojím způsobem:
a) čekací smyčkou a testováním 6.bitu registru LSR TEMT
b) aktivací samostatného časovače.
V prvním případě dochází k časovým ztrátám, v druhém (
pokud vůbec je volný čítač k dispozici ) ke komplikaci programu, zejména pokud má
být univerzální pro různou Baud rychlost.
Protože mě tento stav neuspokojoval, začal jsem detailně studovat katalogový list obvodu UART 16C550 a
našel jsem větu, kterou jsem si nedokázal přesně přeložit, ale která stála za
ověření. (cituji: „The Transmit FIFO Empty indications will be delayed … … when
the following occurs: THRE=1 and there have not been at least two bytes at the same time in the transmit FIFO
…“).
Testováním chování tohoto obvodu jsem zjistil, že skutečně za určitých podmínek dochází ke zpoždění přerušení na vhodnou dobu pro přepnutí RS485 z vysílání na příjem. Zkoušel jsem dva možné stavy:
a) posílat do THRE Byte s každým přerušením pouze jeden Byte, jako kdyby FIFO nebylo zapnuto a
b) „nasypat“ do THRE a FIFO najednou 10 Byte.
Zatímco v případě b) vzniklo přerušení ve stejný okamžik jako u starších verzí obvodu a tedy „nesprávně“ pro potřeby RS485, v případě a) došlo k posunutí přerušení o jeden znak minus poslední stop bit, přesně tak, jak je již srozumitelně uvedeno v manuálu. Toto posunutí je již postačující pro správné přepnutí vysílače na příjem.
Závěr:
Lze konstatovat, že vhodného generování přerušení vysílače UART 16C550 pro
potřeby RS485 můžeme dosáhnout aktivací vysílací FIFO fronty, ale současně
jejím nevyužíváním, tj. zapsáním pouze jednoho znaku. (Pozn.:
Nezapomeňte při čtení registru IIR vymaskovat zejména bity 6. a 7., které jsou v případě
FIFO nastaveny.)
PS: Pokud umíte smysluplně přeložit onu citovanou větu, uvítám váš názor. Fakticky je problém vyřešen, ale jazykově mi přesný překlad oné citace stále uniká.
Ing. Vladimír
Georgiev, CSc.
e-mail:vgeorgiev@volny.cz Autor absolvoval Fakultu elektrotechnickou ČVUT, od r. 1983 pracoval ve VÚAP Praha, od r. 1992 v VAP Ing s.r.o., po celou dobu se zabývá vývojem průmyslových řídicích systémů a komunikací. |