CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
Než přikročíme k výkladu další látky, zopakujme si některé důležité poznatky, které jsme poznali ve druhém a třetím ročníku a na kterých budeme v dalším výkladu stavět.
Bit je jednotka informace. S hlediska dvojkové soustavy lze také říci, že bit je jedno místo ve dvojkovém neboli binárním čísle. Je-li k disposici např. 8 bitů, pak lze vytvořit 28 možností neboli znázornit čísla v rozmezí 0-255.
Byte je 8 bitů. Vyšší jednotkou je 1 kB (1 kilobajt=1024B=210B), dále 1 MB (1 megabajt), což je 220B=1048576B a konečně 1GB (=230B=1073741824B). Obdobně existují kilobity, megabity a gigabity.
Osmičková (oktalová) soustava má cifry 0,1,2,3,4,5,6,7 a pro převod do dvojkové soustavy platí, že jedna cifra v osmičkové soustavě se vyjádří třemi bity v soustavě dvojkové.
Šestnáctková (hexadecimální) soustava má cifry 0,1,2,3,4,5,6,7,8,9,A,B,C.D,E,F a pro převod do dvojkové soustavy platí, že jednu cifru v šestnáctkové soustavě lze vyjádřit čtyřmi bity v soustavě dvojkové.
BCD-kód je dvojkově zakódovaná desítková (dekadická) soustava. Jedna cifra dekadické soustavy je zde vyjádřena čtyřmi bity. Tyto čtyři bity mohou vytvořit šestnáct kombinací, ale použito je zde pouze deset z nich.
Kód 1 z n je kód, kdy na všech drátech kromě jednoho je logická 1 a na zbývajícím je logická nula.
ASCII kód prezentuje všechny znaky klávesnice jako osmibitové číslo.
Grayův kód se vyznačuje tím, že při inkrementaci čísla (zvětšení o 1) nebo při dekrementaci (zmenšení o 1) se vždy mění pouze v jednom bitu.
Zkusme si zde nyní ukázat srovnání jednotlivých kódů:
Dekadicky Binárně Hexadecimálně Oktalově BCD-kód Grayův kód
00 00 0000 0000 00000
01 01 0000 0001 00001
02 02 0000 0010 00011
03 03 0000 0011 00010
04 04 0000 0100 00110
05 05 0000 0101 00111
07 07 0000 0111 00100
08 10 0000 1000 01100
09 11 0000 1001 01101
0A 12 0001 0000 01111
0B 13 0001 0001 01110
0C 14 0001 0010 01010
0D 15 0001 0011 01011
0E 16 0001 0100 01001
0F 17 0001 0101 01000
10 20 0001 0110 11000
11 21 0001 0111 11001
12 22 0001 1000 11011
13 23 0001 1001 11010
14 24 0010 0000 11110
15 25 0010 0001 11111
16 26 0010 0010 11101
17 27 0010 0011 11100
Počítač používá dvojkovou soustavu. Sčítání je obdobné sčítání v desítkové soustavě včetně přičtení případného přenosu ke sčítancům ve vyšším řádu. Odečítání si převádí na přičtení dvojkového doplňku. Násobení se realisuje jako opakované sčítání a dělení jako opakované odečítání. Níže je uveden příklad sečítání dvou čtyřbitových čísel, vytvoření dvojkového doplňku a odečítání:
Převod na dvojkový doplněk
+1110 +14 -0101 1 1011 - 5
27 1011 1 0111 7
Je asi třeba pro méně zdatné žáky dodat, že pokud výsledek má více bitů než čtyři, pak přebytečné bity se ztratí – vypadnou.
Převody mezi jednotlivými soustavami již byly částečně naznačeny výše. Zopakujme si tedy ještě jednou, že převod z dvojkové soustavy na soustavu osmičkovou se uskuteční tak, že z nejnižších tří bitů vytvoříme cifru nejnižšího řádu, z dalších tří bitů vytvoříme cifru vyššího řádu atd. U šestnáctkové soustavy je to obdobné, jen s tím rozdílem, že bereme vždy čtyři bity. Zpětný převod z osmičkové soustavy na dvojkovou či ze šestnáctkové na dvojkovou se uskutečňuje opačným postupem. Převod dekadického čísla na BCD-kód a naopak je obdobný: jedna dekadická cifra se vyjádřuje čtyřmi bity a naopak: čtyři bity představují jednu dekadickou cifru. Převod z dekadické soustavy na binární se děje opakovaným dělením dekadického čísla číslem 2 a jednotlivé zbytky po dělení nám představují bity postupně od nejnižšího až k nejvyššímu. Dělení skončíme až podíl je nula. Převod z binárního čísla na číslo dekadické uskutečníme tak, že jednotlivé bity násobíme jejich vahou a součiny sečteme. Uveďme si příklad převodu dekadického čísla na binární a naopak:
14110 =?2 141:2=70 1 zbytek
70:2=35 0
35:2=17 1 14110=100011012
17:2=8 1
8:2=4 0
4:2=2 0
2:2=1 0
1:2=0 1
Jeden bit může nabývat hodnoty 1 nebo 0. Tuto hodnotu můžeme chápat s hlediska ryze matematického, což jsme si výše probrali. Je však možno těmto hodnotám přiřadit hodnoty logického počtu a to tak, že jednička je tzv. logická jednička (true-pravda), kdežto nula bude tzv. logickou nulou (false-nepravda). Zopakujme si, že tyto hodnoty označujeme někdy H a L, dále že neurčitý stav označujeme X a konečně že stav odpojení výstupů označujeme jako třetí stav.
Jak víme, vztahy mezi logickými proměnnými se zabývá t. zv. Booleova algebra. Zopakujme si alespoň její základní vztahy a taktéž základní funkce NOT, AND, OR, NAND, NOR, Ex – Or.
Ve druhém ročníku jsme poznali, že jakoukoli funkci, danou logickou tabulkou, lze realisovat pomocí hradel. Zkusme si realisovat jeden takový příklad. Funkce tří vstupních proměnných A, B, C a jedné výstupní proměnné Y je zadána následující tabulkou. Jak je zřejmé, jde o funkci ekvivalence pro tři proměnné.
_ _ _
A B C Y Y=A.B.C+A.B.C
0 0 1
S použitím De Morganova pravidla upravíme:
1 0 0
0 1 0 Y=A.B.C . A.B.C
1 1 0 a realisujeme:
Zkusme si v této souvislosti procvičit Karnaughovu mapu. Poznamenejme ovšem současně, že pomocí Karnaughovy mapy lze sice realisovat jakoukoli logickou funkci, avšak je nutno vždy zvážit, nelze-li téhož efektu dosáhnout i jinak a jednodušeji (např. vhodně naprogramovanou pamětí). V Karnaughově mapě používáme symboly 1, 0 a X, jejichž význam jsme si již zopakovali.
Ve druhém ročníku jsme poznali pojmy logický zisk, šumová imunita a zpoždění. Zopakujme si, že logický zisk je počet vstupů, které lze připojit na jeden výstup, šumová imunita že je maximální amplituda šumového napětí, které ještě nenaruší činnost logického obvodu a konečně že zpoždění je doba, která uplyne od změny logické úrovně napětí na vstupu do odezvy na výstupu.
Jak již víme, základní logické funkce lze realisovat pomocí diod, tranzistorů a odporů popřípadě pomocí přepínačů, relé apod. V současné době je však nejobvyklejší způsob pomocí integrovaných obvodů. Ve druhém ročníku jsme poznali, že existují integrované obvody pro číslicovou techniku používající technologii TTL a obvody vyrobené technologií C-MOS. V této souvislosti jsme poznali zapojení TTL obvodů s otevřeným kolektorem a rovněž jsme probrali způsob, jak obvody C-MOS vytvářejí třetí stav na svém výstupu. Dále byl probrán vliv nezapojeného vstupu u TTL i C-MOS a také velikost odporů, které lze zapojit na vstup či na výstup.
Probráno bylo správné kreslení schematických značek i sběrnicový způsob kreslení složitějších schemat. Zopakujme si to, protože při probírání složitějších zapojení s mikroprocesory se s takovým způsobem kreslení budeme často setkávat.
Jako poslední část jsme poznali poměrně složité kombinační obvody a to multiplexery, demultiplexery, dekodéry 1 z N , převodníky kódů, půlsčítačku a plnou sčítačku. Vzhledem k tomu, že hlavně poslední dva jmenované obvody mají své uplatnění v mikroprocesorové technice, je na místě si zopakovat i tyto obvody.
Ve třetím ročníku jsme získali další poznatky. Poznali jsme, co je to monostabilní klopný obvod, bistabilní klopný obvod, astabilní klopný obvod a Schmidtův klopný obvod. Z bistabilních klopných obvodů jsme poznali R-S klopný obvod, D-klopný obvod (MH 7474, MH 7475), J-K klopný obvod (MH 7472). Zopakujme si, jak tyto obvody pracují, na kterou hranu klopí a jaké průběhy nacházíme na jejich výstupech. A dále si zopakujme i to, že existují D-klopné obvody dynamické i statické, že z D-klopných obvodů lze sestavit posuvný registr, kruhový registr a střadač informace (LATCH). Nezapomeňme rovněž na monostabilní klopný obvod UCY 74123, na vytvoření astabilního klopného obvodu ze dvou monostabilních klopných obvodů a na ošetření mechanických kontaktů pomocí obvodu R-S.
Jednou z nejobsáhlejších kapitol ve třetím ročníku byly čítače. Začali jsme děličem kmitočtu dvěma osazeným obvody D či J-K, dále děličem kmitočtu v libovolném poměru, dále jsme přešli k čítačům osazeným těmito obvody, a poznali jsme princip přednastavení a zkracování cyklu. Vysvětlili jsme si pojmy čítač dekadický, binární, asynchronní, synchronní, čítač vpřed a čítač vratný. Všechny tyto pojmy jsme si vysvětlili na konkretních čítačích MH 7490, MH 7493, MH 74192, MH 74193. Zde jsme si rovněž procvičili zkracování či prodlužování cyklu jakož i přednastavení. Zkusme si tyto dovednosti znovu procvičit.
Jako předzvěst toho, co nás čeká ve čtvrtém ročníku jsme se letmo zmínili o aritmeticko-logické jednotce MHB 4581. S ALU se budeme podrobněji zabývat letos.
V tomto školním roce se nám budou rovněž hodit, znalosti o pamětech. Zopakujme si tedy, že paměti dělíme na volatile memory a nonvolatile memory, dále že existují paměti RAM a ROM, že paměti RAM mohou být statické či dynamické, že paměti ROM mohou být typu PROM, EPROM, EEPROM. Připomeňme si, jaká je vnitřní struktura těchto jednotlivých druhů pamětí a jaké jsou jejich vlastnosti a použití.
Ve třetím ročníku jsme se setkali s dalšími užitečnými pojmy z oblasti pamětí. Je to délka slova, kapacita paměti a doba přístupu. Stojí za to si zopakovat, že kapacita paměti se udává v bitech, kilobitech, megabitech anebo bajtech, kilobajtech, megabajtech či gigabajtech. Vztah mezi počtem bitů adresy m, počtem bitů ve slově p a kapacitou paměti M (v bitech) je dán vzorcem M=2m.p .
Jako další poznatek, který v tomto ročníku uplatníme, jsme poznali způsob zapojování několika pamětí na sběrnici. Rovněž jsme poznali různé možnosti i jiného uplatnění pamětí než jenom v oblasti počítačů. Připomeňme si v této souvislosti použití vhodně naprogramované pamětí jako náhradu logické sítě.
Pro praxi důležitý byl poslední úsek učiva a to optoelektronika. Poznali jsme různé druhy luminiscenčních diod a také způsob jejich zapojení a výpočtu prvků obvodů. Poznali jsme některé zobrazovací prvky na principu LED. A konečně jsme se zmínili i o zobrazovačích s tekutými krystaly a o optoelektronických vazebních prvcích (optronech).
Než tedy přikročíme ke studiu dalších poznatků, tentokrát z oblasti mikroprocesorů, zopakujme si podrobně dosavadní poznatky.
V roce 1949 byl uveden do provozu první elektronický počítač ENIAC (Elektronic Numerical Integrator And Calculator). Měl 18000 elektronek, vážil 30 tun, zaujímal plochu 135m2, dokázal vykonat 300 instrukcí za sekundu. Jeho autor – John von Neumann – použil níže nakreslené blokové schema, které po něm používali i další konstrukteři počítačů.
Paměť
ALU
|
Činnost tohoto počítače je možno vysledovat z výše nakresleného blokového schematu. Srdcem je řídící jednotka, která si vybírá z paměti postupně jednu instrukci za druhou. Tyto instrukce jsou, jak později poznáme, ve tvaru binárních čísel. Řídící jednotka každou instrukci dekóduje a pak ji buď sama vykoná nebo jejím vykonáním pověří aritmeticko-logickou jednotku (ALU=arithmetic-logic unit). Pokud by instrukce nařizovala vstup či výstup dat, pak se tato operace uskuteční prostřednictvím vstupně-výstupních obvodů (I/O – input/output). O aritmeticko-logické jednotce, řídící jednotce i o I/O obvodech pojednáme později podrobněji. S hlediska dalšího výkladu však je nutno se zmínit o paměti. Ta je v tomto schematu jediná a nerozlišuje se ani z hlediska uloženého obsahu (data či program) ani z hlediska konstrukce (RAM či ROM). Adresace je jediná a je možné, aby počítač při jedné aplikaci měl v jedné části paměti uložena data, zatímco při jiné měl v téže části uložen program.
Jiné blokové schema počítače nabízí t. zv. Harvardské rozložení:
Jak je vidět, výše nakreslené blokové schema se od von Neumannova liší tím, že paměť je zde rozdělena na paměť dat a napaměť programu. To umožňuje, aby řídící jednotka současně používala paměť dat i paměť programu a což může urychlit běh programu. Poznamenejme ještě, že von Neumannovo rozložení používá např. mikroprocesor 8080, který má jedinou paměť s adresami 0000H-FFFFH. Naproti tomu Harwardské rozložení používá např. mikroprocesor 8051, který má paměť programu ještě rozdělenu na vnitřní s adresami od 0000H do 0FFFH a vnější paměť s adresami 1000H-FFFFH. Mimo to má ještě paměť dat, jejíž adresy jsou v rozmezí 00H-FFH.
Dříve než přejdeme v dalším výkladu k aplikaci právě získaných poznatků na mikroprocesor, řekněme si něco z historie mikroprocesorů. Jako první mikroprocesor se označuje mikroprocesor fitmy Intel, který pod názvem Intel 4004 v roce 1971 uvedla tato firma na trh. Lze říci, že tento mikroprocesor vznikl jako vedlejší produkt. Firma Intel dostala zakázku od japonské firmy Busicom na vývoj sady čipů pro programovatelné kalkulátory. Pracovník Intelu Tedd Hoff navrhl nové řešení, kdy jeden čip (mikroprocesor) dokázal modifikovat svoji činnost podle toho, jaký obsah měla připojená paměť. Nebylo tedy třeba vyvíjet celou sadu čípů, ale stačilo vždy jen změnit obsah paměti, aby se změnila funkce obvodu. Mikroprocesor Intel 4004 obsahoval 2300 tranzistorů, jeho výkon byl srovnatelný s počítačem ENIAC (v té době 60 000 operací za sekundu), byl čtyřbitový, vyrobený technologií P-MOS, špatně slučitelný s TTL obvody a jeho cena byla 200 dolarů.
V následujícím roce 1972 byl na trh uveden mikroprocesor I 8008, který již byl osmi0bitový, vyroben však byl opět technologií P-MOS. Kvalitativním posunem byl mikroprocesor I 8080 uvedený na trh v roce 1974, který byl již vyroben technologií N-MOS. Tento mikroprocesor byl desetkrát rychlejší a byl osmibitový. O tomto mikroprocesoru pojednáme podrobněji později.
Tedd Hoff po odchodu z firmy Intel si založil svoji vlastní firmu Zilog a ta uvedla na trh v roce 1976 mikroprocesor Z 80. Ten je stejně tak jako I 8080 osmibitový, ale v některých parametrech jej předčí. Nezanedbatelnou výhodou je tu jediné napájení.
Pro historii vývoje mikroprocesorové techniky je významný rok 1980, kdy byl na trh uveden jednočípový mikroprocesor Intel 8051. Tento mikroprocesor má ve svém pouzdře i paměť programu. Více o tomto mikroprocesoru bude uvedeno ve zvláštní kapitole.
V roce 1982 se objevil na trhu mikroprocesor I 80286, který byl používán v osobních počítačích stejně tak jako jeho následovníci (I 80386, I 80486, Pentium).
Mikroprocesor se někdy nazývá CPU (central processing unit). Podívejme se nyní na jeho vnitřní strukturu a porovnejme ji s dosud získanými poznatky:
Dekodér instrukcí
přerušení (interrupt)
reset
Jak vidíme, je schema vnitřní struktury mikroprocesoru proti klasickému von Neumannovu schematu poněkud modifikováno. Vyjděme nejprve od těch částí, jejichž obdobu bychom našli ve von Neumannově schematu. Předně je zde paměť programu, z níž si bere dekodér instrukcí (u von Neumanna řídící jednotka) jednotlivé instrukce a jejich plněním pověřuje ALU. Do dekodéru instrukcí však vedou ještě další dva dráty. Drát zvaný reset dává pokyn k nastavení mikroprocesoru do definovaného výchozího stavu, drát přerušení zase dokáže vyvolat přerušení probíhajícího běhu programu a odskok na obsluhu přerušení. Obojí bude podrobněji vysvětleno později. Na ALU jsou připojeny I/O obvody, aby mikroprocesor mohl komunikovat s okolím. Dále jsou na ALU připojeny registry, tj. programem snadno dostupné paměťové buňky, mezi nimiž výsadní postavení zaujímá registr A t. zv. akumulátor. ALU rovněž ovládá jednobitové registry tzv. flagy. Tyto jednobitové paměťové buňky zaznamenávají existenci nějakého jevu (např. že výsledek předchozí operace je nula). Podle obsahu flagů může v některých případech dekodér instrukcí měnit běh programu. Zbývá poslední blok, označený SP. Je to stack pointer, registr, v němž je uložena adresa paměťové buňky, na níž je uložena návratová adresa. Návratová adresa je adresa instrukce, u které běh programu skončil před příchodem přerušení.
Toto blokové schema je samozřejmě velmi hrubé a neposkytuje možnost vysvětlit další důležité pojmy. Přesto nám dává alespoň hrubou představu a lze na něm vysvětlit alespoň ty nejzákladnější pojmy.
Proberme si nyní poněkud podrobněji aritmeticko-logickou jednotku (ALU) a řídící jednotku respektive dekodér instrukcí a to s hlediska jejich činnosti. Při tom současně osvětlíme činnost dalších – spolupracujících – částí mikroprocesoru. Začněme tím, že mikroprocesor je uveden signálem RESET do výchozího stavu. V tom okamžiku je vynulováno či uvedeno do definovaného stavu více klopných obvodů nebo čítačů, které mikroprocesor obsahuje. Podrobněji o tom pojednáme až budeme probírat konkretní mikroprocesory, protože u každého je to trochu jiné. Věnujme svoji pozornost tomu, co je všem společné a to je vynulování čítače instrukcí (program counter = PC). Tento registr obsahuje adresu, na které leží právě prováděná instrukce. (Poznamenejme, že instrukce jsou ve formě binárních čísel uloženy v paměti) Po provedení instrukce je tento registr zpravidla inkrementován a je prováděna další instrukce, po jejím provedení je znovu inkrementován atd. Po vynulování signálem RESET je tedy vzápětí prováděna instrukce na adrese 0000. Dekodér instrukcí nejprve zjistí, co mu daná instrukce přikazuje a pak ji buď provede sám nebo jejím provedením pověří např. ALU. Řekněme si, že některé instrukce nezabírají pouze jednu paměťovou buňku (t. zv. jednoslovné instrukce), nýbrž mohou zabírat dvě i více buněk v paměti. V tom případě se po provedení takové instrukce zvýší obsah PC o více než o jednu. Instrukce, které mohou existovat, se liší podle jednotlivých mikroprocesorů. Uveďme si zde jako příklad některé nejběžnější. Je to v prvé řadě instrukce NOP (nonoperacion =nedělej nic). Po této instrukci PC prostě přejde na další adresu aniž provede jakoukoli akci. Jinou instrukcí je inkrement či dekrement. Touto instrukcí je zvětšen o 1 respektive zmenšen o 1 obsah některého registru nebo i paměťové buňky. Další typickou instrukcí je nepodmíněný skok. Při provedení této instrukce je obsah PC změněn, takže program nepokračuje na následující adrese, ale na adrese, která je dána programově. Naproti tomu instrukce podmíněného skoku je poněkud složitější. Po jejím provedení může program pokračovat na následující adrese anebo na adrese jiné, dané programem. Na které adrese bude program pokračovat je dáno splněním nebo nesplněním nějaké podmínky (např. že výsledek předchozí operace se nerovná nule). Splnění či nesplnění této podmínky si mikroprocesor testuje zpravidla pomocí příslušného flagu. Podmíněným skokem také začíná tzv. přerušení (interrupt). Tehdy zpravidla na popud z vnějšího zdroje je přerušen běh programu a dojde k odskoku na předem vyhrazenou adresu obsluhy přerušení. Na této adrese začíná program, který obslouží přerušení a po jeho skončení se procesor vrací zase do původního programu. Aby bylo zřejmo, kde program bude pokračovat, uloží si mikroprocesor do jedné či více paměťových buněk t. zv. návratovou adresu. Adresu paměťové buňky, v níž je uložena návratová adresa si mikroprocesor uloží do registru zvaného stack pointer (SP). Poznamenejme, že po příchodu signálu RESET, je rovněž i SP přednastaven na předem určené číslo a že toto přednastavení je možno programem změnit.
Pokud jde o ALU, instrukce využívající tuto jednotku budou buď sčítání dvou binárních čísel anebo provedení nějakého logického úkonu. Většina takových instrukcí využívá pro uložení alespoň jednoho binárního čísla, se kterým bude ALU pracovat, registru A. Rovněž výsledek se zpravidla ukládá do registru A. Příkladem takových instrukcí může být např. instrukce inverse všech bitů čísla uloženého v registru A, posun všech bitů v registru A o 1 vpravo, rotace vlevo, výměna čtveřic bitů v registru A atd. Je zde na místě poznamenat, že např. osmibitový mikroprocesor v případě aritmetických operací bere obsah paměťové buňky jako osmibitové binární číslo, v případě logických operací tento obsah chápe jako osm samostatných bitů. Jestliže by např. v akumulátoru bylo uloženo binární číslo 1110 0011 a v registru R0 byl obsah 1001 0110, pak v případě instrukce logického součtu bychom dostali jiný výsledek než v případě aritmetického sčítání:
Obsah registru R0 1001 0110 1001 0110
Obsah akumulátoru A 1110 0011 1110 0011
logický součet (OR) 1111 0111 1 0111 1001 aritmetický součet
Přenos (Carry)
Povšimněme si, že součet dvou osmibitových čísel může být číslo devítibitové. Tento devátý bit by musel vypadnout, což někdy je možno akceptovat, ale jindy je nutné tento bit zachovat. K tomu účelu mají mikroprocesory jednobitovou paměťovou buňku označenou jako C (carry), do níž je v případě „přetečení“ akumulátoru uložena jednička. Tento bit se používá jako flag (příznak). Těchto flagových buněk bývá více a jejich obsah se může po provedení instrukce změnit podle výsledku operace.
Jak již bylo řečeno obstarávají I/O obvody styk mikroprocesoru s okolím. Někdy může jít jen o výstupní či vstupní bránu, kudy vystupují či vystupují data. Většinou však jde o tak zvané obousměrné brány, které mohou být podle poptřeby vstupní nebo výstupní. Je však třeba poznamenat, že zatižitelnost těchto výstupů bývá malá, a proto v některých aplikacích se používá pro zlepšení vlastností I/O obvodů obousměrných zesilovačů. Jim bude věnována samostatná kapitola.
Podívejme se na mikroprocesor s hlediska softwarového a vysvětleme si některé důležité pojmy, které v dalším výkladu budeme potřebovat.
Instrukční soubor je sada instrukcí, které procesor rozpozná a je schopen je provést. Každý mikroprocesor má svůj instrukční soubor s různým počtem instrukcí.
Adresovací prostor je počet adres v paměti, který je mikroprocesor schopen naadresovat. Udává se např. v počtu kiloslov. Počet adres se dá odvodit z počtu adresovacích vodičů.
Strojní kód (machine code) je program vyjádřený zcela elementárním způsobem jako posloupnost binárních čísel. Pro člověka nesrozumitelný, pro stroj přímo proveditelný. Programy s koncovkou .EXE a .COM obsahují strojní kód.
Assembler je programovací jazyk nejnižší úrovně. Je tvořen symboly, kterým odpovídají kódy strojního kódu. Každý procesor má svůj Assembler (Assembly language).
Assembly program je překladač z assembleru do strojního kódu. Počítač dokáže přeložit program napsaný ve assembleru do strojního kódu, někdy dokáže dokonce napodobit chování mikroprocesoru a program nejenom přeložit, ale i vykonat jednotlivé instrukce a popřípadě i upozornit na chyby a umožnit programátorovi odladit program.
Instrukce se skládá z operačního kódu (druh operace) a z operandu (1 či více). Operand může být hodnota či adresa. Příkladem může být např. instrukce ADD A, #13H. Je to instrukce z instrukčního souboru mikroprocesoru MHB 8051 a její význam je tento: přičti hexadecimální číslo 13 k obsahu registru A (akumulátoru) a výsledek ulož opět do akumulátoru. Operační kód je v tomto případě ADD A, operand je 13H. Jiným příkladem může být instrukce JTF B4H z instrukčního souboru mikroprocesoru MHB 8048. Zde je operační kód JTF a operand B4H. Význam je tento: je-li příznakový bit (flag) roven logické jedničce, provádí se skok na adresu B4H, jinak program pokračuje další instrukcí.
Je nutno připomenout, že existují i vyšší programovací jazyky, které lze rovněž přeložit i do strojního kódu.
Zkusme se podívat blíže na běh programu. Jak jsme si již řekli, po příchodu signálu RESET se mikroprocesor nastaví do výchozího stavu. To znamená, že se čítač instrukcí PC nastaví na adresu 0000 a obsahy některých registrů na definovanou výchozí hodnotu. Po doznění signálu RESET začne mikroprocesor postupně vykonávat jednotlivé instrukce počínaje adresou 0000. Jak již bylo řečeno, po vykonání instrukce se PC inkrementuje a mikroprocesor začne vykonávat další instrukci. Je samozřejmé, že pokud má instrukce dvě slova zvýší se obsah PC o 2, má-li instrukce 3 slova, zvýší se obsah PC o 3. To, co bylo zde uvedeno, však neplatí, jestliže mikroprocesor vykonává instrukci skoku a to jak podmíněného, tak nepodmíněného. Pak se obsah PC změní v případě nepodmíněného skoku vždy, v případě podmíněného skoku v případě splnění podmínky a to podle příslušného operandu.
Někdy se stane, že některá část programu se mnohokrát opakuje. Pak je na místě použít takzvaného podprogramu. Je to část programu, která je zpravidla umístěna na konci programu a která je mnohokrát používána. Při běhu programu v okamžiku, kdy je třeba použít podprogram, použije se tak zvané volání podprogramu (instrukce CALL). Program po této instrukci pokračuje první instrukcí podprogramu a mikroprocesor si uloží návratovou adresu na adresu, která je uložena v registru SP (stack pointer). Jak je vidět, instrukce CALL je dost podobná přerušení. Zde se nehovoří o podprogramu, nýbrž o programu obsluhy přerušení. Na konci podprogramu či programu obsluhy přerušení musí být instrukce návratu – return. Tato instrukce znamená, že se obsah PC přepíše návratovou adresou a mikroprocesor se vrátí k instrukci, u které skončil před příchodem přerušení respektive k instrukci následující po instrukci CALL. Někdy se stane, že přerušení je přerušeno přerušením vyšší priority anebo že při běhu podprogramu narazí procesor opět na instrukci CALL. Pak se opět uloží návratová adresa na adresu následující a obsah SP zvýší tak, aby SP ukazoval na poslední návratovou adresu. Po ukončení podprogramu respektive obsluhy přerušení se program vrátí tam, kam mu přikazuje poslední návratová adresa a obsah SP se sníží tak, aby ukazoval na aktuální návratovou adresu. Jde zde o tak zvaný sklípkový registr neboli registr LIFO (last in – first out).
Velmi často jsou používány tzv. cykly. Jde o to, že někdy je třeba některou část programu mnohokrát zopakovat. Zpravidla se to provádí tak, že do některého registru se uloží počet opakování a po provedení inkriminované části programu se obsah registru dekrementuje (zmenší o 1) a pak, pokud obsah registru není roven 0, se cyklus opakuje, je-li roven nule, pak se běh programu posune dál.
V osmdesátých letech se objevily na trhu tzv. jednočípové mikroprocesory. Jsou to mikroprocesory, které ve svém pouzdru obsahují paměť programu a to buď typu ROM či EPROM. Jak je zřejmé, jednočípové mikroprocesory s pamětí typu ROM jsou vyrobeny na zakázku odběratele, který musí výrobci dodat data, která mají být v paměti programu. Naproti tomu jednočípové mikroprocesory s pamětí EPROM si může uživatel sám naprogramovat podle vlastního uvážení a v případě potřeby si obsah může vymazat a nahradit jiným. Někdy výrobce nabízí mikroprocesor, který je shodný s jednočípovým mikroprocesorem, ale nemá vnitřní paměť programu a tudíž musí použít vnější paměť programu. Zde je ovšem nutno poznamenat, že i jednočípový mikroprocesor, který obsahuje paměť programu, může použít vnější paměť programu. Dokonce je možné obě paměti programu, vnější i vnitřní, zkombinovat. Vzhledem k tomu, že vnitřní paměť programu je zpravidla menší než je adresovací prostor mikroprocesoru, je zpravidla výhodné použití vnitřní paměti jen tehdy, vejde-li se do ní celý program. V případě, že je program rozsáhlejší, je výhodnější použití vnější paměti. Pokud má jednočípový mikroprocesor Harvardskou strukturu, pak obsahuje i paměť dat. Tato paměť však nebývá příliš rozsáhlá, a proto je zde rovněž i možnost vnější paměti dat, která je typu RAM. Podrobněji o připojení vnějších pamětí bude pojednáno až budou probírány konkretní mikroprocesory.
Proberme si nyní tzv. sběrnice. Sběrnice (bus) je skupina vodičů, které jsou určeny pro komunikaci mezi mikroprocesorem a ostatními základními částmi mikropočítače. Sběrnice mají u různých mikroprocesorů různý počet vodičů a tento údaj je označován jako šířka sběrnice a udává se v bitech.
Sběrnice může být adresová, datová nebo řídící. Adresová sběrnice je jednosměrná, to znamená že po ní jdou adresy od mikroprocesoru k adresovým vývodům paměti a nikoli opačným směrem. Je-li počtu bitů v adresové sběrnici N, pak adresový prostor má 2N slov. Naproti tomu datová sběrnice je obousměrná., což znamená, že jednou po ní jdou data z mikroprocesoru a po druhé naopak do mikroprocesoru. Podle šířky datové sběrnice říkáme, že mikroprocesor např. osmibitový či šestnáctibitový a že slova, uložená v paměti programu jsou osmi- či šestnácti-bitová. Pokud jde o sběrnici řídící, zde jsou některé vodiče jen vstupní kdežto jiné pouze výstupní a konečně některé obousměrné. Z konstrukčních důvodů jsou u některých mikroprocesorů některé vývody využity pro několik funkcí.
Jak již bylo uvedeno výše, v roce 1974 uvedla firma Intel na trh mikroprocesor I 8080. U nás se tento mikroprocesor vyráběl pod označením MHB 8080A. Nákres jeho pouzdra a rozmístění vývodů je nakresleno níže:
A10 A11 Uss=0V A14 D4 A13
D5 A12
D6 A15
D7 A9
D3 A8
D2 A7
D1 A6
D0 A5
UBB =-5V A4
RESET A3
HOLD Upp=+12V
INT A2
A1
INTE A0
DBIN WAIT WR Ready SYNC Ф1 Ucc +5V HLDA
1______ _____40
2______ ______39
4______ ______37
5______ ______36
6______ ______35
7______ ______34
9______ ______32
10______ ______31
11______ ______30
12______ ______29
13______ ______28
14______ ______27
15______ ______26
16______ ______25
17______ ______24
18______ ______23
19______ ______22
20______ ______21
Osvětleme si funkci některých vývodů:
A0-A15 – adresovací vodiče, address bus, výstupní
D0-D7 – datové vodiče, data bus, obousměrné, třístavové
Ф1, Ф2 – dvojfázové hodiny, vstupní
HOLD – žádost o HOLD, vstupní
INT – žádost o přerušení, vstupní
INTE – povolení přerušení, výstupní
WAIT – stav čekání, výstupní
Jak vidíme, některé vývody patří do adresové sběrnice, jiné tvoří datovou sběrnici a další jsou součástí řídící sběrnice. V dalším se budeme vývody mikroprocesoru zabývat podrobněji.
Než přikročíme k popisu funkce mikroprocesoru, uveďme si některé důležité parametry:
Teplota prostředí při činnosti: 0-70oC
Skladovací teplota: -65-150oC
Příkon: 1,5W
Napájecí napětí:
UDD = +12V proud 40mA, maximálně 70mA
UCC= +5V proud 60mA, maximálně 80 mA
UBB= -5V proud 0,01 mA, maximálně 1 mA
Uss=0V
Tolerance všech napájecích napětí: 5
Perioda hodinového signálu: 0,48 – 2 us
Napěťová úroveň pro log. 0: UIL= -1……1,8V (vstup)
UOL= 0…..0,45V (výstup) při proudu 1,9mA
Napěťová úroveň pro log. 1: UIH = 3,3…..UCC +1 V(vstup)
UOH = 3,7…..UCC V (výstup) při proudu –0.15mA
Mikroprocesor MHB 8080 potřebuje poněkud neobvyklý zdroj hodinového signálu. Jeho logické úrovně jsou netypické. Úroveň L se může pohybovat mezi –1 a +0.8V, kdežto úroveň H může být mezi +9V a napětím UDD +1V. Pokud jde o časový průběh, hovoříme zde o tak zvaných dvojfázových hodinách. Časové průběhy na vstupech Ф1 a Ф2 jsou nakresleny níže. Je samozřejmé, že tento poněkud složitý průběh, by bylo poněkud nesnadné vyrobit, a proto výrobce nabízí řešení v použití speciálníhio obvodu I 8224. O něm pojednáme později.
Jak je vidět z předchozího, rovněž napájecí zdroj pro tento mikroprocesor bude poněkud komplikovanější. Poznamenejme ovšem v této souvislosti, že v době vzniku tohoto mikroprocesoru měly tři napájecí napětí i jiné součástky např. paměti MHB 2708.
Pokud jde o datové výstupy, ty jsou sice do jisté míry slučitelné s logikou TTL, ale jejich zatižitelnost (logický zisk) je malá. Proto je na místě použítí t. zv. obousměrných zesilovačů. Jsou to obvody, které dokáží jak zesílit výstupní signál datových vodičů D0-D7, tak naopak vést signál opačným směrem od sběrnice do datových vodičů. Bližší podrobnosti budou uvedeny v dalším výkladu. Zde pouze poznamenejme, že směr toku dat v obousměrném zesilovači je řízen mikroprocesorem.
Datová sběrnice je určena pro komunikaci mikroprocesoru s datovými vodiči paměti, kdežto adresová sběrnice posílá na adresové vodiče paměti adresy. Pokud bychom chtěli posílat na nějaké periferní zařízení data z mikroprocesoru, pak bychom museli příslušný výstup naadresovat jako jakoukoli paměťovou buňku, do které chceme zapsat data a data pak do příslušného výstupu zapsat. Podobně pokud bychom chtěli, aby do mikroprocesoru byla načtena data z nějakého vstupu, museli bychom postupovat stejně jako při čtení dat z nějaké paměťové buňky. Je ovšem zcela logické, že adresy přidělené vstupním či výstupním zařízením, by nemohly být používány jako adresy v paměti.
Mikroprocesor I 8080 nabízí i jinou možnost výstupu dat, kdy není využíván paměťový prostor, ale speciální instrukcí je proveden výstup dat na sběrnici či vstup dat do mikroprocesoru. Adresa je v tomto případě pouze osmibitová a nemá nic společného s adresací paměti. V tomto případě může být vstupních či výstupních míst 256, což je počet ve většině aplikací zcela dostačující.
Pokusme se vysvětlit alespoň zjednodušeně činnost dalších vývodů mikroprocesoru. Vývod READY umožňuje vyvolání stavu WAIT – čekací doby. Jestliže je paměť tak pomalá, že by nestačila rychlosti mikroprocesoru, může logickou 0 na vstupu READY vyvolat zastavení mikroprocesoru – stav WAIT. Provedení tohoto požadavku signalisuje mikroprocesor na vývodu WAIT logickou 1. Podobný stav je možno navodit pomocí vstupu HOLD. Jestliže se na něm objeví logická 1, mikroprocesor se zastaví a adresová i datová sběrnice se dostanou do třetího stavu. Provedení tohoto příkazu je signalisováno logickou 1 na výstupu HLDA. Stav HOLD je používán při DMA (přímém přístupu do paměti), kdy dochází na sběrnici k přenosu dat bez účasti mikroprocesoru.
O činnosti vstupu RESET bylo již zde pojednáno. Doplňme tedy alespoň to, že k vyvolání stavu RESET (tj. uvedení mikroprocesoru do výchozího stavu) je třeba, aby na vývodu RESET byla logická 1 po dobu minimálně 3 period hodin.
Rovněž o přerušení (interruptu) již bylo dříve učiněna zmínka. Proto jen poznamenejme, že přerušení lze vyvolat logickou 1 na vývodu INT, kdežto na vývodu INTE odpovídá mikroprocesor logickou 0, že je požadavek akceptován. Pro úplnost dodejme, že mikroprocesor se může kromě stavu WAIT či HOLD, které lze vyvolat z vnějšku, zastavit i ve stavu HALT a to softwarově instrukcí HLT.
O zbývajících vývodech mikroprocesoru jen stručně:
DBIN (data bus in) – výstup signalizující, že datová sběrnice je ve vstupním módu.
WR – výstup řídící zápis do paměti.
SYNC – výstup indikující začátek strojního cyklu
Mikroprocesor obsahuje více než 5000 tranzistorů. Jeho vnitřní struktura je složitá a pro pochopení funkce s hlediska uživatele nemá smysl se jí detailně zabývat. Zde odkazuji případného zájemce na příslušnou literaturu. O některých jednotkách však musí uživatel mít alespoň základní informace.
Jak již bylo uvedeno, každý mikroprocesor obsahuje registry. Mikroprocesor I 8080 má jednak osmibitový registr A (akumulátor) a pak další registry. K registru A poznamenejme, že je to nejpoužívanější registr, do kterého se v případě aritmetických či logických operací uloží jeden z operandů a rovněž výsledek se většinou ukládá do registru A. Pokud jde o další registry, pak je zde šestnáctibitové registry PC (čítač instrukcí) a registr SP (ukazatel zásobníku) a pak osmibitové registry B, C, D, E, H, L. Mimo to existují registry W a Z, které nejsou programově přístupné. Registry B, C pro některé instrukce tvoří dvojici, kterou program chápe jako šestnáctibitovou paměťovou buňku. Totéž platí o dvojicích registů D a E, H a L. Kromě registrů jsou v mikroprocesoru i tzv. flagy t. j. jednobitové příznakové paměťové buňky. Flagy jsou součástí ALU a je jich těchto 5:
Z (zero) – při nulovém výsledku operace se nastaví do H
CY (carry) – přenos (přetečení) v akumulátoru
S (signum) – stavem H indikuje záporný výsledek operace
P (parity) – nastaví se H při sudém počtu jedniček v akumulátoru
AC (auxiliary carry) – nastaví se H při přenosu mezi 3. a 4. bitem v akumulátoru
Obraťme nyní svoji pozornost k instrukčnímu souboru. Instrukční soubor mikroprocesoru 8080 obsahuje 78 instrukcí. Jejich označení v assembleru, strojní kód a přesnou funkci si může případný zájemce najít v příslušné literatuře. My se zde omezíme pouze na některé typické, které budou zastupovat celou skupinu podobných instrukcí.
Jako první si proberme skupinu instrukcí přesunu dat. Tyto instrukce přesouvají osmibitová slova a to buď mezi registry nebo mezi registrem a pamětí. Je také možno přesouvat šestnáctibitová slova.
Jako příklad si uveďme instrukci přesunu dat z registru A do registru C. Při tomto přesunu se obsah registru A přesune do registru C. Vzhledem k tomu, že obsah registru A zůstane zachován, bylo by přesnější hovořit o zkopírování obsahu registru A do registru C. Tvar této instrukce v Assembleru je: MOV A, C, běžně se vyjadřuje: A C a její číselné vyjádření je v hexadecimálním tvaru 8F. Podobných instrukcí přesunů mezi registry je samozřejmě mnohem víc.
Jiným příkladem je přesun obsahu paměťové buňky do registru A. Předpokládejme, že chceme přenést do registru A obsah paměťové buňky, jejíž adresa je v hexadecimálním tvaru 875A. Tato instrukce má v Assembleru tvar: LDA 875AH. Znázornění této instrukce je pak toto: ( )875A A, její číselné vyjádření ve strojním kódu jsou tři osmibitová slova: 3A 5A 87. První slovo (3A) určuje, že půjde o přenos z paměti do registru A, druhá dvě slova určují adresu paměťové buňky, z níž bude osmibitové slovo přeneseno do registru A. Povšimněme si, že první dvojmístné hexadecimální číslo určuje nižších osm bitů adresy (low address), kdežto osm vyšších bitů adresy (high address) určuje až další dvojmístné hexadecimální číslo.
Další instrukcí, kterou si probereme, je instrukce naplnění registru zvoleným číslem. Jako příklad nám poslouží instrukce v assemblerovském vyjádření MVI D, A3H. Tuto instrukci lze interpretovat takto: A3H D, anebo slovně: naplň registr D hexadecimálním číslem A3. Ve strojním kódu je tato instrukce vyjádřena dvěma slovy: 16 A3. První slovo (16) určuje, že se má registr D naplnit číslem, které následuje (A3).
Pro úplnost si zde ještě uveďme jednu instrukci na přesun šestnáctibitového slova. Jde o instrukci, která přesune obsah spojených registrů HL do šestnáctibitového registru SP. Její podoba v Assembleru je: SPHL, znázorňujeme ji: (HL) SP a její strojní kód je F9.
Poznali jsme, že instrukce mohou být jednoslovné, dvojslovné a tříslovné. Jinak řečeno: instrukci v Assemblerovském vyjádření přeloží překladač do strojního kódu někdy jedním osmibitovým slovem, jindy dvěma či třemi slovy. Tento poznatek platí i pro instrukce dalších skupin.
Druhou skupinu instrukcí tvoří instrukce aritmetických operací. Jsou to instrukce součtu, rozdílu, inkrementu či dekrementu dat v paměti či registrech. Jednou z nich je instrukce součtu obsahu registrů A, B a uložení obsahu v registru A. V Assembleru je to: ADD B, kdežto schematicky vyjádřeno píšeme: A+B A, ve strojním kódu má instrukce hodnotu 80.
Jinou instrukcí této skupiny je instrukce ADI 38H. Její význam je: k obsahu střadače (registru A) přičti hexadecimální číslo 38 a výsledek ulož do střadače. Schematicky znázorněno: A+38H A. Ve strojním kódu pak bude vyjádřena tato instrukce dvěma slovy a to 86 38.
Instrukce INR E je instrukcí inkrementující registr E. Tedy: E+1 E, ve strojním kódu 1C.
Příkladem instrukce odečítání je instrukce SBI 82H. Při ní se odečte od obsahu registru A číslo 82H a výsledek se uloží do akumulátoru. Schematicky znázorněno: A-82H A, ve strojním kódu je to dvojslovná instrukce D6 82.
Třetí skupinu instrukcí tvoří logické operace. Nejsou to ale jen operace typu AND, OR, EX-OR, nýbrž i operace typu komparace, rotace či komplementace. Uveďme si zde alespoň některé nám doposud neznámé operace. Je to na příklad instrukce CMP H. Tato instrukce znamená, že se porovná obsah registru H s obsahem registru A. Provede se to tak, že se odečte obsah registru H od obsahu registru A a výsledek se nikam neukládá. Podle nastavení flagů se pak usuzuje, jsou-li jejich obsahy sobě rovny (Z=1), či je-li A>H (S=0) či je-li A<H (S=1). Ve strojním kódu má tato instrukce hodnotu 1011 1100B neboli BCH.
Jinou instrukci ze skupiny logických operací je instrukce rotace vlevo; v assemblerovském vyjádření je to RLC, kdežto ve strojním kódu je vyjádřena jako 1E Rotace znamená, že nejnižší bit v registru A (a0) se přesune na místo vyššího bitu (a1), bit a1 na místo bitu a2…atd. až bit a6 se přesune na místo bitu a7 a bit a7 se přesune na místo bitu a0. Tuto operaci znázorňuje níže nakreslený obrázek:
Obdobně existuje i instrukce rotace vpravo, jejíž vyjádření ve strojním kódu je 1F a kterou vyjadřuje assemblerovská instrukce RRC.
Obraťme svoji pozornost na instrukci komplementace. Při této instrukci se všechny jedničky v registru A změní na nuly, zatímco nuly se změní na jedničky. Tato instrukce má assemblerovské vyjádření CMA a ve strojním kódu je to 3F.
Čtvrtá skupina zahrnuje skoky jak podmíněné, tak nepodmíněné, volání podprogramu a návraty z podprogramu. Pokud jde o instrukci nepodmíněného skoku, její assemblerovský tvar je JMP adr., kde adr. je šestnáctibitová adresa, na níž je další instrukce. Ve strojním kódu je to pak C3 low address high address, kde low address znamená nižších osm bitů adresy a high address zase osm vyšších bitů adresy.
Podmíněné skoky jsou rozmanitější. Zopakujme si, že u podmíněného skoku dojde ke skoku na určenou adresu jen tehdy, bude-li splněna podmínka. V opačném případě program pokračuje na následující adrese. Tak na příklad u instrukce JZ 47C5H dojde ke skoku na hexadecimální adresu 47C5 jen tehdy, když výsledek předchozí operace je nulový a tudíž flag Z je roven 1. Naproti tomu instrukce JNC 182BH znamená, že ke skoku na adresu 182B dojde jen tehdy, když nedošlo v předchozí operaci k přeplnění a flag CY=0.
Rovněž volání podprogramu může být nepodmíněné a podmíněné. Uveďme si zde pouze volání nepodmíněné, jehož assemblerovský tvar je CALL adr. Tato instrukce je obdobou nepodmíněného skoku, liší se pouze tím, že na konci podprogramu zařazujeme instrukci RET, která způsobí návrat do hlavního programu na instrukci, která následuje po provedené instrukci volání podprogramu. Zopakujme si, že návratová adresa je uložena na adrese, na kterou ukazuje obsah registru SP (stack pointer). Aniž bychom zacházeli do dalších podrobností, uveďme si ještě, že instrukce volání může být podmíněná a rovněž i instrukce návratu může mít podmínku.
Poslední – pátá – skupina instrukcí jsou řídící instrukce. Sem patří instrukce EI – povolení přerušení (ve strojním kódu FB), dále instrukce DI – zákaz přerušení (ve strojním kódu F3), instrukce HLT – zákaz činnosti, uvedení do stavu HALT (ve strojním kódu 76) a konečně instrukce NOP, což je tak zvaná prázdná instrukce, při níž mikroprocesor nevykonává žádnou činnost. Její strojní kód je 00.
Na závěr tohoto malého nahlédnutí do instrukčního souboru mikroprocesoru I 8080 budiž řečeno, že v instrukčních souborech jiných mikroprocesorů jsou většinou více či méně podobné assemblerovské instrukce. To nám usnadní studium instrukčních souborů dalších mikroprocesorů. Budiž zde také konstantováno, že program pro mikroprocesor lze sice sestavovat ve strojním kódu, ale daleko pohodlnější je sestavit program v Assembleru či v jiném - vyšším - jazyku a pomocí překladače získat z tohoto zdrojového programu program ve strojním kódu.
PAMĚŤ
Podívejme se nyní na konkretní zapojení
mikroprocesoru I 8080. Ke své činnosti potřebuje mikroprocesor další obvody. Je
to především paměť, obsahující program, dále generátor hodin (v praxi zpravidla
obvod 8224) a budič datové sběrnice (zpravidla obvod 8228). Pro konkretní
použití se tyto obvody doplňují dalšími obvody pro plnění nejrůznějších úkolů.
My se zde omezíme jenom na nejzákladnější sestavu, která může být samozřejmě
rozšířena o další obvody:
X-TAL
o WAIT
RESET
STSTB
Sestavu, která je nakreslená na obrázku, je možno již nazvat mikropočítačem, pokud ji doplníme ještě dalšími obvody, zajišťujícími vstup a výstup dat. Jak je z obrázku zřejmé, ze sestavy vycházejí tři sběrnice (busy). Je to obousměrná datová sběrnice a jednosměrné sběrnice adresová a řídící. Na sběrnice datovou a adresovou je napojena paměť. Jak je snad i z obrázku zřejmé, na paměť je přivedeno všech osm drátů datové sběrnice, kdežto adresových drátů přivedených na paměť nemusí být plný počet t. j. 16. Počet použitých adresových drátů záleží na velikosti paměti t. j. na počtu paměťových buněk. Signály na datovou a řídící sběrnici jsou vedeny z obvodu 8228, který je přizpůsobí zátěži na sběrnici. Pokud by to bylo třeba, je možno i na odresové sběrnici použít nějakého průběžného zesilovače na příklad obvod MH 3212 .
Proberme si alespoň stručně a zjednodušeně funkci jednotlivých vstupních a výstupních vodičů našeho mikropočítače. O sběrnicích adresové, datové a řídící již bylo částečně pojednáno. Doplňme tedy ještě stručně několik údajů a připojení vstupně-výstupních obvodech: Jak již bylo dříve uvedeno, je možno mikropočítač připojit na vnější obvody (tak zvané periferie) přes I/O obvody dvojím způsobem. Jednak je možno tento I/O obvod formálně zařadit mezi paměťové buňky, přidělit mu adresu a obracet se na něj jako na paměť. Pak je tento I/O obvod řízen vodiči řídící sběrnice MEMR (memory read) a MEMW (memory write) stejně tak jako paměť. Jiná možnost je využít adresování I/O obvodu izolovaně od paměti. Zde se nabízí k adresaci pouze 8 adresových bitů, což dává možnost adresovat až 256 I/O obvodů, vstupy a výstupy se řídí vodiči řídící sběrnice I/O R (imput/output read) a I/O W (input/output write). Pokud jde o vodič INTA, je to vodič, na kterém mikropočítač kvituje přerušení a to logickou nulou.
O vstupech do mikroprocesoru HOLD a INT jakož i o výstupu INTE bylo již výše pojednáno. Připomeňme si tedy, že logickou 1 na vstupu HOLD vyvoláme stav zastavení mikroprocesoru a uvedení adresové i datové sběrnice do třetího stavu. Logickou 1 na vstupu INT můžeme vyvolat přerušení (interrupt), pokud není přerušení programově zakázáno instrukcí DI. Je-li požadavek na přerušení akceptován, objeví se na výstupu INTE logická nula.
Zbývá ještě probrat vstupy obvodu 8224. Na vývody X-tal se připojuje zpravidla krystal, jehož frekvence určuje kmitočet dvojfázových hodin mikroprocesoru. Vstup RESET je určen k vyvolání stavu RESET. Přivedeme-li na tento vstup logickou 1, pak se mikroprocesor dostane do výchozího stavu, který byl již výše popsán. Pokud přivedeme na vstup „žádost o WAIT“ stav L, dojde k přechodu mikroprocesoru do stavu WAIT t. j. k zastavení mikroprocesoru.
Za normálních okolností, to znamená pracuje-li mikroprocesor běžným způsobem, není-li třeba jej „brzdit“ protože paměť je pomalá, není-li potřeba vyvolat přerušení anebo mikroprocesor resetovat, jsou vstupy RESET, HOLD, INT ve stavu L, kdežto vstup „žádost o WAIT“ ve stavu H.
Nakresleme si na závěr zjednodušené schema mikropočítače 8080:
8 3 16
Adres. bus 16
Data bus 8
Control bus 5
SHRNUTÍ DOSUD ZÍSKANÝCH POZNATKU O I 8080
Pokusme se nyní o malou sumarisaci nejdůležitějších poznatků o mikroprocesoru I 8080. Poznali jsme, že tento mikroprocesor je v pouzdře DIL 40, obsahuje přes 5000 tranzistorů a má trojí napájení: +5V, +12V a –5V. Má dvojfázové hodiny, jeho adresovou sběrnici tvoří 16 vodičů A0-A15, jeho datovou sběrnici tvoří 8 vodičů D0-D7. Mimo to jsou zde ještě další vývody, z nichž je dobré znát alespoň vstup RESET, který uvádí mikroprocesor do výchozího stavu, vstup INT, který vyvolává přerušení a vstup HOLD, který zastaví mikroprocesor a uvede datové i adresové vodiče do třetího stavu (používá se při DMA).
Pokud jde o technická data, pak kromě toho, že mikroprocesor má poněkud komplikované napájení, je také důležité, že napěťové úrovně na jeho výstupech jsou poněkud jiné, než úrovně v logice TTL. U vstupů dvojfázových hodin jsou úrovně naprosto nestučitelné s logikou TTL, a proto používáme specielní obvod 8224. U datové a adresové sběrnice je možno sice dosáhnout slučitelnosti s logikou TTL, ale vzhledem k malé zatižitelnosti výstupů se jeví jako účelné použít alespoň pro datovou sběrnici obousměrný zesilovač. Zpravidla se používá obvod 8228, který dokáže nejen zvýšit zatižitelnost datové sběrnice, ale i vytváří signály pro řídící sběrnici.
Má-li mikroprocesor komunikovat se svým okolím (periferiemi), musí být vybaven I/O obvody. Tyto obvody je možno adresovat buď jako buňky paměti anebo isolovaně od paměti. V prvém případě si můžeme vybrat některou ze 16k adres (a tu již nelze přidělit žádné z paměťových buněk) anebo ve druhém případě se nám nabízí pouze 256 adres, ale zato tyto adresy jsou mimo množinu adres paměti. Zápis do I/O obvodu či čtení z něho řídí vodiče MEMR a MEMW v případě adresace I/O obvodu jako buňky paměti. V případě adresace isolované od paměti řídí zápis do I/O obvodu či čtení z něho vodiče I/O R a I/O W. Pokud jde o zápis do vlastní paměti či čtení z ní, zde je řízení prováděno rovněž vodiči MEMR a MEMW.
Vnitřní strukturou jsme se příliš nezabývali. Poznali jsme pouze nejdůležitější registry a to akumulátor (střadač) neboli registr A (osmibitový), dále registry SP ( stack pointer) a PC (program counter) – oba šestnáctibitové. Další registry C,D,E,F,H,L jsou osmibitové, ale některé instrukce je spojují do dvojic, takže vznikne šestnáctibitový registr. Součástí ALU jsou ta zvané flagy – příznaky. Jsou to jednobitové paměťové buňky, které se nastavují při některých instrukcích podle výsledku operace. Flagů je 5 : Z, CY, S, P , AC.
Instrukční soubor obsahuje celou řadu instrukcí, které lze rozdělit do pěti skupin. Připomeňme si alespoň některé, jejich assemblerovský tvar, význam a případně i strojní kód:
MOV A, C A C 8F
LDA 875AH ( )875A A 3A 5A 87
MVI D, A3H A3H D 16 A3
SPHL (HL) SP F9
ADD B A+B A 80
ADI 38H A+38H A 86 38
INR E E+1 E 1C
SBI 82H A-82H A D6 82
CMP H A-H BC
RLC rotace vlevo 1E
CMA komplementace 3F
JMP 47F2H nepodmíněný skok C3 F2 47
JZ 47C5H podmíněný skok CB C5 47
CALL 9412H volání podprogramu C5 12 94
RET návrat z podprogramu C1
HLT uvedení do stavu HALT 76
Zopakujme si,že některé instrukce jsou jednoslovné, jiné dvoj- i tří-slovné. A pokud jde o adresaci ve strojovém kódu, bývá vždy jako první uváděn nižší byte adresy (low address) a pak teprve vyšší byte adresy (high address).
Mikroprocesor I 8080 sám o sobě nepracuje, potřebuje některé pomocné obvody. Jestliže k němu připojíme obvod 8224 (generátor hodin), obvod 8238 (systémový budič), paměť obsahující program a I/O obvody, získáme mikropočítač. Jeho vnitřní datová sběrnice má šířku 8 bitů, adresová má 16 bitů a řídící sběrnice je pětibitová. Komunikace s periferiemi může být, podle charakteru I/O obvodu, buď paralelní (z I/O obvodu odchází či do něho vstupuje najednou 8 bitů po osmi vodičích) anebo seriová (I/O obvod má pouze jeden vstupní či výstupní vodič). O těchto pomocných obvodech bude podrobně pojednáno později.
Mikroprocesor I 8051
Tento mikroprocesor uvedla na trh v roce 1980 firma Intel. Je to jednočipový, osmibitový mikroprocesor s Harvardskou strukturou. Existují tři modifikace, které se liší pouze pamětí programu: 8031 bez vnitřní paměti programu, 8051 s vntřní pamětí programu ROM o velikosti 4 kB a typ 8751 s vnitřní pamětí EPROM rovněž o velikosti 4 kB. Vnitřní paměť dat je paměť typu RAM o velikosti 128B. S okolím může mikroprocesor komunikovat prostřednictvím čtyř osmibitových obousměrných V/V bran (I/O porty), má 5 různých zdrojů přerušení (2 vnější, 2 časovače a 1 seriový kanál). Napájecí napětí je pouze jedno a to 5V. Pouzdro je DIL 40. Rozmístění vývodů je nakresleno níže:
1____ P1.0 Ucc ____40
2____ P1.1 P0.0 ____39
3____ P1.2 P0.1 ____38
4____ P1.3 P0.2 ____37
5____ P1.4 P0.3 ____36
6____ P1.5 P0.4 ____35
7____ P1.6 P0.5 ____34
8____ P1.7 P0.6 ____33
9____ Reset P0.7 ____32
10___ RxD/P3.0 EA/VP ____31
11___ TxD/P3.1 ALE/P ____30
12___ INT 0/P3.2 PSEN ____29
13___ INT 1/P3.3 P2.7 ____28
14___ T0/P3.4 P2.6 ____27
15___ T1/P3.5 P2.5 ____26
16___ WR/P3.6 P2.4 ____25
17___ RD/P3.7 P2.3 ____24
18___ X TAL2 P2.2 ____23
19___ X TAL1 P2.1 ____22
20___ Uss P2.0 ____21
Funkce jednotlivých vývodů bude postupně vysvětlována později. Zde bude vysvětleno pouze to, co bude nezbytné pro porozumění dalšímu výkladu.
Vývody P0.0-P0.7 tvoří port 0, vývody P1.0-P1.7 jsou port 1, vývody P2.0-P2.7 nazýváme port 2. Pokud jde o port 3, ten je tvořen vývody P3.0-P3.7, avšak zde je nutno vidět i to, že tyto vývody mají i další funkci. O zdvojení funkce těchto vývodů bude pojednáno později, zatím ji pouze vezměme na vědomí. Rovněž s funkcí vývodů ALE, PSEN a EA/VP se budeme zabývat později. Pokud jde o vývod RESET, jeho funkce je téměř shodná s funkcí stejnojmenného vývodu u I 8080. Vývody X TAL 1 a X TAL 2 jsou určeny pro připojení krystalu.
Výše nakreslené rozmístění vývodů mikroprocesoru 8051 sice přesně vystihuje skutečné rozmístění, nicméně pro potřeby výkladu bude výhodnější nakreslit vývody mikroprocesoru jiným poněkud přehlednějším způsobem:
Ucc
X TAL1
8051
X TAL2
RESET ALE
EA/VP PSEN
Jak vidíme na výše nakresleném zjednodušeném schematu, mikroprocesor má čtyři osmibitové brány, které lze použít buď jako vstupy či jako výstupy. Proti I 8080 tedy odpadají I/O obvody. Pokud se spokojíme s rozsahem 4kB vnitřní paměti dat, pak je zapojení tohoto mikroprocesoru velmi jednoduché: výstupy ALE a PSEN zůstanou nezapojeny,vstup EA/VP se připojí na logickou 1 (použití pouze vnitřní paměti), na vstupy X TAL1 a X TAL2 se připojí krystal a na výstupy portů P0…P3 se připojí periferie. Logickou jedničkou na vstupu RESET se pak nastartuje činnost mikroprocesoru, která probíhá podle programu, uloženého ve vnitřní paměti programu. Není tedy příliš přehnané tvrzení, že jednočípový mikroprocesor představuje vlastně jakýsi mikropočítač.
Podívejme se nyní alespoň na některá technická data:
Napájecí napětí: +4,75 – 5,25V, proud max. 125 mA
Vstupní napětí pro L: -0,5…..+0.8V proud max. 0,8mA
Vstupní napětí pro H: +2V….Ucc+0.5V proud max. 2,5mA
Výstupní napětí pro L: 0…..0,45V proud max 3,2mA pro P0, ALE a PSEN
max. 1,6mA pro P1, P2, P3
Výstupní napětí pro H: min. 2,4V proud max. –0,4mA pro P0, ALE a PSEN
max. –0,08 mA pro P1, P2, P3
Adresovací prostor vnější paměti dat: 64 kB
Adresovací prostor vnější paměti programu: 64 kB Kmitočet hodin: 3,5…..12MHz
Jak je vidět, výstupy všech portů jsou slučitelné s logikou TTL. Jejich zatižitelnost však není příliš veliká (např. na výstupy portů P1, P2, P3 je možno připojit pouze 1 vstup obvodu TTL nebo 6 vstupů obvodů typu LS nebo 12 vstupů typu ALS), takže je někdy nutno použít obousměrný zesilovač. Kmitočet hodin je dán volbou krystalu. V praxi se volí zpravidla jeho maximální velikost 12 MHz. Některé verse však mohou mít hodinový kmitočet až 30MHz a dolní mez je prakticky od nuly. Pokud jde o adresovací prostor paměti dat či programu je možno jej podstatně rozšířit použijeme – li vnějších pamětí. O tom pojednáme v závěru kapitoly, věnované mikroprocesoru 8051.
Přejděme nyní k popisu vnitřní struktury mikroprocesoru. Dle údajů výrobce má tento mikroprocesor 20 tisíc tranzistorů. Nebylo by pro uživatele příliš přínosné zabývat se podrobně jednotlivými funkčními celky a seznamovat se s jednotlivými časovými průběhy. Případný zájemce si to může prostudovat v příslušné literatuře např. Petr Skalický: Mikro- procesory řady 8051. Pro naše účely postačí zjednodušený popis vnitřní struktury.
Mikroprocesor 8051 obsahuje celou řadu registrů. Předně je to osmibitový registr A (akumulátor, střadač), dále šestnáctibitový registr PC a osmibitový registr SP. S obdobnými registry jsme se již setkali u I 8080. Dále jsou zde osmibitové registry R0…R7. Tyto registry jsou organizovány v t. zv. bankách registrů, které jsou čtyři. Banku registrů lze volit programově a je tedy k disposici až 32 registrů. Z dalších registrů uveďme ještě registr PSW, ve kterém jednotlivé bity představují flagy a dva registry DPL a DPH, které společně představují šestnáctibitový registr, používaný pro uložení adresy.
Mikroprocesor má, jak už bylo uvedeno, pět zdrojů přerušení. Dva z nich představují vnitřní šestnáctibitové čítače/časovače. Aniž bychom zacházeli do podrobností, uveďme si alespoň to, že tyto čítače/časovače mohou po uplynutí nastavené doby či po příchodu určitého počtu impulsů způsobit přerušení. Vzhledem k tomu, že existuje pět různých zdrojů přerušení, je třeba každému z nich programově přidělit jistou prioritu. To v praxi znamená, že přerušení s vyšší prioritou přeruší již probíhající přerušení s prioritou nižší. Naopak ale přerušení s nižší prioritou nemůže přerušit probíhající přerušení vyšší priority. Na přidělení priority přerušení a na řízení přerušení jsou zde vyčleněny dva registry. Pro každý zdroj přerušení je vyčleněna adresa v paměti programu, na níž začne program obsluhy tohoto přerušení. Na tyto adresy se pochopitelně nesmí ukládat hlavní program. Níže uvedená tabulka ukazuje přehledně startovací adresy obslužných programů jednotlivých druhů přerušení.
Zdroj přerušení Označení Startovací adresa
RESET 0000H
Vnější přerušení 0 IE0 0003H
Čítač/časovač 0 TF0 000BH
Vnější přerušení 1 IE1 0013H
Čítač/časovač 1 TF1 001BH
Seriový kanál RI+TI 0023H
V tabulce se vyskytuje jako zdroj přerušení seriový kanál. Tento kanál je určen pro komunikaci mezi dvěma mikroprocesory či mezi mikroprocesorem a PC. Seriovému kanálu přísluší vývody RxD/P.0 a TxD/P3.1. Tomuto tématu bude věnována samostatná kapitola.
V tabulce přerušení figuruje i RESET, i když to není typické přerušení. To proto, aby bylo zřejmé, že hlavní program, který na této adrese začíná a který nesmí narušit programy přerušení, má k disposici pouze tři adresy a pak musí pokračovat na adresách vyšších. V praxi se na první tři adresy umístí pouze instrukce skoku na adresu, kde hlavní program prakticky teprve začíná.
Registry jsou umístěny v RAM paměti dat. Čtyři banky registrů jsou umístěny na prvních 32 adresách (adresy 00H-1FH). Ostatní registry (tak zvané registry speciálních funkcí) jsou uloženy na adresách 80H-FFH. Tak na příklad registr A má adresu E0H, registr PSW je na adrese D0H, registry pro řízení přerušení IE a IP najdeme na adresách A8H a B8H atd.
U mikroprocesoru 8051 se setkáváme s novým pojmem a to je nepřímé adresování. Tento pojem znamená, že adresa paměťové buňky není udána binárním číslem, jak jsme byli doposud zvyklí, nýbrž je udána adresa paměťové buňky, ve které se nachází adresa. Lépe nám tento pojem objasní konkretní instrukce, kde je tohoto nepřímého adresování použito.
Než přikročíme k probírání instrukčního souboru, objasněme si, co se děje při resetování mikroprocesoru. Resetovací signál musí trvat alespoň 24 period hodinového kmitočtu. Při resetování se mikroprocesor dostane do výchozího definovaného stavu. To znamená, že PC je vynulován, všechny porty se nastaví do vstupního režimu, SP se nastaví na 07, většina ostatních registrů je vynulována (m.j. registr A, PSW, DPTR) a rovněž oba čítače/časovače jsou vynulovány.
Instrukční soubor obsahuje 128 instrukcí. Probereme si zde stejně jako u I 8080 jen některé typické anebo ty, které přinesou něco nového proti dosud probraným instrukcím I 8080. Tím novým může být i to, že obdobná instrukce má u 8051 úplně jiný tvar v Assembleru.
Stejně jako u I 8080 i zde je možno instrukce rozdělit do několika skupin. První skupinou jsou přesuny. Jednou z nich je instrukce MOV A, R3, která znamená přesun obsahu registru R3 (z aktuální banky registrů) do akumulátoru. Naproti tomu instrukce MOV R5, A znamená přesun obsahu akumulátoru do registru R5. Instrukce MOV A, #5CH znamená, že akumulátor se naplní hexadecimálním číslem 5C. Povšimněme si, že v Assembleru 8051 jsou konstanty důsledně označovány znakem #, zatímco adresy jsou bez označení. Dokladem toho je instrukce MOV 21H, A. Tato instrukce znamená přenesení obsahu registru A do paměťové buňky s adresou 21H. Příkladem instrukce používající nepřímé adresování je instrukce MOV @R1, #2AH. Smysl této instrukce je: přenes do paměťové buňky v paměti dat, jejíž adresu obsahuje registr R1, hexadecimální číslo 2A. Povšimněme si, že nepřímé adresování zde označuje znak @. Označení konstanty znakem # by nás již nemělo překvapit. Stojí za zmínku, že k nepřímému adresování lze použít pouze registry R0 a R1. Pro komunikaci s vnější pamětí dat slouží m.j. instrukce MOVX A, @DPTR, která znamená toto: přenes obsah paměťové buňky ve vnější paměti dat do akumulátoru. Její šestnáctibitová adresa je uložena v registrech DPH (high address) a DPL (low address). Pro přesun dat z vnější paměti programu do střadače je zde m.j. i instrukce MOVC A, @A+DPTR. Na základě získaných poznatků čtenář snad sám rozluští její smysl: přenes do registru A z paměti dat obsah paměťové buňky, jejíž adresu získáš sečtením obsahu akumulátoru s obsahem registru DPTR (tj. spojených registrů DPL a DPH.
Druhou skupinou instrukcí jsou instrukce aritmetické. Jde zde o sčítání obsahu registru A s obsahem jiného registru s následným uložením výsledku do akumulátoru (například instrukce ADD A, R7) , nebo sčítání obsahu akumulátoru s konstantou a s uložením výsledku do střadače (ADD A, #54H) či využití nepřímého adresování (ADD A, @R1). V instrukčním souboru nechybí ani inkrementace či dekrementace registru A či některého z registrů R0-R7 anebo nepřímo adresované paměťové buňky z paměti dat. Je zde i instrukce násobení a dělení s využitím registru B.
Další skupinou instrukcí jsou logické operace. Jsou to operace typu AND, OR či EX-OR prováděné mezi registrem A a jiným registrem s uložením výsledku do akumulátoru či mezi registrem A a nepřímo adresovanou paměťovou buňkou anebo mezi registrem A a bytem. Příkladem této poslední možnosti je instrukce ANL A, #3CH. Tato instrukce znamená logický součin mezi obsahem registu A a hexadecimálním číslem 3C s uložením výsledku do akumulátoru. Někdy se taková operace nazývá také extrakce. Objasněme si proč.
Jestliže si napíšeme obě osmibitová čísla pod sebe a pod ně ještě výsledek operace, smysl názvu extrakce se ozřejmí:
a7 a6 a5 a4 a3 a2 a1 a0 původní obsah reg. A
0 0 1 1 1 1 0 0 číslo 3CH
0 0 a5 a4 a3 a2 0 0 výsledek
Jak vidíme, výsledek této operace je ten, že v bitech, kde číslo 3C mělo jedničky, zůstala původní hodnota, kdežto v těch bitech, kde číslo 3C mělo nuly, se objevila také nula. Lze tedy logickým součinem „extrahovat“ z registru A bity, které pro nás mají význam a ostatní přepsat nulou. Objasněme si to na jiném příkladu. Chceme-li obsah registru dělit dvěma, můžeme to udělat tak, že použijeme instrukci RR A, což je rotace bitů registru A vpravo. Pak se, podobně jako u obdobné instrukce u I 8080, posunou bity a7 - a1 o jedno místo vpravo a bit a0 se objeví na místě bitu a7. Provedeme-li pak další instrukcí ANL A, #7FH logický součin registru A s hexadecimálním číslem 7F, pak bit a7 se bude rovnat 0, zatímco ostatní bity se nezmění. Zkusme si to rozepsat pro větší názornost:
a7 a6 a5 a4 a3 a2 a1 a0 původní obsah reg. A
a0 a7 a6 a5 a4 a3 a2 a1 po rotaci vpravo
0 1 1 1 1 1 1 1 číslo 7FH
0 a7 a6 a5 a4 a3 a2 a1 po provedené extrakci
Jak vidíme, výsledkem je posun všech bitů o jedno místo vlevo a nulování nejvyššího bitu, tedy dělení čísla dvěma.
V instrukčním souboru 8051 se vyskytuje rovněž instrukce RL A – rotace bitů registru A vlevo. Pokud ji použijeme a následující instrukce bude ANL A, #FEH, pak výsledkem bude posun bitů v registru A o jedno místo vlevo, tedy násobení obsahu registru A dvěma. V tomto případě však musíme si položit podmínku, že bit a7 se nesmí rovnat 1, anebo jinak řečeno číslo uložené do registru A nesmí být větší než 12710. Testovat, zda je splněna podmínka, že bit a7 není roven jedné, je možno pomocí t. zv. bitových operací. Zkusme si alespoň zhruba naznačit, co to jsou t. zv. bitové operace:
Dosud jsme poznali operace, kdy operandem bylo osmibitové nebo šestnáctibitové slovo. V bitových operacích je operandem jediný bit. V datové paměti mikroprocesoru 8051 je oblast adres 20H-2FH, která se nazývá bitová oblast. Zde má každý jednotlivý bit svoji individuální adresu. Podobně i bity některých registrů mají svoji individuální adresu. Tak např. v registru A, jeho jednotlivé bity počínaje bitem a0 a konče bitem a7 mají adresy E0H, E1H, E2H……E7H.
Příkladem takovéto bitové instrukce je např. instrukce CLR C, která znamená, že bit C registru PSW bude vynulován. Bitová adresa tohoto bitu je D7H, což však v tomto případě nemá valný význam. Jinou instrukcí tohoto typu je instrukce MOV C, E7H. Tato instrukce znamená, že do bitu C bude přenesen obsah bitu a7 registru A (bitová adresa E7H). Po provedení této instrukce je možné testovat obsah bitu C např. pomocí některé instrukce podmíněného skoku.
Instrukce skokové jsou další skupinou instrukcí. Jsou to na příklad instrukce podmíněných skoků. Příkladem je instrukce JC 5A H . Význam této instrukce je tento: jestliže se bit C rovná 1, pak proveď skok na adresu o 5A H vyšší, jinak pokračuj další instrukcí. Adresa, která je v této (ale i v jiných) skokové instrukci udávaná je tak zvaná relativní adresa. Její rozsah je od –12710 do +12710, neboli od –7FH do + 7FH. Adresa, na kterou má program skočit, se vypočítá jako součet obsahu PC a relativní adresy. Podobně v instrukci JB E7 2D dojde ke skoku na relativní adresu 2D je – li bit s bitovou adresou E7 (což je nejvyšší bit v registru A) roven 1.
Jinou skokovou instrukcí je instrukce nepodmíněného skoku LJMP 57ABH . Tato instrukce má obdobu v instrukčním souboru I 8080 a znamená nepodmíněný skok na adresu 57ABH. Naproti tomu instrukce AJMP 6C2H v instrukčním souboru I 8080 obdobu nemá. Je to tak zvaný krátký nepodmíněný skok. Adresa v této instrukci má pouze 11 bitů a skok je proveden pouze v rámci aktuální 2k paměťové stránky. Jinak řečeno: je možno volit pouze 11 nejnižších bitů adresy, na kterou bude proveden skok, zbývajících 5 nejvyšších bitů adresy je dáno. Adresa v této instrukci může mít pouze hodnotu 000-7FFH. V této souvislosti je však třeba podotknout, že při psaní programu v Assembleru se zpravidla adresy nevyjadřují čísly, nýbrž pomocí tzv. návěstí. V každém případě však je nutno konstatovat, že zatímco instrukce LJMP adr.16 je přeložena do strojního kódu jako tříslovná, instrukce AJMP adr. 11 je přeložena jako dvouslovná, protože tři bity adresy se stanou součástí prvního slova a zbývajících 8 je uloženo do druhého slova.
Obdobná situace je u instrukcí volání podprogramů. I zde je instrukce LCALL 541AH, která má obdobu v instrukčním souboru I 8080 a instrukce ACALL 2C6H , která je zase voláním podprogramu v rámci aktuální 2k stránky v paměti. Jsou zde i instrukce RET a NOP, které jsou obdobou stejnojmenných instrukcí v instrukčním souboru I 8080. Za zmínku stojí snad ještě instrukce SWAP A, která znamená výměnu čtveřic bitů v registru A a instrukce DJNZ R5, -10H. Tato tak zvaná sdružená instrukce provede dva úkony. Předně dekrementuje obsah registru R5 a pak, není-li tento obsah nulový, provede skok na adresu o 10H nižší, v případě, že obsah registru R5 je nulový, program pokračuje další instrukcí. Tato instrukce se používá hlavně u cyklů.
Toto malé nahlédnutí do instrukčního souboru 8051 snad ukázalo, že značná část instrukcí u různých mikroprocesorů je obdobná. Pro překlad z Assembleru do strojního kódu je k disposici např. program SIM 51, na kterém si může programátor simulovat běh programu buď vcelku, nebo po jednotlivých instrukcích či se zastavením na předem určeném místě programu. Při tom může sledovat obsah všech registrů či paměti dat nebo programu a navíc může sledovat časovou náročnost jednotlivých operací. Existují i programy, které umožňují, aby PC simuloval chování mikroprocesoru 8051 a nahradil jej v reálném zapojení.
Jak se ukazuje, je rozsah vnitřní paměti programu 4kB v některých případech nedostatečný, a proto je třeba použít vnější paměti, která rozšíří adresovací prostor až na 64 kB. Rovněž paměť dat je možno rozšířit vnější pamětí RAM až na 64 kB. U typu 8031 není vůbec instalována vnitřní paměť programu, a proto zde je vnější paměť programu nutností. Je ovšem nutno v této souvislosti podotknout, že mikroprocesor s vnější pamětí ztrácí jednoduchost zapojení, kterou má jako ryze jednočipový mikroprocesor.
V případě 8031 musíme volit pouze vnější paměť programu. V případě 8051 nebo 8751 můžeme volit, zda použijeme celý 64kB adresovací prostor jako vnější paměť či zda část paměti programu o adresách 0000-00FFH nepoužijeme z vnitřní paměti programu a zbytek o adresách 1000H – FFFFH z vnější paměti programu. V prvém případě přivedeme na vývod EA/VP logickou 0, ve druhém případě logickou 1. Pokud jde o vnější paměť dat, ta je naprosto nezávislá na vnitřní paměti dat a má i svoji vlastní, na vnitřní paměti dat nezávislou, adresaci. Lépe celou situaci objasní níže nakreslený obrázek:
Paměť programu Paměť dat
Vnější paměť programu EA=1 nebo EA=0 Vnější Vnitřní paměť paměť programu programu EA=0 EA=1 Vnější paměť dat
FFFFH FFFFH
Registry specál. funkcí
FFH
1000H
0FFFH
80H
Vnitřní paměť dat
7FH
0000H 00H 0000H
Jak vidíme, v případě použití pouze vnitřní paměti programu budou k disposici adresy paměti programu 0000-0FFFH. Na vstup EA musíme v tom případě přivést log. 1. Jestliže bychom chtěli použít paměť programu, která se skládá částečně z paměti vnitřní (to znamená adresy 0000-0FFFH) a druhou část by tvořila vnější paměť programu, jejíž adresy by začínaly adresou 1000H a mohly jít až do adresy FFFFH, pak bychom museli na vstup EA přivést logickou 1. Avšak v případě, že bychom použili pouze vnější paměť programu, která by měla adresy od 0000 a mohly jít až do FFFFH, pak bychom museli na vstup EA přivést logickou 0. Je samozřejmé, že poměť programu postavíme jen v takovém rozsahu, aby se do ní vešel celý program. To znamená, že pečlivě zvážíme, zda by se program nevešel do vnitřní paměti a v případě, že by vnitřní paměť nestačila, o kolik adres musíme paměť programu doplnit vnější pamětí.
Pokud jde o paměť dat, je v 8051 instalována paměť RAM o rozsahu 128B. Její adresy jsou v rozsahu 00-7FH. V této paměti se nacházejí i 4 banky registrů (adresy 00-2FH) a dále bitová oblast (adresy 20H-2FH) a sem jsou také ukládány návratové adresy podprogramů. Ve druhé části paměti RAM (adresy 80H-FFH) jsou pak umístěny registry speciálních funkcí. Jestliže bychom potřebovali paměť dat rozšířit, pak tato vnější paměť by měla svoje vlastní adresování, které by s vnitřní pamětí RAM by nemělo nic společného. Adresy vnější paměti dat by mohly být v rozsahu 0000-FFFFH . Tento rozsah je pochopitelně maximálně možný a nemusí být beze zbytku využit. Připomeňme si ještě, že 8051 má Harvardskou strukturu, a proto tatáž adresa může jednou znamenat adresu paměťové buňky v paměti dat a jindy zase adresu paměťové buňky v paměti programu.
Podívejme se nyní na to, jak se připojují k 8051 vnější paměti. K vytvoření adresových a datových vodičů se použije vodičů portů P0 a P2, kdežto na vytvoření řídící sběrnice se použijí některé vývody portu P3. Tyto porty sice budou i nadále použitelné, ale jejich použití bude se komplikovat časovým multiplexem s výstupy určenými pro ovládání pamětí
Šestnáct adresových bitů bude vyvedeno z portů P0 a P2. Adresové bity A0, A1, A2, A3….A7 budou na vývodech P0.0, P0.1, P0.2……P0.7. Adresové bity A8, A9, A10….A15 budou na vývodech P2.0, P2.1, P2.2……P2.7. Jejich platnost vzhledem k časovému multiplexu bude potvrzována na vodičích řídící sběrnice, jak bude rozvedeno níže. Pokud jde o datovou sběrnici to, znamená o bity D0, D1, D2……..D7, ty budou vyvedeny opět na drátech portu P0. I zde bude platnost dat potvrzována na vodičích řídící sběrnice.
Řídící sběrnici tvoří tři dráty a to WR (=P3.6), RD (=P3.7), PSEN a ALE. Dráty RD a WR jsou určeny pro čtení či zápis do vnější datové paměti, kdežto PSEN je určen pro čtení z vnější paměti programu a ALE pro potvrzení platnosti adresy na vývodech portu P0. Činnost procesoru, opatřeného vnějšími pamětmi, si ozřejmíme na níže nakresleném obrázku:
Adres.
PP AD0-AD7 bus
AA
A0-A15
Uss
Jak vidíme na obrázku, z portu P0 je vedeno osm drátů AD0-AD7 jednak na vstup LATCH registru a jednak na datové výstupy obou pamětí. Tyto výstupy jsou ve třetím stavu až do doby, kdy dostanou pokyn, aby na sběrnici poslali data.
V okamžiku, kdy se na drátech AD0-AD7 objeví platná adresa, na výstupu ALE (address latch enable) se objeví kladný impuls, který přepíše osm nižších bitů adresy ze vstupu LATCH registru na jeho výstup. Těchto osm bitů A0-A7 spolu s bity A8-A15 z portu P2 tvoří šestnáctibitovou adresovou sběrnici (address bus), která je vedena na adresové vstupy (A) obou pamětí. Po ustálení adresy přijde buď záporný impuls z výstupu PSEN (program storage enable), který dá pokyn paměti programu (vývod OE – output enable), aby na sběrnici AD0-AD7 poslala data ze svých datových výstupů (D). Port P0 je ve vstupním módu a vyslaná data přijme. Jiná možnost je, že adresa je určena pro paměť dat. Pak po ustálení platné adresy přijde buď záporný impuls RD (read), který dá pokyn paměti dat, aby vyslala data na sběrnici a opět port P0, který je ve vstupním módu, tato data přijme, anebo přijde záporný impuls WR (write), který dá pokyn, aby paměť dat zapsala data, která na sběrnici AD0-AD7 vyšle mikroprocesor. Port P0 je v tomto případě pochopitelně ve výstupním módu.
Výše nakreslený obrázek je jenom velmi zjednodušeným schematem. Je samozřejmé, že reálně použitelné schema by bylo mnohem složitější. Bylo by nutno m.j. připojit obvod resetování, bylo by potřeba připojit periferie na port P1, popřípadě i na další porty, kde by ovšem bylo nutno respektovat časový multiplex s datovou, adresovou a řídící sběrnicí. Rovněž připojení adresové sběrnice k pamětem je naznačeno pouze schematicky, skutečné schema by bylo složitější.
Na závěr kapitoly, věnované 8051, je nutno konstatovat, že výklad se omezil pouze jen na nejdůležitější a nejzákladnější fakta. Nebylo zde hovořeno ani o seriovém vstupu ani o multiprocesorové komunikaci, protože toto téma bude probráno v jiné kapitole. Nebyly zde probírány ani časové diagramy ani vnitřní struktura mikroprocesoru, protože tím by tato kapitola neúměrně narostla. Rovněž zde nebyly probrány různé varianty připojení periferií ani programovatelných obvodů ani otázky okolo čítačů/časovačů. K některým z těchto otázek se vrátíme v jiných kapitolách, ostatní si musí případný zájemce nastudovat v příslušné literatuře.
SHRNUTÍ DOSUD ZÍSKANÝCH POZNATKU O 8051
Shrňme si nyní poznatky, které jsme získali o 8051. Víme, že je to osmibitový jednočípový mikroprocesor, který má oddělenou paměť programu a paměť dat. Vnitřní paměť programu ROM má velikost 4kB. Má čtyři obousměrné osmibitové brány (porty), pouze jedno napájení a to +5V, vystupy jsou slučitelné s logikou TTL, mikroprocesor je umístěn v pouzdře DIL 40 a obsahuje 20000 tranzistorů. Mikroprocesor 8051 má 5 zdrojů přerušení. Adresovací prostor pro vnější paměť programu je 64 kB, pro vnější paměť dat může mít rovněž až 64 kB.
Mikroprocesor 8051 obsahuje mimo jiné. osmibitový registr A , šestnáctibitový registr PC a osmibitový registr SP. Z dalších registrů jsme si jmenovali registr PSW, který obsahuje flagy a registry R0-R7, které jsou organizovány ve čtyřech identických bankách registrů.
Přerušení může být vyvoláno jedním ze dvou čítačů/časovačů nebo je vyvolá některý ze dvou vnějších vývodů popřípadě může přerušení iniciovat seriový kanál. Každé přerušení má svoji startovací adresu, na které začíná jeho obslužný program. Programově může být každému přerušení přidělena priorita. Přerušení vyšší priority má přednost před přerušením nižší priority. Přerušení lze programově zakázat. K přerušením lze počítat i start mikro- procesoru pomocí RESET. Pokud signál RESET trvá alespoň 24 period hodinového signálu, pak se 8051 nastaví do definovaného výchozího stavu, to znamená, že se PC vynuluje, porty P0, P1, P2, P3 se nastaví do vstupního režimu, SP se nastaví na 07 a registry A, PSW a DPTR a některé další se vynulují.
Instrukční soubor obsahuje 128 instrukcí. Uveďme si zde přehledně některé z nich a to jak assemblerovský tvar, tak i znázornění funkce a strojní kód v hexadecimálním tvaru:
MOV A, R3 A R3 EB
MOV R5, A R5 A FD
MOV A, #5CH A 5C 74 5C
MOV 21H, A ( )21 A F5 21
MOV @R1, 2AH ( )R1 2A 77 2A
MOVX A, DPTR A ( )DPTR E0
MOVC A, @A+DPTR A ( )@A+DPTR
ADD A, R7 A+R7 A 2F
ADD A, #54H A+54 A 24 54
INC A A+1 A 04
DEC R4 R4-1 R4 1C
ANL A, #3C A AND 3C A 54 3C
RL A rotace reg. A vlevo 23
CLR C C 0 C3
MOV C, E7H C E7 A2 E7
JC 5AH skok na relativní adresu 40 5A
je-li C=1
LJMP 57ABH nepodmíněný skok 02 57 AB
AJMP 6C2H krátký nepodmíněný 61 C2
skok v rámci 2kB stránky
LCALL 541AH volání podprogramu 12 54 1A
ACALL 2C6H volání podprogramu 31 C6
v rámci 2kB stránky
RET návrat z podprogramu 22
NOP nedělej nic 00
SWAP A výměna čtveřic bitů v A C4
DJNZ R5, -10H dekrementace reg. R5, DD F0
skok na relativní adresu, jestliže obsah registru R5 není nula
Pokud pro některé aplikace rozsah vnitřní paměti nestačí, je možno ji doplnit pamětí vnější a to jak pamětí dat v rozsahu 64 kB, tak pamětí programu v rozsahu rovněž 64kB. Adresy pro tyto paměti se potom nacházejí na vývodech portů P0 a P2, data pak na vývodech portu P0. Zápis do paměti a čtení z paměti řídí řídící sběrnice, sestávající z drátů PSEN, ALE, RD a WR. Poslední dva dráty jsou vedeny z portu P3. Na vývodech portu P0, P2, P3 je tedy časový multiplex, což znamená, že po určitou dobu je na vodičích jeden signál (např. adresy) a pak jistou dobu je zde jiný signál (např. data nebo výstup příslušného portu). Platnost dat, adres či jiných signálů určují vodiče řídící sběrnice.
Mikroprocesor 8051 obsahuje dva čítače/časovače. Jsou to šestnáctibitové čítače, které mohou čítat buď impulsy, přicházející zvějšku anebo časovat pomocí vniřních hodin. Jsou přednastavitelné programem a při přetečení mohou vyvolat přerušení.
Stručně o některých dalších mikroprocesorech
Kromě mikroprocesorů I 8080 a 8051 existuje ještě celá řada dalších mikroprocesorů různých světových výrobců. Uveďme si alespoň některé z nich, především ty, které se u nás v minulosti používaly či dosud používají.
Mikroprocesor Z 80 je výrobek firmy Zilog. Byl uveden na trh v roce 1976. Na rozdíl od mikroprocesoru I 8080 má jediné napájení +5V . Je v pouzdře DIL 40 a obsahuje 8000 tranzistorů. Stejně jako I 8080 má adresovou sběrnici o šířce 16b a datovou sběrnici 8b. Oproti I 8080 má zdvojené pracovní registry a obsahuje obdobu 8224 a 8228. Jeho instrukční soubor obsahuje 158 instrukcí. Instrukční soubor I 8080 se svými 78 instrukcemi je tedy pouze podmnožinou instrukčního souboru Z 80. Mezi novými instrukcemi jsou na příklad instrukce pro blokový přenos dat, blokové vyhledávání anebo instrukce posunu vlovo či vpravo. Mikroprocesor Z 80 obsahuje registr pro refresh.
Firma Zilog nabízí k mokroprocesoru Z 80 čtyři programovatelné obvody a to:
Z 80 – PIO (PARALLEL INPUT/OUTPUT CONTROLLER) – obvod paralelního styku vstup/výstup
Z 80 – SIO (SERIAL INPUT/OUTPUT CONTROLLER) – obvod seriového styku vstup/výstup
Z 80 – CTC (COUNTER/TIMER CONTROLLER) – generátor hodinových pulsů, čítač/časovač
Z 80 – DMA (DIRECT MEMORY ACCESS CONTROLLER) – obvod přímého vstupu do paměti
Rovněž všechny tyto programovatelné obvody mají jediné napájení a to +5V.
Jiným mikroprocesorem, který navazoval na typ I 8080 je mikroprocesor I 8085 firmy INTEL. Tento mikroprocesor obsahuje 7000 tranzistorů, má jediné napájení +5V a je umístěn v pouzdře DIL 40. Stejně jako I 8080 má adresovou sběrnici o šířce 16b a datovou sběrnici 8b. Nižších 8b adresy je však sdíleno s datovou sběrnicí časovým multiplexem. Instrukční soubor je v podstatě stejný jako u I 8080. Jsou zde však rozmanitější možnosti přerušení a není zde již zapotřebí 8224 a 8228. K tomuto mikroprocesoru vyvinula firma Intel speciální podpůrné obvody I 8155, I 8355 a I 8755, ve kterých jsou již zabudovány obvody k oddělení datové sběrnice od nižžších osmi bitů sběrnice adresové.
V roce 1978 uvedla firma Intel na trh šestnáctibitový mikroprocesor I 8086. Má šestnáctibitovou datovou a až dvacetibitovou adresovou sběrnici. Instrukční soubor obsahuje 97 instrukcí. Vzhledem k tomu, že jde o mikroprocesor šestnáctibitový, jeho instrukční soubor není kompaktibilní s instrukčními soubory I 8080 a I 8085. Určitou novinkou je zde to, že instrukce se řadí postupně do jakési šestičlenné „fronty“, kde čekají na dekódování.
I 8086 obsahuje 29000 tranzistorů, jeho taktovací frekvence je 5-8MHz a je umístěn v pouzdře DIL 40.
Uveďme zde alespoň názvy typů dalších mikroprocesorů, které se používaly jako procesorová jednotka v PC. Byl to typ 80186, který však se příliš nepoužíval, dále typy 80286, 80386, 80486 a 80586. Alespoň u jednoho z nich si řekněme základní parametry. Bude to typ 80486, který byl firmou Intel uveden na trh v srpnu 1989. Tento mikroprocesor má 1,2 milionů tranzistorů, datovou sběrnici širokou 32b, rovněž tak adresovou sběrnici o šířce 32b, jeho taktovací frekvence je 20 nebo 33MHz.
V této souvislosti by bylo vhodné přičinit malou poznámku o zahřívání integrovaných obvodů. Pokud je v jednom pouzdře složitější struktura typu TTL, která obsahuje mnoho tranzistorů, pak se při provozu může pouzdro zahřívat. Klasické tranzistory mají totiž poměrně velký kolektorový proud. Proto mikroprocesory jsou osazeny tranzistory řízenými polem, které mají proud nesrovnatelně menší. Přesto však, pokud počet tranzistorů v jednom pouzdře je příliš veliký, může i zde docházet k zahřívání pouzdra, a proto v PC je nutno vhodným způsobem chladit procesor (např. nuceným oběhem vzduchu).
Pokud jde o jednočípové mikroprocesory, těch nabízí firma Intel kromě již dříve zmíněného 8051 celou řadu. Uveďme si zde v přehledu alespoň některé z nich :
Typ počet I/O portů paměť dat vnitřní paměť programu
8035 3 64B nemá
8048 3 64B 1 kB ROM
3 64B 1 kB EPROM
8031 4 128B nemá
8051 4 128B 4 kB ROM
8751 4 128B 4 kB EPROM
8096 5 255B nemá
8396 5 255B 8 kB ROM
8796 5 255B 8 kB EPROM
V poslední době se na trhu objevila celá řada mikroprocesorů nové generace a to tak zvané mikrokontrolery PIC. Jsou to mikroprocesory typu RISC (Reduced Instruktion Set Computing). Tyto mikroprocesory mají ve svém instrukčním souboru malý počet instrukcí, které však lze vykonat během jednoho taktu, z čehož plyne jejich vysoká výkonnost.
Pomocné obvody mikroprocesorů
Mikroprocesor potřebuje ke své činnosti další obvody. S některými z nich jsme se již alespoň letmo seznámili (8224, 8228) u jiných jsme si řekli alespoň název a funkci (Z80-SIO, Z80-PIO, 8155 aj.). Těchto obvodů je velké množství a nebylo by v našich silách se podrobně seznámit se všemi. Proto zde bude pojednáno jen o několika obvodech, které se často používají a s nimiž se žáci pravděpodobně setkají. Začněme poměrně jednoduchým obvodem 3205, který je znám také jako 8205 – dekodér. Do jisté míry podobný je obvod MH 74138. Rozmístění vývodů 3205 a jeho logický symbol jsou nakresleny níže:
O0 A0 O1
A1 O2
A2 O3
O4
E1 O5
E2 O6
E3 O7
|
8 9
Tento integrovaný obvod je převodník binárního kódu (vstupy A0, A1, A2) na kód 1 z 8. Je vyroben technologií TTL a s obvody TTL je také slučitelný. Jeho funkční tabulka je poměrně obsáhlá:
Adresy Aktivační vstupy Výstupy
A0 A1 A2 E1 E2 E3 0 1 2 3 4 5 6 7
L L L L L H L H H H H H H H
H L L L L H H L H H H H H H
L H L L L H H H L H H H H H
H H L L L H H H H L H H H H
L L H L L H H H H H L H H H
H L H L L H H H H H H L H H
L H H L L H H H H H H H L H
H H H L L H H H H H H H H L
X X X L L L H H H H H H H H
X X X H L L H H H H H H H H
X X X L H L H H H H H H H H
X X X H H L H H H H H H H H
X X X H L H H H H H H H H H
X X X L H H H H H H H H H H
X X X H H H H H H H H H H H
Obvod 3205 je určen především pro dekódování adres pamětí nebo vstupů/výstupů. Je-li MH 3205 aktivován (tj. je – li E1=L, E2=L a E3=H), pak je jeden z jeho osmi výstupů v úrovni L, čímž je vyvolána aktivace odpovídající stránky v paměti nebo vstupu/výstupu. Ostatní výstupy jsou v úrovni H.
Na níže nakresleném zapojení je znázorněno použití 3205 jako dekodér jedné z osmi stránek paměti. Předpokládejme, že paměť programu se skládá z osmi 2k pamětí (stránek) například MHB 2716. Adresy A0-A10 jsou vedeny paralelně na adresovací vstupy jednotlivých pamětí, kdežto adresy A11-A13 jsou přivedeny na vstupy 3205. Výstupy 0-7 jsou vedeny na aktivační vstupy CS jednotlivých pamětí a tak rozhodují, která paměť (jediná z osmi) může být v aktivním stavu a vysílat data na datovou sběrnici (paralelně spojené datové výstupy jednotlivých pamětí). Pokud by to bylo třeba, je možno přivést výstupy všech pamětí do třetího stavu pomocí některého ze vstupů E1, E2, E3.
DATA BUS
A0 A1 A2 E1 E2 E3
A11
A12
A13
+5V
Pokud bychom potřebovali řídit více než 8 pamětí, je možno tuto úlohu řešit pomocí několika obvodů 3205. Ukažme si na závěr, jak je možno řešit úlohu řízení 24 pamětí. Je to samozřejmě jen jedna z možností využití několika obvodů 3205.
A0 O0 A1 O1 A2 O2 O3 O4 E1 O5 E2 O6 E3 O7 A0 O0 A1 O1 A2 O2 O3 O4 E1 O5 E2 O6 E3 O7 A0 O0 A1 O1 O2 A2 O3 O4 E1 O5 E2 O6 E3 O7
Obvod pro řízení 24 pamětí je nakreslen
níže. Předpokládejme, že jde opět o paměti MHB 2716, které mají kapacitu 2kB.
Adresové vodiče A0-A10 jdou přímo na adresové vstupy všech pamětí, adresové
vodiče A11-A15 jsou použity jako vstupní vodiče dekodéru 1 z 24. Jako vstupy
dekodéru jsou použity i vstupy obvodů 3205 E1, E2, E3. Každý ze tří obvodů 3205
je v činnosti jen tehdy, je-li E1=E2=L a E3=H. U prvního z nich to
znamená, že A13=L, A14=L, u druhého A13=H, A14=L a u třetího A13=H, A14=L.
Každý z nich tedy „obhospodařuje“ svoji třetinu adres to znamená, že první
má rozsah adres od adresy 000000000000002 do adresy 001111111111112.
Druhý obvod 3205 má na starosti adresy 010000000000002 –
011111111111112 a konečně třetí má adresy 100000000000002
– 101111111111112.
A11
A12
A13
A14
A15
+5V
Výstupy CS0-CS23
Jako další obvod si probereme obousměrné zesilovače MH 3216 a MH 3226 známé též pod označením 8216 a 8226. Tyto obvody jsou identické co do pouzdra i co do funkce, pouze obvod 3216 procházející signál přenáší beze změny zatímco obvod 3226 procházející signál invertuje.
Obvody 3216 a 3226 jsou obousměrné výkonné čtyřbitové zesilovače, určené především jako budiče sběrnic. Obsahuje čtyřbitovou vstupní sběrnici DI (data imput), čtyřbitovou výstupní sběrnici DO ( data output) a čtyřbitovou obousměrnou sběrnici DB (data bus). Pomocí vstupů DIEN a CS je možno přepínat směr přenosu dat či uvést sběrnice do 3. tavu.
Níže je nakresleno logické schema a funkční tabulka 3216 resp. 3226.
DIEN CS činnost
L L DI DB
H L DB DO
DIEN L H 3. stav
H H 3. stav
CS
Obvod je umístěn v pouzdře DIL 16, napájí se 5V. Výstupní napětí v logické 0 je pro DB i pro DO 0-0.45V při proudu 25mA (DB) resp. 15mA (DO). Výstupní napětí v logické 1 je větší než 2,4V při proudu lmA (DO) resp. 10 mA(DB). Odběr proudu ze zdroje +5V je menší než 130 mA.
Jiným obousměrným zesilovačem je obvod 8286 resp. 8287. Logický symbol a logická tabulka jsou níže. Je třeba říci, že oba obvody jsou identické pouze 8286 neinveruje a 8287 invertuje procházející signál.
+5V
A1 B1
A2 B2
A3 B3
A4 B4
A5 B5
A6 B6
A7 B7
T OE
19 T OE činnost
18
17 H L A B
16 L L B A 5 15 X H 3. stav na A i B
14
13
12
Jak vidíme, je zde osmibitová sběrnice A a osmibitová sběrnice B. Pomocí vstupů OE a T můžeme řídit, která sběrnice bude jako vstupní a která bude výstupní popřípadě, kdy jsou obě sběrnice ve třetím stavu. Je- li sběrnice A jako výstupní ve stavu L, lze každý její výstup zatížit 16 mA. Jestliže sběrnice B pracuje jako výstup, pak každý její drát lze zatížit ve stavu L proudem 32 mA. Ve stavu H je možno výstupy A zatížit 1 mA, kdežto výstupy B za těchže okolností 5mA.
Oboustranný budič sběrnice 8286 i 8287 jsou zapouzdřeny v pouzdře DIL 20. Napájí se napětím 5V.
Podpůrné obvody pro mikroprocesory, které jsme dosud poznali, mají pevně stanovenou funkci, kterou lze zjistit v katalogu. Existuje však řada obvodů, jejichž funkci lze modifikovat. Tyto obvody se nazývají programovatelné, protože jejich funkci si mikroprocesor může sám naprogramovat. Jedním z nich je obvod 8255 – vstupy a výstupy.
PPI (Programable Peripheral Interface) typu 8255 je víceúčelový obvod pro vstup a výstup z počítače. Obsahuje 3 osmibitové obousměrné brány neboli 24 programovatelných vývodů. Se svým řídícím mikroprocesorem komunikuje pomocí datové sběrnice. Je plně slučitelný s TTL logikou, jeho pouzdro je DIL 40, má jediné napájení +5V. Schematické znázornění 8255 je nakresleno níže:
RESET
CS
RD
WR
A0
A1
Jak vidíme, z 8255 jdou tři obousměrné osmibitové brány neboli porty a to PA, PB a PC. Každou z těchto bran lze naprogramovat buď jako vstupní nebo jako výstupní. Naprogramování provádí mikroprocesor pomocí řídících vstupů RD, WR, A0 a A1. Vstup RESET uvede 8255 do definovaného výchozího stavu, vstup CS může datovou sběrnici D uvést do třetího stavu. Datová sběrnice je připojena na datovou sběrnici mikroprocesoru a po ní vstupují do 8255 data, která pak vystupují na některý z portů anebo naopak data, která vstupují do některého z portů PA, PB či PC jsou vysílána po datové sběrnici do mikroprocesoru. Je zde však ještě jedna možnost a to ta, že po datové sběrnici je do 8255 vysláno řídící slovo CW. Toto řídící slovo určuje funkci obvodu.
Obvod 8255 umožňuje velmi široké spektrum různých možností. Nemělo by význam je zde všechny rozebírat, ale bude účelné se seznámit alespoň s funkční tabulkou základních operací:
A1 A0 RD WR CS ČTENÍ
0 0 0 1 0 Brána A datová sběrnice D
0 1 0 1 0 Brána B datová sběrnice D
1 0 0 1 0 Brána C datová sběrnice D
A1 A0 RD WR CS ZÁPIS
0 0 1 0 0 datová sběrnice D Brána A
0 1 1 0 0 datová sběrnice D Brána B
1 0 1 0 0 datová sběrnice D Brána C
1 1 1 0 0 datová sběrniceD CWR
A1 A0 RD WR CS PASIVNÍ FUNKCE
X X X X 1 datová sběrnice D 3. stav
X X 1 1 0 datová sběrnice D 3. stav
Na závěr dodejme, že obvod 8255 byl původně vyvinut pro mikroprocesor I 8080, nicméně je možno jej použít i pro jiné mikroprocesory. S hlediska použitelnosti je to nejpoužívanější programovatelný obvod.
Multiprocesorová komunikace
V praxi je často třeba řešit úkol přenosu dat mezi mikroprocesorem a periferií nebo mezi dvěma či více mikroprocesory. Přenos dat se může dít zásadně dvěma způsoby a to buď paralelně nebo seriově. Paralelní způsob přenosu dat znamená u osmibitového mikroprocesoru, že osm bitů je přenášeno najednou po osmi vodičích a jejich platnost je potvrzována na některém vodiči řídící sběrnice (RD, WR, I/O R, I/O W ap.). Tento přenos jsme již poznali, a proto se jím nebudeme zabývat. Seriový přenos dat znamená, že data jsou přenášena po jediném vodiči a to jeden bit po druhém. Tento přenos je v současné době perspektivnější, a proto bude účelné si probrat alespoň základní pojmy. Jako příklad realisace seriového přenosu dat nám poslouží seriový kanál mikroprocesoru 8051.
Seriový přenos dat může být buď synchronní nebo asynchronní. Synchronní přenos dat potřebuje dva dráty. Jednak drát, po kterém se přenáší data a jednak drát, po kterém jdou impulsy, které synchronisují přenos. Asynchronní přenos má pouze jeden drát.
Osvětleme si rozdíl mezi synchronním a asynchronním přenosem dat pomocí časového průběhu výstupů RxD a TxD u procesoru 8051. Budiž zde řečeno, že seriový kanál 8051 lze nastavit programově do některého ze čtyř módů a to módy 0, 1, 2, 3. Níže jsou nakresleny průběhy při seriovém přenosu dat v módu 0 (synchronní) a v módu 1 (asynchronní).
TxD
D7 D6 D5 D4 D3 D2 D1 D0
RxD
Časování seriového kanálu v módu 0
start bit stop bit
TxD (vysílání)
D0 D7 D6 D5 D4 D3 D2 D1
nebo
RxD(příjem)
Časování seriového kanálu v módu 1
Jak vidíme na výše nakreslených časových průbězích, mikroprocesor 8051 při seriovém přenosu dat v módu 0 používá vývod TxD pro přenos synchronizačních impulsů, kdežto vývod RxD pro přenos dat. Přenos dat je v tomto případě simplexní, to znamená že data se buď vysílají nebo přijímají. Naproti tomu v módu 1 je možný provoz duplexní, to znamená, že lze současně data vysílat (vývod TxD) i přijímat (vývod RxD). V módu 1 se tedy seriový kanál mikroprocesoru 8051 chová jako UART (Universal Asynchronous Receiver / Transmitter). Přenos dat v módu 1 začíná tak zvaným start bitem, pak následuje osm datových bitů počínaje nejnižším D0 a konče nejvyšším D7 a po něm následuje tak zvaný stop bit.
Seriový přenos dat v módu 0 nebo 1 je použitelný při komunikaci mezi mikroprocesorem a periferií anebo mezi dvěma mikroprocesory. Pokud by však bylo třeba, aby spolu komunikovaly více než dva mikroprocesory, pak je vhodnější použít seriový přenos dat v módu 2 nebo 3.
TB8 nebo RB8
start bit stop bit
TxD (vysílání)
D0 D7 D6 D5 D4 D3 D2 D1
nebo
RxD (příjem)
Časování seriového kanálu v módu 2 a 3
Přenos dat seriovým kanálem v módu 2 nebo 3 se liší od přenosu v módu 1 tím, že je zde kromě osmi přenášených datových bitů ještě devátý bit. Tento bit je bit TB8 z registru SCON na vysílací straně a na přijímací straně se ukládá do registru SCON jako bit RB8. Tento devátý bit je možno použít např. jako bit pariní.V multiprocesorové komunikaci jej lze využít k rozlišení dat a adresy. Dodejme, že módy 2 a 3 se od sebe liší pouze přenosovou rychlostí. Nakresleme si blokové schema takové multiprocesorové komunikace:
TxD RxD
TxD RxD
Na výše nakresleném obrázku vidíme zapojení dvou mikroprocesorů 8051, které si vyměňují data po seriovém kanále. Oba dva jsou nastaveny do stejného módu 1 – duplexní provoz a oba mají také stejnou přenosovou rychlost. Jeden z mikroprocesorů může být nahrazen periferií a přenos se může dít v módu 0 – simplexní provoz.
Složitější situace nastane, jestliže je třeba přenášet data mezi několika mikroprocesory:
Slave 1
Adresa : 51H
Adresa: 52H
Slave 2 Adresa : 53H Adresa: 54H TxD RxD |
Adresa: 55H
Adresa: 56H
TxD RxD
Master Adresa: 50H TxD RxD |
Příjem
Vysílání
Při multiprocesorové komunikaci po seriové lince bude jeden z mikroprocesorů označen jako master – řídící – zatímco ostatní jsou slave – podřízené. Všem slave mikroprocesorům jsou přiděleny dvě adresy a to pro příjem (51H, 53H, 55H) a pro vysílání (52H ,54H ,56H ). Master má pouze jednu adresu pro příjem.
Při vysílání vyšle master ze svého výstupu TxD do vstupů RxD slave mikroprocesorů jako první skupinu znaků adresu. Aby ji odlišil od dat, je v devátém bitu logická 1. Tato adresa je adresou pro příjem. Slave mikroprocesor, jehož adresa byla vyslána, přijme následující data, zatímco ostatní mikroprocesory je ignorují. Data mají v devátém bitu logickou nulu.
Jestliže naopak je třeba, aby z některého slave mikroprocesoru byla vysílána data do master mikroprocesoru, pak řídící mikroprocesor vyzve některý z podřízených mikroprocesorů k vyslání dat adresou pro vysílání. Data se vysílají z výstupu TxD slave mikroprocesoru do vstupu RxD master mikroprocesoru. Vzhledem k tomu, že je zde na jeden vstup třeba připojit více výstupů, je nutné použít přepinače – multiplexeru. Je – li tedy některý z podřízených mikroprocesorů vyzván k vysílání, musí nejprve vhodně přepnout multiplexer, aby se data, která vysílá z výstupu TxD dostala na vstup RxD řídícího mikroprocesoru.
To, co zde bylo o multiprocesorové komunikaci uvedeno, samozřejmě nevyčerpává celou problematiku. Přesto snad dalo alespoň hrubou představu o tom, jak taková komunikace vypadá a jaké zde mohou nastat problémy.
Převodníky D/A a A/D
Analogový signál lze zaznamenat buď v analogové formě (na příklad na magnetofonovou pásku) anebo digitálně. V současné době je tendence analogový signál ukládat v digitální formě, protože digitální záznam je v některých ohledech výhodnější. Je to na příklad odolnost vůči šumu anebo je trvanlivost záznamu.
Převedení analogového signálu do digitální formy se nazývá digitalisace a provádí ji A/D převodník (analogově-digitální převodník). Většinou jde o převod měnícího se napětí do digitální formy. Pomiňme zde digitální voltmetry, které jsou vlastně rovněž A/D převodníky, nicméně jejich doba převodu je příliš dlouhá vzhledem k rychlosti změn např v audiosignálu.
Ukažme si zde princip převodu napětí měnícího se v čase na digitální signál:
u(t)
t
Jak vidíme, analogový signál se v pravidelných intervalech vzorkuje, to znamená, že se zjišťuje jeho okamžitá hodnota, která se pak digitalisuje a ukládá ve formě digitálního čísla. Jak je zřejmé, pro co nejvěrnější zaznamenání průběhu analogového signálu by bylo žádoucí získat co největší počet vzorků. Proti tomu však stojí omezující faktory: rychlost A/D převodníku a velikost paměti. Při zvětšování počtu vzorků se zkracuje doba mezi vzorky. A/D převodník musí převod ukončit nejpozději při příchodu dalšího vzorku., což je limitujícím faktorem pro počet vzorků na jednotku času. Pokud jde o rozsah paměti, počet vzorků je třeba volit tak, aby se všechny vešly na paměťové medium, které je k disposici. O rychlosti vzorkování (respektive o počtu vzorků za jednotku času) platí Kotělnikovův teorem, který říká, že kmitočet vzorkování musí být vyšší než dvojnásobek nejvyššího kmitočtu, který se v analogovém signálu nachází.
Nepřesnost převodu analogového signálu na digitální, způsobená konečným počtem vzorků, není jediná. Je zde ještě jiná nepřesnost způsobená tím, že číselné vyjádření má vždy pouze omezenou přesnost. Představme si, že bychom analogový signál převáděli na osmibitové digitální číslo. Pak bychom mohli vyjádřit 256 různých hodnot na příklad 0, 1, 2, …..255mV. Pokud by napětí bylo na příklad 25,4mV, převodník by je zaokrouhlil buď na 25mV nebo na 26mV. Je jasné, že čím větší počet bitů výsledného digitálního čísla, tím přesnější bude vyjádření okamžité hodnoty. Zvětšování počtu bitů naráží zase na některé technické potíže mimo jiné opět rozsah paměti.
Přes uvedené principiální nedostatky je nutno konstatovat, že digitální záznam zvuku či obrazu je moderní a perspektivní a úspěšně vytlačuje záznam analogový. V současné době mají A/D převodníky většinou 8 nebo 12 bitů. Pro zajímavost uveďme, že mikroprocesor 8096 v sobě obsahuje desetibitový A/D převodník.
Popišme si, jak převodník A/D pracuje. Nejjednodušší princip je srovnávání dvou napětí a to napětí vzorku a napětí schodovitého charakteru. Toto napětí vyrábí D/A převodník, na jehož vstup je připojen binární čítač. V okamžiku, kdy napětí schodovitého průběhu je větší než napětí vzorku, se zastaví čítání a binární číslo z výstupu čítače je zaznamenáno jako binární ekvivalent napětí vzorku. Tento princip má obdobu u digitálního voltmetru. Je to ovšem převod poměrně pomalý a délka převodu závisí na velikosti napětí vzorku.
Jiným principem je princip postupné aproximace (použitý v již zmíněném 8096). Zde se srovnává napětí vzorku opět s napětím známým, avšak počet kroků je zde pouze tolik, kolik bitů má výsledné digitální číslo. Vezměme si jako příklad opět A/D převodník, který napětí v rozsahu 0 – 255mV převede na osmibitové číslo. Předpokládejme, že velikost napětí vzorku bude 135mV. Při použití principu srovnání se chodovým napětím by bylo třeba 135 kroků. Zde bude stačit pouhých osm kroků. Nejprve srovnáme napětí vzorku s polovinou maximálního rozsahu napětí t. j. se 128mV. Zjistíme, že napětí vzorku je vyšší. Proto do nejvyššího bitu zapíšeme logickou 1. K napětí poloviny rozsahu (128 mV) přičteme napětí čtvrtiny rozsahu (64 mV) a vzorek tudíž porovnáme se 194 mV. Zjišťujeme, že napětí vzorku je nižší, a proto do druhého nejvyššího bitu napíšeme logickou nulu, 64mV odebereme a k napětí 128 mV přičteme napětí osminy rozsahu tj. 32 mV. Zjistíme, že napětí vzorkuje opět nižší než 160 mV. Napíšeme tedy opět logickou nulu do dalšího bitu a vrátíme se znovu k 128 mV, ke kterým přičteme tentokrát 16 mV. Srovnáme napětí vzorku se 144mV a vidíme, že opět musíme napsat do dalšího bitu logickou nulu a 16 mV odebrat. V dalším budeme srovnávat napětí vzorku s napětími 136mV, 132mV, 134mV a 135mV a psát budeme postupně do dalších bitů 0, 1, 1, 1.
Jakkoli je princip postupné aproximace poměrně rychlý, přesto někdy ani on nepostačuje. Proto byl vyvinut ještě rychlejší princip, kdy převod se děje prakticky v jediném kroku. Blokové schema takového převodníku je nakresleno níže:
.
Q3 .
.
.
Komparátor 6
Q2
Komparátor 4
Q1
Komparátor 3
vstup
Komparátor 2
Q0
Princip převodníku je poměrně jednoduchý: každý z 256 komparátorů má na svém výstupu buď logickou jedničku a to v případě, že vstupní napětí není v rozsahu, na který je nastaven anebo logickou nulu, pokud vstupní napětí v tomto rozsahu leží. Pokud bychom nastavili na příklad komparátor 0 na napětí 0-0,5mV, komparátor 1 na napětí 0,5-1,5mV, komparátor 2 na rozsah napětí 1,5-2,5 mV ……….a konečně komparátor 255 na napětí 254,5 – 255,5 mV, pak by pro jakékoli napětí v rozsahu 0 – 255,5mV na vstupu převodníku byla na všech drátech logická 1 a na jednom logická nula. Převodník by pak tento kód 1 z 256 převedl na binární osmibitové číslo.
Skutečné schema se může od zde uvedeného lišit a rovněž princip převodu může být poněkud modifikován. S hlediska uživatele to však není příliš podstatné, protože převodníky se vyrábějí jako jeden integrovaný obvod, o jehož vnitřní strukturu se nemusí uživatel příliš zajímat.
Na závěr dodejme, že existují i jiné převodníky A/D než pouze převodník napětí-číslo. Je to na příklad převodník kmitočet-číslo (typický příklad: čítač) nebo teplota-číslo (digitální teploměr) atp.
Obraťme nyní svoji pozornost na D/A převodníky. Tyto převodníky dovedou převést binární číslo na odpovídající analogovou veličinu – zpravidla napětí nebo proud. Jde zpravidla o sadu bezkontaktních spínačů, které spínají přesně definovaný proud nebo napětí. Tyto převodníky potřebují zdroj referenčního napětí, který tvoří buď samostatný zdroj anebo je tento referenční zdroj integrován do jednoho pouzdra společně s převodníkem.
Jestliže bychom chtěli z digitalisovaného průběhu analogového signálu zpětně rekonstruovat původní signál, pak zjistíme, že rekonstruovaný signál se od původního liší. Nejde jen o nepřesnosti při digitalisaci, o kterých jsme si řekli již dříve, ale přistupuje sem i nepřesnost při rekonstrukci. Kdybychom postupovali tak, že na výstupu D/A převodníku vytvoříme napětí, odpovídající velikosti napětí prvého vzorku, toto napětí bychom zde ponechali až do doby, kdy máme zrekonstruovat druhý vzorek, pak bychom ponechali napětí druhého vzorku až do doby rekonstrukce třetího vzorku atd., obdrželi bychom schodovitý průběh. Rozdíl mezi původním průběhem a rekonstruovaným průběhem se nazývá kvantovací šum. Lépe to snad objasní obrázek:
u(t)
t
Jak je z obrázku zřejmé, kvantovací šum bude tím menší, čím hustší bude vzorkování. Někdy se spojnice mezi dvěma vzorky nedělá jako vodorovná čára, nýbrž jako čára šikmá. Její sklon se odvodí od sklonu, který by měla spojnice předchozích dvou vzorků. I tím způsobem lze snížit kvantovací šum.
& 31. července 2000
Mikrořadiče PIC 16CXX
Rodina mikrořadičů PIC 16CXX je poměrně rozsáhlá, a proto není dost dobře možné zde probrat všechny její členy. Proto zde budou zmíněny jen někteří její členové jako zástupci celé rodiny.
Mikrořadiče 16C54 a 16C56
Mikrořadiče PIC 16C54 a 16C56 jsou jednočípové mikroprocesory s Harvardskou strukturou. Vnitřní paměť programu EPROM tvoří 512 slov po 12 bitech u 16C54 respektive 1024 slov po 12 bitech u 16C56. Vnitřní paměť dat RAM tvoří 32 slov po 8 bitech.
Mikrořadiče PIC 16C54 a PIC 16C56 jsou dodávány v několika variantách, které se od sebe liší napájecím napětím Vdd, obvodem oscilátoru, napájecím proudem a maximálním kmitočtem oscilátoru:
Typové označení Vdd fosc do Idd obvod oscilátoru
PIC 16C54 (56) XT 3-6,25V 4MHz 1,8-3,3mA externí krystal
PIC 16C54 (56) RC 3-6,25V 4MHz 1,8-3,3mA externí RC
PIC 16C54 (56) HS 4,5-5,5V 20MHz 4,8-20mA externí krystal
PIC 16C54 (56) LP 2,5-6,25V 40kHz 15 mA-32 mA externí krystal
Mikrořadiče PIC 16C54 a PIC 16C56 jsou zapouzdřeny do pouzdra s 18 vývody. Rozmístění vývodů je nakresleno níže:
Funkce jednotlivých vývodů:
RA0 - RA3 – I/O vývody (pins) kanálu A
RB0 - RB7 – I/O vývody (pins)kanálu B
RTCC – vstup hodinového kmitočtu do čítače/časovače
MCLL – master clear = hlavní nulování
OSC1 – oscilátor
OSC2/CLKOUT – oscilátor, clock out = výstup hodin
Vdd – kladné napájecí napětí
Vss – zemnící vývod
Parametry I/O vývodů kanálů A a B:
Při vstupním režimu:
UL = Vss – 0,2 Vdd UH = 0,45 Vdd – Vdd Ivst = -1mA – +1mA
Při režimu výstupním:
UL £ 0,6 V při Ivýst = 8,7 mA a Udd = +4,5V
UH ³ 0,7 Vdd Ivýst = -5,4 mA
Vnitřní zapojení jednoho I/O vývodu je nakresleno níže:
Pokud jde o vývod RTCC (vstup hodinového kmitočtu do čítače/časovače), pak úrovně napětí jsou tyto:
UL £ 0,15 Vdd UH ³ 0,85 Vdd při vstupním proudu od –3mA do +3mA
Vývod MCLR je obdobou vývodu RESET u jiných mikroprocesorů. Mikrořadič se resetuje logickou nulou. Napětí pro logické úrovně jsou tyto:
UL £ 0,15 Vdd UH ³ 0,85 Vdd při vstupním proudu od –5mA do +5mA
V této souvislost je ovšem nutno říci, že mikrořadič se při zapnutí napájecího napětí resetuje sám. Vývod MCLR je nutno použít pouze při pomalém náběhu Vdd (< 0,05 V/ms) anebo je-li čas potřebný na rozběh oscilátoru delší než 9 ms. Po resetování začne běh programu na poslední adrese (1FFH resp. 3FFH). Zapojení obvodu, který po zapnutí napájecího napětí zajistí resetování, je nakresleno níže:
Pokud jde o vývody OSC1 a OSC2, výstupní napětí pro logické úrovně jsou tyto:
UL £ 0,6 V při proudu 8,7 mA UH ³ Vdd – 0,7 V při proudu –5,4 mA a to vše při napájecím napětí Vdd = 4,5 V.
Zapojení oscilátorového obvodu s externím krystalem a s externím RC obvodem jsou nakreslena níže
Pokud bychom chtěli použít vnější zdroj hodinového kmitočtu, pak by tento zdroj byl zapojen do vývodu OSC1, kdežto vývod OSC2 by zůstal nezapojen. Logické úrovně tohoto vnějšího zdroje hodinového kmitočtu by byly tyto:
UL = 0 - 0,3 Vdd UH = 0,7 Vdd - Vdd při vstupním proudu od –3mA do +3mA
Podívejme se nyní na vnitřní strukturu mikrořadiče PIC 16C54 respektive PIC 16C56. Jak již bylo řečeno, mikrořadič má Harvardskou strukturu. Nemá na rozdíl od jiných mikroprocesorů možnost přerušení. Pokud jde o návratové adresy, pak jsou zde pouze dva stack pointry do kterých lze uložit návratové adresy, takže je možné pouze jedno vnoření podprogramu. Registr PC (program counter) má 9 bitů (PIC 16C54 ) respektive 10 bitů (PIC 16C56). Oba stack pointry mají stejný počet bitů jako PC.
ALU (aritmeticko-logická jednotka) provádí aritmetické a logické operace mezi daty umístěnými v 8-mi bitovém registru W (Working Register – pracovní registr) a daty umístěnými v libovolném registru. Podle výsledku operace se nastavují příznakové bity C, DC a Z v registru SWR.
Univerzální 8-mi bitové registry jsou umístěny v paměti dat. Na adresách 08H – 0FH se nalézají ty registry, které jsou činné bez ohledu na to, která banka registrů je vybrána. Další registry jsou organizovány do čtyř bank registrů a to banka 0 na adresách 10H – 1FH, banka 1 na adresách 30H – 3FH, banka 2 na adresách 50H – 5FH, banka 3 na adresách 70H – 7FH.
Pokud jde o speciální registry, uveďme si zde alespoň některé důležitější:
Registr nepřímého adresování
Hodiny/čítač reálného času (RTCC) – 8 bitů
PC – program counter
SWR (Status Word Registr) – registr stavového slova – 8 bitů
I/O registry – 4 bitový (port A) nebo 8 bitový (port B)
FSR (File Select Register) – registr výběru z pole registrů – 8 bitů
Podívejme se nyní na mikrořadič PIC 16C54 respektive PIC 16C56 s hlediska programování. Budiž řečeno, že po RESET jsou všechny porty nastaveny jako vstupní. Při vstupních operacích musí být data na vstupu přítomna po celou dobu operace (není zde latch). Naproti tomu při výstupních operacích jsou na výstupu data přítomna až do jejich přepsání jinou hodnotou. Mikrořadič má instrukční soubor skládající se z 33 jednoslovných instrukcí. Ukažme si alespoň některé z nich:
ADDWF f, d znamená součet obsahu registru W s obsahem registru f
Je – li d = 0, pak se výsledek uloží do registru W
Je – li d = 1, pak se výsledek uloží do registru f
Nastavují se flagy C (přetečení)
DC (přenos mezi 3. a 4. Bitem)
Z (výsledek je nula)
Strojní kód: 0001 11df ffff
ANDLW k znamená logický součin obsahu registru W s konstantou k
Výsledek uloží do registru W
Nastavuje se flag Z (výsledek je nula)
Strojní kód: 1110 kkkk kkkk
ANDWF f, d znamená logický součin obsahu registru W s obsahem registru f
Je – li d = 0, pak se výsledek uloží do registru W
Je – li d = 1, pak se výsledek uloží do registru f
Nastavuje se flag Z (výsledek je nula)
Strojní kód: 0001 01df ffff
MOVL k znamená že se registr W naplní konstantou k
Strojní kód: 1100 kkkk kkkk
CALL k znamená skok do podprogramu PC+1 do SP
k do PC7 – PC0, PC8 = 0, PA2 - PA0 do PC11 – PC9
Strojní kód: 1001 kkkk kkkk
RETLW k znamená návrat z podprogramu; registr W je naplněn konstantou k
Strojní kód: 1000 kkkk kkkk
GOTO k nepodmíněný skok
k do PC8 – PC0, PA2 - PA0 do PC11 – PC9
Strojní kód: 101k kkkk kkkk
NOP nedělej nic
Strojní kód: 0000 0000 0000
Na závěr tohoto malého nahlédnutí do problematiky mikroprocesorů PIC 16C54 respektive PIC 16C56 si uveďme, že pro simulaci těchto i jiných mikrokontrolerů existuje simulátor MPSIM a pro jejich programování je k disposici programátor PICSTART.
Jak již bylo uvedeno, není možno probrat všechny typy mikrokontroleru PIC 16CXX. Přesto si zde uveďme jestě jeden, který je poněku složitější než výše zmíněné typy:
Mikrořadič 16C71
Mikrořadič PIC 16C71 je jednočípový mikroprocesor s Harvardskou strukturou. Vnitřní paměť programu EPROM tvoří 1024 slov po 14 bitech . Vnitřní paměť dat RAM tvoří 36 slov po 8 bitech.
Mikrořadiče PIC 16C71 jsou dodávány v několika variantách, které se od sebe liší napájecím napětím Vdd, obvodem oscilátoru, napájecím proudem a maximálním kmitočtem oscilátoru. Tak na příklad PIC 16C71 – 04 . P znamená, že rozsah Vdd je 4 – 6 V, maximální frekvence je 4 MHz, teplotní rozsah je 0 – 700C a pouzdro je standartní. Naproti tomu označení PIC 16LC71 – 20 I SO znamená, že rozsah Vdd je 3 – 6 V, maximální frekvence je 20 MHz, teplotní rozsah je -400C – +850C a pouzdro je SOIC (pro SMD).
Mikrořadiče PIC 16C71 jsou zapouzdřeny do pouzdra s 18 vývody. Rozmístění vývodů je nakresleno níže:
Funkce jednotlivých vývodů:
RA0 – RA4 – I/O vývody (pins) kanálu A
RA0 - RA3 lze využít jako vstup pro D/A převodník
RA4 lze využít jako vstup pro RTCC
RB0 - RB7 – I/O vývody (pins)kanálu B
RB0 lze využít jako vstup přerušení
RTCC – vstup hodinového kmitočtu do čítače/časovače
MCLL – master clear = hlavní nulování
OSC1 – oscilátor
OSC2/CLKOUT – oscilátor, clock out = výstup hodin
Vdd – kladné napájecí napětí
Vss – zemnící vývod
Mikrokontroler PIC 16C71 má podobně jako výše popsaný mikrokontroler PIC 16C54 Harvardskou strukturu. Ukažme si alespoň stručně, v čem se tyto dva mikrokontrolery od sebe liší, přesněji řečeno, v čem je mikrokontroler PIC 16C71 lépe vybaven.
Předně je zde možnost přerušení. V této souvislosti je nutno uvést, že startovací adresa po resetování je 000H, kdežto startovací adresa pro obsluhu přerušení je 004H. Zdroje přerušení jsou čtyři a to: vnější z vývodu RB0, přetečení čítače RTCC, ukončení převodu A/D převodníku a konečně změna stavu na vývodech RB7 – RB4. Všechna přerušení jsou maskovatelná.
PC má 13 bitů, kdežto paměť programu má pouze 1024 adres, k jejimuž adresování by postačilo 10bitů. Proto zde může docházet k překrývání adres
Pokud jde o A/D převodník, ten je osmibitový. Jeho vstupy mohou být na vývodech RA0, RA1, RA2 a RA3. Převod trvá desetinásobek cyklu hodin, minimálně 20 ms. Referenční napětí může být přivedeno z vnějšího zdroje na vývod RA3/AIN3/Vref nebo může být použito vnitřní zdroj Vdd.
Mikrořadič PIC 16C71 lze uvést do stavu Power Down mode, to jest do stavu spánku – SLEEP. Tento stav lze vyvolat instrukcí SLEEP, probuzení pak je možno provést resetem, přetečením WDT (hlídací časovač), vnějším přerušením, ukončením převodu v A/D převodníku nebo změnou na některém ze vstupů RB7 – RB4.
Tato kapitola měla za cíl poskytnout alespoň letmý pohled na mikrořadiče PIC 16CXX. Další informace o těchto bezesporu zajímavých obvodech si případný zájemce najde v příslušné literatuře na příklad Jiří Hrbáček: Mikrořadiče PIC 16CXX a vývojový kit PICSTART.
Dopsáno: 25. května 2001
DODATEK: Cvičné programy pro I 8051
Zkusme si ukázat několik jednoduchých programů pro I 8051. Zde je však nutno říci, že jde o skutečně velice jednoduché programy, jejichž účelem je pouze ilustrovat probranou látku.
Než přistoupíme k sestavování programů, je nutno objasnit některé základní pojmy. Musíme si říci, co jsou to tak zvané pseudoinstrukce u Assembleru I 8051. Jak známo, assemblerovský program se skládá z instrukcí, které překladač přeloží do strojního kódu. Pro řízení překladače se pak používají speciální povely – tak zvané pseudoinstrukce. Ty se do strojního kódu nepřekládají, nýbrž slouží pouze k ovládání překladače. Ukažme si zde alespoň některé pseudoinstrukce:
ORG – počátek programu ve strojním kódu na udané adrese
END – konec programu
; - oddělení komentáře
: - označení návěstí (labelu)
Zkusme si tedy sestavit první program. Našim úkolem je naplnit paměťové buňky na adresách 20H – 2FH ve vnitřní paměti dat konstantami a to buňku na adrese 20H číslem 40H, buňku na adrese 21H číslem 3EH, buňku na adrese 22H číslem 3CH ….. buňku na adrese 2EH číslem 24H a konečně buňku na adrese 2FH číslem 22H.
Tento úkol lze řešit různým způsobem. Velmi jednoduchý je na příklad tento:
ORG 0000H
MOV 20H, 40H
MOV 21H, #3EH
MOV 22H, 3CH
MOV 23H, #3AH
MOV 24H, 38H
MOV 25H, #36H
MOV 26H, 34H
MOV 27H, #32H
MOV 28H, 30H
MOV 29H, #2EH
MOV 2AH, 2CH
MOV 2BH, #2AH
MOV 2CH, 28H
MOV 2DH, #26H
MOV 2EH, 24H
MOV 2FH, #22H
END
V tomto programu je použito pseudoinstrukce ORG 0000H, což znamená, že překladač začne ukládat přeložený program (ve strojním kódu) od adresy 0000H. Pseudoinstrukce END znamená konec programu. A konečně instrukce (v obecné formě) MOV adr., #data znamená, že paměťová buňka ve vnitřní paměti dat na udané adrese se naplní danou konstantou.
Tento program lze samozřejmě sestavit i jinak:
0000 ;Program NAPLN - naplneni adres 20H-2FH konstantami 40H, 3EH, 3DH..
0000 ORG 000H ;pseudoinstrukce - zacatek programu na adrese 00H
0000 7820 MOV R0,#20H ;R0 (prvni adresa) = 20H
0002 7B10 MOV R3,#10H ;R3 (pocitadlo) = 10H
0004 7440 MOV A,#40H ;A (prvni konstanta) = 40H
0006 F6 START: MOV @R0,A ;poslani konstanty z reg. A na adresu @R0
0007 08 INC R0 ;dalsi adresa
0008 14 DEC A
0009 14 DEC A ;A-2-->A
000A DBFA DJNZ R3,START ;R3-1-->R3,je-li R3=0,pak konec,jinak na START
000C END ;pseudoinstrukce - konec programu
Takto sestavený program je kratší, na druhé straně není zase tak jednoduše pochopitelný. Používá se zde cyklus, když počet opakování je uložen do registru R3. Adresy jednotlivých paměťových buněk se vypočítávají inkrementací registru R0, jednotlivé konstanty se zase počítají dvojí dekrementací registru A. Jak vidíme, je zde použito nepřímého adresování (budiž zde připomenuto, že k nepřímému adresování lze použít pouze registry R0 a R1). Povšimněme si ještě, že je zde použito návěstí (labelu) START. Pak také v poslední instrukci je možno použít tento label jako symbolickou adresu. V tomto programu je k vytvoření cyklu využita tak zvaná sdružená instrukce – DJNZ. Tato instrukce znamená, že se počítadlo dekrementuje a pak, není – li výsledek po dekrementaci roven nule, skočí program zpět na udanou adresu (START). Je – li výsledek roven nule, program pokračuje následující instrukcí. Bylo by na místě ještě upozornit na to, že program je umístěn i na adresách 0003 a 000BH, tedy na startovacích adresách přerušení. Vzhledem k tomu, že není použito přerušení, není to na závadu, avšak zpravidla se tyto adresy pro hlavní program nevyužívají.
Zopakujme si nyní alespoň v symbolické formě instrukce, které jsme zatím poznali:
MOV adr., #data (adr.) data (8 bitů)
MOV Rr, #data (Rr) data (8 bitů)
MOV A, #data (A) data (8 bitů)
MOV @R0,A ((R0)) (A)
INC R0 (R0) (R0) + 1
DEC A (A) (A) – 1
DJNZ R3, START dekrement R3, je-li R3 různé od 0, pak skok na START,
je – li R3 rovno 0, pak další instrukce
Někdy je třeba běh programu poněkud zdržet a počkat na příklad na to, až člověk dokáže zareagovat. Pokusme se tedy sestavit takový podprogram, který by začínal na adrese 600H:
ORG 0000H
LJMP 600H
ORG 600H
NOP
NOP
NOP
NOP
END
Jak vidíme, je zde použita instrukce NOP (non-operation) a to tolikrát, kolikrát je třeba k vytvoření žádoucího zpoždění (při hodinovém kmitočtu 12 MHz je doba pro vykonání jedné instrukce NOP 1ms). Je zřejmé, že takto lze vytvářet jen poměrně krátká zpoždění. Delší zpoždění se vytvářejí jinak a to pomocí několika do sebe vnořených cyklů. To si ukážeme na následujícím programu. Než však se jím začneme zabývat, vysvětleme si instrukce nepodmíněných skoků. U I 8051 se můžeme setkat se dvěma instrukcemi nepodmíněných skoků: LJMP – tak zvaný dlouhý skok, který lze provést na kteroukoli adresu a pak skok krátký – AJMP – který je možno provést jen v rámci 2 kB stránky. Adresa paměťové buňky u I 8051 je šestnáctibitová. U krátkého skoku musí mít adresa, na kterou má program skočit, pět nejvyšších bitů shodných s adresou odkud má skočit. A nyní si tedy prostudujme program zpoždění s použitím do sebe vnořených cyklů:
;program zdrzeni cca 50 s - ZDRZ.ASM
ORG 0000H ;pseudoinstrukce, ORG=zacatek programu na adr.0000H
LJMP 600H ;skok na adresu 600H(mozno i AJMP 600H n. AJMP DRZ)
ORG 600H
ZDRZ: MOV R7, #255 ;ZDRZ = label (navesti); 255-->R7
A1: MOV R6, #255 ;255-->R6
A2: MOV R5, #255 ;255-->R5
A3: NOP ;nedelej nic
DJNZ R5, A3 ;dekrement R5, je-li R5=0, pak program pokracuje,
DJNZ R6, A2 ;jinak skok na A3
DJNZ R7, A1
END
Výše uvedený program je program v Assembleru opatřený komentářem. Podívejme se i na tento program přeložený do strojního kódu:
0000 ;Program ZDRZ = program zdrzeni cca 50 s
0000 ORG 0000H ;pseudoinstrukce, ORG=zacatek programu na adr. 0000H
0000 020600 LJMP 600H ;skok na adresu 600H (mozno i AJMP 600H n. AJMP ZDRZ)
0600 ORG 600H
0600 7FFF ZDRZ: MOV R7, #255 ;ZDRZ = label (navesti); 255-->R7
0602 7EFF A1: MOV R6, #255 ;255-->R6
0604 7DFF A2: MOV R5, #255 ;255-->R5
0606 00 A3: NOP ;nedelej nic
0607 DDFD DJNZ R5, A3 ;dekrement R5, je-li R5=0, pak program pokracuje,
0609 DEF9 DJNZ R6, A2 ;jinak skok na A3
060B DFF5 DJNZ R7, A1
060D
060D END
No errors detected
Jak vidíme jsou zde použity tři do sebe vnořené cykly. Počet opakování je zde uložen do registrů R5, R6, R7. Je zde použit dlouhý skok, aby se program vyhnul startovacím adresám obsluhy přerušení. Program je uložen dost daleko, aby jej bylo možno použít jako podprogramu, zatímco hlavní program by byl uložen na příklad na adresách 30H – 600H.
Zopakujme si další instrukce, které jsme poznali:
AJMP adr. 11 bitů nepodmíněný skok v rámci 2 kB stránky
LJMP adr. 16 bitů nepodmíněný skok v celém adresovém prostoru 64 kB
AJMP ZDRZ krátký skok na symbolickou adresu
LJMP ZDRZ dlouhý skok na symbolickou adresu
NOP nedělej nic, prázdná instrukce
V mnoha případech je třeba přesunout celý blok dat. Dejme tomu, že je třeba ve vnější paměti dat přesunout data na adresách 100H – 130H na adresy 150H – 180H. Podívejme se, jak by bylo možno tento úkol řešit nejprve zcela jednoduchým programem:
ORG 0000H
AJMP ZAC
ORG 30H
ZAC: MOV DPTR, #100H
MOVX A, @DPTR
MOV DPTR, #150H
MOVX @DPTR, A
MOV DPTR, #101H
MOVX A, @DPTR
MOV DPTR, #151H
MOVX @DPTR, A
MOV DPTR, #102H
MOVX A, @DPTR
MOV DPTR, #152H
MOVX @DPTR, A
,
.
MOV DPTR, #130H
MOVX A, @DPTR
MOV DPTR, #180H
MOVX @DPTR, A
END
Jak vidíme, tento program obsahuje některé nové instrukce. Abychom je pochopili, je třeba si něco říci o registru DPTR. Tento 16-ti bitový registr se skládá ze dvou 8-mi bitových registrů a to DPL (obsahujícím nižších 8 bitů) a DPH (zde je uloženo 8 vyšších bitů). Adresy do registru DPTR je možno ukládat buď jako 16-ti bitová čísla (instrukce MOV DPTR, #data) anebo nastavit každý z registrů DPL a DPH zvlášť (instrukce MOV DPL, #data a instrukce MOV DPH, #data). Pomocí nepřímého adresování pak lze přenést obsah kterékoli paměťové buňky z vnější paměti dat do registru A (instrukce MOVX A, @DPTR) anebo naopak obsah registru A do kterékoli paměťové buňky vnější paměti dat (instrukce MOVX @DPTR, A).
Je zřejmé, že výše napsaný program by zabíral neúměrně mnoho místa v paměti. Pokusme se o poněkud jiný, úspornější, program:
ORG 0000H
AJMP START
ORG 100H
START: MOV DPTR, #0100H; DPTR=0100H
MOV R3, #0H ; R3=00H
MOV R2, #50H ; R2=50H
OPAK: MOVX A, @DPTR ; prenos z adresy DPTR do A
MOV DPL, R2 ; R2-->DPL
MOVX @DPTR, A ; prenos z A na adresu DPTR
INC R2 ; inkrement R2
INC R3 ; inkrement R3
MOV DPL, R3 ; R3-->DPL
MOV A, R3
XRL A, #31H ; je R3 = 31H?
JNZ OPAK ; ne -->OPAK
NOP ; ano-->konec programu
END
Tentýž program včetně překladu do strojního kódu:
0000 ORG 0000H
0000 2100 AJMP START
0100 ORG 100H
0100 900100 START: MOV DPTR, #0100H
0103 7B00 MOV R3, #0H
0105 7A50 MOV R2, #50H
0107 E0 OPAK: MOVX A, @DPTR
0108 8A82 MOV DPL, R2
010A F0 MOVX @DPTR, A
010B 0A INC R2
010C 0B INC R3
010D 8B82 MOV DPL, R3
010F EB MOV A, R3
0110 6431 XRL A, #31H
0112 70F3 JNZ OPAK
0114 00 NOP
0115 END
No errors detected
Novou instrukcí v tomto programu je instrukce XRL A, #31H. Její význam je: proveď nonekvivalenci obsahu registru A s konstantou 31H a výsledek ulož do registru A. V praxi to znamená, že po provedení této instrukce je obsah registru A roven nule, pokud jeho obsah byl roven konstantě (v našem případě 31H). Druhou novou instrukcí je instrukce podmíněného skoku JNZ OPAK Tato instrukce má ten význam, že bude proveden skok na udanou symbolickou adresu, pokud obsah akumulátoru nebude roven nule. V této souvislosti je však třeba uvést, že skok je možno provést o max. 127 adres vpřed nebo vzad.
Zkusme si vysvětlit, jak tento program funguje. Je zde využito toho, že adresy paměťových buněk ve vnější paměti dat se mění pouze v nižších osmi bitech (registr DPL), kdežto vyšších osm bitů zůstává beze změny. Proto měníme pouze obsah registru DPL. V registru R3 bude nižších 8 bitů adresy, ze které se přenáší data, v registru R2 bude nižších 8 bitů adresy, na kterou se data přenáší. Tedy v registru R3 bude postupně 00, 01, 02…..30H, kdežto v registru R2 bude postupně 50H, 51H…..80H. V cyklu si přeneseme obsah registru R3 do DPL a následně přeneseme obsah paměťové buňky do registru A, pak přeneseme do DPL obsah registru R2 a následně přeneseme obsah registru A do paměťové buňky. Poté inkrementujeme registry R2 a R3 a zjistíme, zda není R3=31H. Je – li tomu tak, cyklus končí, v opačném případě se cyklus znovu opakuje.
Zopakujme si nové instrukce:
MOV DPTR, #data (DPTR) data (16 bitů)
MOVX A, @DPTR přenos obsahu paměťové buňky z vnější paměti dat do A, adresa buňky je v DPTR
MOVX @DPTR, A přenos obsahu A do paměťové buňky vnější paměti dat, adresa buňky je v DPTR
JNZ adr. podmíněný skok na udanou adresu pro Z=0
INC Rr inkrement registru Rr
MOV DPL, R2 (DPL) (R2)
MOV 82H, R2 (DPL) (R2) – DPL je vyjádřeno adresou
XRL A, #data nonekvivalence A, data (8 bitů); výsledek uložit do A
V následujícím programu si vytvoříme na portu P0 tak zvané běžící světlo. To znamená, že na portu PO budou postupně tyto stavy:
P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
a tak dále
Kdybychom na jednotlivé vývody portu P0 připojili LED diody, svítila by vždy jedna z nich a to tak, že by se jedna po druhé rozsvěcovaly a vytvořily by takzvané „běžící světlo“. Mezi jednotlivými změnami bychom samozřejmě museli nechat určitý čas, aby lidské oko mohlo zaznamenat změnu. Program, který by toto realizoval, by mohl vypadat na příklad takto:
ORG 0000H ORG 200H
AJMP START ZDRZ: MOV R1, #0FFH
ORG 100H A1: MOV R0, #0FFH
START: MOV P0, #01 A2: NOP
ACALL ZDRZ DJNZ R0, A2
MOV P0. #02 DJNZ R1, A1
ACALL ZDRZ RET
MOV P0. #04 END
ACALL ZDRZ
MOV P0. #08
ACALL ZDRZ
MOV P0. #10H
ACALL ZDRZ
MOV P0. #20H
ACALL ZDRZ
MOV P0. #40H
ACALL ZDRZ
MOV P0. #80H
ACALL ZDRZ
AJMP START
Program nevyžaduje další vysvětlení. Je však na místě vysvětlit instrukci ACALL. Jde o volání podprogramu v rámci 2 kB stránky. Existuje i instrukce LCALL, která může volat programy v rámci celého 64 kB adresovacího prostoru. Pokud jde o instrukci MOV P0, #data, zde je jistě každému zřejmé, že tato instrukce přivádí na port P0 osmibitové binární číslo. Z formálního hlediska je vhodné upozornit, že tuto osmibitovou konstantu je možno zadat jako číslo binární s označením B, číslo oktalové s označením O, číslo hexadecimální s označením H anebo bez označení jako číslo dekadické. Jestliže by číslo hexadecimální začínalo písmenem, je nutno před něj napsat nulu (tedy ne FFH nýbrž 0FFH).
Výše napsaný program není samozřejmě jediným řešením. Podívejme se na to, jaká je jiná možnost řešení s použitím cyklu:
ORG 0000H
AJMP START ;skok na adresu danou symbolicky labelem
ORG 100H
START: MOV SP, #30H ;nastavení registru SP na 30H
MOV A, #00000001B ;naplneni registru A konstantou
ZNOVU: MOV P0, A ;poslani obsahu registru A na port P0
RL A ;rotace registru A vlevo; bylo by lze i RR A
ACALL ZDRZ ;skok do podprogramu (zdrzeni o cca 180 ms)
AJMP ZNOVU ;nepodmineny skok na label ZNOVU
ORG 200H
ZDRZ: MOV R7, #0FFH
A1: MOV R6, #1111B
A2: MOV R5, #15
A3: NOP
DJNZ R5, A3
DJNZ R6, A2
DJNZ R7, A1
RET
END
A tento program přeložený do strojního kódu
0000 ;bezici svetlo na portu P0
0000 ORG 0000H
0000 2100 AJMP START ;skok na adresu danou symbolicky labelem
0100 ORG 100H
0100 758130 START: MOV SP, #30H ;nastavení registru SP na 30H
0103 7401 MOV A, #00000001B ;naplneni registru A konstantou
0105 F580 ZNOVU: MOV P0, A ;poslani obsahu registru A na port P0
0107 23 RL A ;rotace registru A vvlevo; bylo by lze i RR A
0108 5100 ACALL ZDRZ ;skok do podprogramu (zdrzeni o cca 180 ms)
010A 2105 AJMP ZNOVU ;nepodmineny skok na label ZNOVU
010C
0200 ORG 200H
0200 7FFF ZDRZ: MOV R7, #0FFH
0202 7E0F A1: MOV R6, #1111B
0204 7D0F A2: MOV R5, #15
0206 00 A3: NOP
0207 DDFD DJNZ R5, A3
0209 DEF9 DJNZ R6, A2
020B DFF5 DJNZ R7, A1
020D 22 RET
020E
020E END
No errors detected
Jak vidíme, druhá verze programu je podstatně kratší. Zkusme si vysvětlit, jak program pracuje. Na začátku programu je instrukcí MOV SP, #30H nastaven ukazatel zásobníku (registr SP) nastaven na hodnotu 30H. To je z toho důvodu, že po signálu RESET je registr SP nastaven na hodnotu 07, což je adresa registru R7 v bance registrů 0. Návratové adresy by se pak ukládaly na adresy 08, 09, 0AH, 0BH atd., což jsou adresy registrů v bance registrů 1. To by mohlo vést k nežádoucímu přepisování dat v registrech, a proto se preventivně snažíme těmto nežádoucím jevům předejít, i když nepočítáme s použitím zmíněných registrů.
Na začátku programu je také registr A naplněn konstantou 01 (neboli 00000001B) a obsah registru A je poslán na port P0. Po zavolání podprogramu ZDRZ se vytvoří zpoždění. Před tím je provedena rotace registru A vlevo, čímž se z konstanty 01 stane 02. Po návratu z podprogramu se cyklus opakuje. Po další rotaci se z konstanty 02 stane 04, pak 08 atd. až nakonec z 80H se stane 01. Pochopitelně bychom mohli použít i instrukci rotace vpravo, kdy by světlo běželo opačně. Pak by se na portu P0 objevovalo postupně 01, 80H, 40H, 20H, 10H, 08, 04, 02, 01, 80H atd. Dodejme, že v tomto případě program tvoří tzv. „věčnou smyčku.“
Zopakujme si nově uvedené instrukce:
MOV P0, #data (P0) data (8 bitů)
MOV P0, A (P0) (A)
ACALL adresa 11 bitů volání podprogramu v rámci 2 kB stránky
LCALL adresa 16 bitů volání podprogramu v celé paměti programu (64 kB)
MOV SP, #data (SP) data (8 bitů)
RL A rotace registru A vlevo
RR A rotace registru A vpravo
RET instrukce návratu z podprogramu na návratovou adresu
Rozšířenou verzí předchozího programu je běžící světlo na portech P0, P1, P2, P3. Bylo by tedy možno zapojit 32 svítících diod a na nich realizovat běžící světlo. Stavy na jednotlivých portech by tedy byly postupně tyto:
P0 P1 P2 P3
00 00 00 80H
00 00 00 40H
00 00 00 20H
00 00 00 10H
00 00 00 08
00 00 00 04
00 00 00 02
00 00 00 01
00 00 80H 00
00 00 40H 00
00 00 20H 00
00 00 10H 00
00 00 08 00
00 00 04 00
00 00 02 00
00 00 01 00
00 80H 00 00
00 40H 00 00
00 20H 00 00
00 10H 00 00
00 08 00 00
00 04 00 00
00 02 00 00
00 01 00 00
80H 00 00 00
40H 00 00 00
20H 00 00 00
10H 00 00 00
08 00 00 00
04 00 00 00
02 00 00 00
01 00 00 00
00 00 00 80H
a tak dále
Program, který by výše zmíněnou funkci realizoval, je tento:
;PROGRAM BEZSV2 (bezici svetlo na P0,P1,P2 a P3)
ORG 0000H ;pseudoinstrukce - zac. programu na adrese 0000H
AJMP ZAC ;skok na ZAC
ORG 80H
ZAC: MOV SP, #30H ;nastaveni registru SP na 30H
CLR A ;A=0
MOV P0,A ;P0=0
MOV P1,A ;P1=0
MOV P2,A ;P2=0
MOV A,#80H ;A=80H
MOV P3,A ;P3=80H
OPET: MOV A,P3 ;P3-->A
CALL ZPOZ ;skok do podprogramu zpozdeni
RRC A ;rotace registru A vpravo
MOV P3,A ;A-->P3
JNZ OPET ;A<>0? ne-->OPET
RRC A ;A=0, pak 80H-->A (pomoci rotace)
MOV P2,A ;A-->P2
ZASE: MOV A,P2
CALL ZPOZ
RRC A
MOV P2,A
JNZ ZASE
RRC A
MOV P1,A
ZNOVA:MOV A,P1
CALL ZPOZ
RRC A
MOV P1,A
JNZ ZNOVA
RRC A
MOV P0,A
O5: MOV A,P0
CALL ZPOZ
RRC A
MOV P0,A
JNZ O5
RRC A
MOV P3,A
JMP OPET
ORG 200H
ZPOZ: MOV R7, #0FFH ;zpozdeni cca 0,25 s
X: MOV R6, #0FFH
Y: NOP
NOP
DJNZ R6, Y
DJNZ R7, X
RET
END
Překlad programu do strojního kódu:
0000 ;PROGRAM BEZSV2 (bezici svetlo na P0,P1,P2 a P3)
0000 ORG 0000H ;pseudoinstrukce - zac. programu
0000 0180 AJMP ZAC ;skok na ZAC
0080 ORG 80H
0080 758130 ZAC: MOV SP, #30H ;nastaveni registru SP na 30H
0083 E4 CLR A ;A=0
0084 F580 MOV P0,A ;P0=0
0086 F590 MOV P1,A ;P1=0
0088 F5A0 MOV P2,A ;P2=0
008A 7480 MOV A,#80H ;A=80H
008C F5B0 MOV P3,A ;P3=80H
008E E5B0 OPET: MOV A,P3 ;P3-->A
0090 120200 CALL ZPOZ ;skok do podprogramu zpozdeni
0093 13 RRC A ;rotace reg. A vpravo
0094 F5B0 MOV P3,A ;A-->P3
0096 70F6 JNZ OPET ;A<>0? ne-->OPET
0098 13 RRC A ;A=0, pak 80H-->A (pomoci rotace)
0099 F5A0 MOV P2,A ;A-->P2
009B E5A0 ZASE: MOV A,P2
009D 120200 CALL ZPOZ
00A0 13 RRC A
00A1 F5A0 MOV P2,A
00A3 70F6 JNZ ZASE
00A5 13 RRC A
00A6 F590 MOV P1,A
00A8 E590 ZNOVA: MOV A,P1
00AA 120200 CALL ZPOZ
00AD 13 RRC A
00AE F590 MOV P1,A
00B0 70F6 JNZ ZNOVA
00B2 13 RRC A
00B3 F580 MOV P0,A
00B5 E580 O5: MOV A,P0
00B7 120200 CALL ZPOZ
00BA 13 RRC A
00BB F580 MOV P0,A
00BD 70F6 JNZ O5
00BF 13 RRC A
00C0 F5B0 MOV P3,A
00C2 02008E JMP OPET
00C5
0200 ORG 200H
0200 7FFF ZPOZ: MOV R7, #0FFH ;zpozdeni cca 0,25 s
0202 7EFF X: MOV R6, #0FFH
0204 00 Y: NOP
0205 00 NOP
0206 DEFC DJNZ R6, Y
0208 DFF8 DJNZ R7, X
020A 22 RET
020B
020B
020B
020B END
No errors detected
Jak vidíme, některé instrukce na začátku programu jsou obdobné jako v předchozím programu. I zde je napodmíněný skok na symbolickou adresu ZAC, i zde je nastaven registr SP na hodnotu 30H a konečně i v tomto případě jsou nastavovány porty P0,P1, P2 a P3 do výchozího stavu. Porty P0, P1, P2 jsou vynulovány kdežto port P3 je nastaven na 80H. Novou instrukcí je zde CLR A, která nuluje registr A.
Další postup je však již poněkud odlišný. Je zde sice zase volání podprogramu zpoždění, avšak nové stavy se vytvářejí nikoli pomocí prosté rotace registru A vlevo, nýbrž pomocí rotace vpravo přes flag C. Rotace registru A vpravo přes flag C znamená, že nejvyšší bit registru A (a7) se přesune na místo bitu a6, bit a6 se posune na místo bitu a5, který se přesune na místo bitu a4…….bit a1 se přesune na místo bitu a0 a ten se přesune do flagu C, jehož obsah se přesune na místo bitu a7. Je-li tedy v registru A uloženo číslo 80H a C=0, pak po opakovaném provedení instrukce RRC A nastanou postupně tyto stavy:
A=40H, C=0; A=20H, C=0; A=10H, C=0; A=08, C=0; A=04, C=0; A=02, C=0; A=01, C=0; A=00, C=1.
Tyto stavy se pak přenášejí na příslušný port. Pokud je A různé od nuly, pak dojde k podmíněnému skoku (instrukce JNZ) a celý cyklus se opakuje. Jakmile však se A rovná nule, ke skoku nedojde a začne další část programu. Opět je provedena instrukce RRC A a tím vznikne opět výchozí stav A=80H a C=0.
Přenos z registru A na port, volání podprogramu zpoždění a další rotace registru A vpravo přes flag C se opakuje pro port P3 osmkrát než nastave stav A=00, který se přenese na port P0. Pak se přejde na port P2, kde se postupně objeví stavy 80H, 40H…….02, 01, 00 poté na port P1, dále na port P0 a po něm opět na port P3. Jde zase o nám již známou věčnou smyčku.
Pokud jde o podprogram zpoždění, je sestaven v podstatě tak, jak byly sestaveny předchozí programy pro zpoždění. Snad jedinou změnou je to, že program obsahuje dvě instrukce NOP. Tím se zpoždění prodlouží na dvojnásobek vůči stavu, kdy by zde byla jen jediná instrukce NOP. Téhož efektu bychom dosáhli, kdybychom zdvojnásobili počet opakování tím, že bychom počítadlo zdvojnásobili. Vzhledem k tomu, že počítadla jsou nastavena na maximální počet opakování (0FFH), nezbylo než volit cestu zdvojnásobení počtu instrukcí NOP.
Přesněji řečeno Assembly language. Assembler znamenal původně překladač z Assembly language do strojního kódu.
Vzhledem k tomu, že bit PC8 je nulován, je možno podprogramy ukládat pouze na adresách 000H – 0FFH, popřípadě i 200H – 2FFH.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2523
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved