Intel 8256 MUART

(skoro) neznámý všuměl



O integrovaném obvodu Intel 8256 jsem, přiznám se, neměl tušení, dokud se o něm nezmínil Roman Fulek na svém archeocomp blogu. A to jsem si bláhově myslel, že ty periferní intelácké obvody ze zlaté osmibitové éry znám více méně všechny. Jak se ukázalo, tak méně, než více. Pochopitelně se mě zmocnila nezvladatelná touha si s tímto čipem pohrát a tak jsem si ho musel pořídit taky:-) První, co mě při čtení číselného označení napadlo, bylo to, že se jedná o nějaké mírně modifikované dvojče k notoricky známému 8255. Takových dvojčat totiž existuje u Intelu několik: RIOTy 8155/8156, timery 8253/8254, nebo třeba CRT kontroléry 8275/8276. Ovšem 8256 je něco jiného. Spíše, než k 8255, má blíže k 8155 a jeho prefix 82xx je docela matoucí. Mělo by to být něco z řady 81xx, ale o tom až později.



Intel 8256 MUART



Obvod 8256 kombinuje funkcionalitu celé řady notoricky známých periferních obvodů. Dalo by se říci, že 8256 obsahuje v jednom pouzdře DIP 40 částečnou, plnou, nebo vylepšenou funkcionalitu těchto obvodů: 8255 (paralelní brány), 8251 (UART), 8253 (čítače/časovače) a 8259 (prioritní řadič přerušení). Díky tomu se označuje jako MUART - Multifunction Universal Asynchronous Receiver Transmitter. Obvod dále obsahuje záchytný registr adresy plněný signálem ALE a je tak určený ke spolupráci s procesory, jež mají multiplexovanou adresovou a datovou sběrnici. Konkrétně se jedná o CPU 8085, 8086/8088, 80186/80188 a také jednočipy řad x48 a x51. Dokonce obsahuje i konfigurační bit, kterým lze přepínat mód 8085 a 8086. Nicméně změna se týká pouze reakce na přerušení. Jinak se nic nemění a obvod je stále osmibitový:-)

Co tedy přesně 8256 MUART umí? Má dvě osmibitové paralelní brány P1 a P2. Brána P1 je multifunkční. Můžeme ji použít jako klasickou 8-bitovou bránu s tím, že každý jednotlivý bit lze nakonfigurovat jako vstup, či výstup. Dále lze jednotlivým pinům P1 přiřadit různé speciální fukce. Je toho moc a naleznete to v datasheetu. Bránu P2 lze také konfigurovat na vstup a výstup, jen už ne bitově, ale po čtveřicích bitů (nibblích). Pro bránu 2 lze též aktivovat tzv. handshake režim. Příslušné potvrzovací bity jsou pak automaticky definovány portu P1, viz datasheet. Každá brána má svůj 8-bitový registr, do kterého je možné zapisovat i z něj číst.

8256 dále obsahuje sériový kanál, který je v podstatě identický s obvodem 8251. Sériák je "double buffered" a obsahuje vlastní generátor přenosové rychlosti. Při dodržení taktu vnitřních hodin (1,024 MHz) je pak možné nastavit interní baud rate generátor až na rychlost 19.2 KBd. Je ovšem možné připojit vlastní generátory přenosových rychlostí a to dokonce pro RX i TX samostatně. Obvod disponuje příslušnými vstupy RXC a TXC a dále příslušným konfiguračním registrem. Poněkud chudší je výbava na HW řízení toku sériové komunikace. MUART disponuje pouze vstupem /CTS (Clear To Send). Ale kdo by se nějakým HW řízením toku zabýval, že... Pro SW řízení sériáku je k dipozici celá řada stavových a konfiguračních bitů.

Dalším funkčním blokem 8256 je blok čítačů/časovačů. Obsahuje celkem 5 identických 8-bitových timerů 1-5, z nich 4 lze spojit do dvou 16-bitových (2+4 a 3+5). Vstupním signálem timerů je interní kmitočet 1,024 MHz vydělený na hodnotu 1KHz (T=1ms) nebo 16KHz (T=62,5us), dle nastavení příslušného konfiguračního registru. Timery 2 a 3 nebo kaskády 2+4 a 3+5 lze provozovat i jako tzv. "event countery" se vstupy na pinech portu 1. Timery čítají kontinuálně a jen směrem dolů. Směr čítání nelze měnit. Nelze ani timery zastavovat či spouštět. Tikají prostě furt:-) Pochopitelně lze timery přednastavovat a povolovat jim přerušení, ale pozor! Přerušení je generováno při přechodu z 1 na 0 a po jeho vyvolání je nutné timer znovu přednastavit, jinak jede zase od FF (resp. FFFF)! Další zvláštností je, že při přednastavování 16-bitového timeru je nutné nejprve zapsat horní bajt a teprve poté dolní bajt. Zápis horního byte totiž automaticky nastaví dolní byte na 0FFh! Pokud nám toto nevyhovuje, můžeme dolní byte přepsat svou hodnotou. Při obráceném postupu se tedy dolní byte vždy nastaví na samé jedničky, byť jsme do něj předtím zapsali něco jiného! Jinak lze pochopitelně stav timerů v kterémkoliv okamžiku softwarově číst. Při čtení kaskády (16-bitů) je opět nutné nejprve číst horní byte a poté dolní. Čtením horního byte se totiž latchuje stav toho dolního.

Posledním hlavním blokem 8256 je prioritní řadič přerušení, zhruba odpovídající obvodu 8259. MUART dokáže generovat celkem 8 různých přerušení. 5x od timerů 1-5, 2x od UARTu (RxI a TxI) a 1x od vstupu EXTINT, který lze využít např. k řetězení od dalších zdrojů přerušení z jiných obvodů. Přerušení od timerů 2, resp. 5 lze softwarově nahradit přerušením od portů P1 (P1.7), resp. P2 (handshaking). Priority jednotlivých zdrojů jsou pevně dané. Nebyl by to MUART, aby zde nebyla opět nějaká zvláštnost. Tou je potřeba modifikovat dva různé registry pro povolení (reg. 05h) a zakázání (reg. 06h) jednotlivých zdrojů přerušení. Nevím jak je to u ostatních zdrojů přerušení, ale u časovačů je po vyvolání přerušení dané přerušení automaticky zakázáno a je nutné ho v obslužné rutině opět povolit. Při svých hrátkách jsem raději znovupovoloval přerušení i u jiných zdrojů.

Jak již bylo uvedeno výše, je možné obvod 8256 nakonfigurovat na mód 8085 nebo 8086. Rozdíl je v tom, že v módu 8085 při přerušení a následné aktivaci signálu /INTA procesorem MUART vystaví na datovou sběrnici kód instrukce RSTx, jež je kompatibilní s instrukční sadou CPU 8080/8085. V režimu 8086 se pak vystavuje vektor přerušení (40h - 47h) kompatibilní s 16-bitovými CPU 8086/88/186/188. Jednočipy X48 a x51 signál /INTA nemají, ale je možné ho vytvořit na nějakém volném portu a generovat jen softwarově při aktivaci přerušení. Data přečtená z MUARTu (RSTx, nebo vektor) je pak nutné zpracovat softwarově. Další možností je signál /INTA vůbec nepoužívat a při aktivaci přerušení si příslušný kód zdroje přečíst z registru INTERRUPT ADDR obvodu 8256. Čtení tohoto registru má stejný efekt, jako HW aktivace /INTA a tedy shazuje příznak přerušení a vývod INT. Jak vypadá stažený kód zdroje přerušení je popsáno v datasheetu. Neodpovídá to ani intsrukcím RST0 - RST7, ani vektorům 40 - 47h:-)

S obvodem 8256 jsem si pohrál prostřednictvím jednočipu 8051, konkrétně svého DUINa52. Nutno však přiznat, že připojení MUARTu k 8051 dává smysl jen pro testování. Jinak to smysl nemá, protože prakticky vše, co 8256 obsahuje, máme již v samotné 8051. Obvod 8256 jsem připojil jako externí RAM a tudíž jsem jej ovládal prostřednictvím standardní instrukce MOVX a automaticky generovaných signálů /RD a /WR. Signál /INTA jsem vytvářel programově na jednom z pinů portu P3. Signály /CS a Reset jsem spojil a připojil na jiný pin portu P3. Obvod 8256 je tak buď trvale resetován nebo uvolněn. Signál přerušení INT jsem zavedl do /INT0 8051 přes invertor (7404) a další invertor jsem použil k inverzi signálu z tlačítka (spínající na GND a s pullupem) na vstup EXTINT 8256. Jako zdroj hodin pro timery a baud rate generátor jsem použil ktystalový TTL oscilátor s doporučeným krystalem 3.072 MHz. MUART obsahuje nastavitelný prescaler abychom docílili doporučované interní frekvence 1,024 MHz. Popis připojení 8256 k 8051 je i ve zdrojovém kódu testovacího prográmku:


    Software pro 8051 a 8256



Vlastní test probíhá následovně: nejprve je na terminál pomocí UART 8256 odeslána uvítací hláška. Následně procesor očekává znaky, které vrací na terminál obalené hranatými závorkami. Stisknutím znaku @ echo režim končí, vypíše se závěrečná hláška a systém přejde na nekonečné čítání 0-255-0 na portu P2. Časování prodlevy má na svědomí kasdáda časovačů 3+5, jež vyvolává přerušení každých 255 ms. Aktivací externího přerušení EXTINT je čítání na P2 nulováno. Na následujících obrázcích je fotografie z průběhu testu MUARTu 8256 s mým DUINem52 a dále screenshot z Hyperterminálu:


Test 8256 MUART
Test 8256 s 8051
Test 8256 MUART
UART komunikace s 8256


Vyzkoušel jsem tedy jak základní operace s branami P1 a P2, tak sériovou UART komunikaci s Hyperterminálem při rychlostech 9,6 a 19,2 KBd. Pohrál jsem si s časovači jak v 8-bitovém, tak 16- bitovém režimu a ověřil přerušovací systém (přerušení od časovačů a EXTINT). Při aktivaci přerušení 8051 skočí na adresu obsluhy /INT0 (03h) a zde je nutné buď stáhnout kód přerušení pomocí signálu /INTA, nebo jej přečíst z registru. Následně je nutné zdroj přerušení správně dekódovat a zařídit jeho obsluhu. Vyzkoušel jsem obojí (/INTA i SW čtení) a obojí šlape skvěle. Vše funguje dle popisu v datasheetu, ale je pravdou, že někdy jsem musel číst i trochu mezi řádky:-)

Suma sumárum je 8256 MUART velice zajímavý obvod, byť je jeho označení trochu matoucí. Viděl bych to na 8157, nebo něco podobného. Ale to je fuk. Obvod toho umí opravdu hodně a to co dělat má, dělá fakt dobře. Přesto si nevybavuji žádné konkrétní nasazení 8256. Ale není se čemu divit. Co se týká počítačů s CPU 8086/88, tak těm se (zatím) nevěnuji a masový osobní či domácí počítač s 8085 taky neznám. Ale určitě byl nasazován v různých průmyslových řídících systémech. Zřejmě na trh přišel až později, jinak by se určitě objevil v Inteláckém SDK-85. Tam by pasoval jak prdel na hrnec:-) Nicméně není problém ho tam dodat. No a co se týká našeho rybníčku, tak je skoro povinností všech majitelů Romanova NCB 85 si 8256 MUART doplnit:-) Další možnosti skýtá třeba PMI-85, či BOB-85.



Literatura:

[1] Datasheet Intel P8256
[2] Archeocomp blog



RET



Odladěno na MS IE 8.0 a Firefoxu při rozlišení min. 1024 x 768 pixelů
www.NOSTALCOMP.cz    2010  -  2017