Vstupně-výstupní porty
Vstupně/výstupní porty nám umožňují připojit k mikroprocesoru
externí zařízení.
U standardní verze 8051 máme k dispozici 4 v/v porty, z nichž každý má
po 8 pinech. Tyto čtyři porty jsou označovány P0, P1, P2 a P3. Pokud
chceme označit konkrétní pin určitého portu, pak označení vypadá takto - např. P1.4 , kde 1 před tečkou určuje port a 4 za
tečkou je číslo konkrétního pinu příslušejícího k portu 1. Jelikož se jednotlivé piny adresují jako bity, můžeme se setkat s označením bit, např. bit P1.5.
Porty jsou obousměrné - můžeme tedy jednotlivé piny
všech portů používat jako vstupní i jako
výstupní. Porty hardwarově sestávají ze vstupních
vyrovnávacích pamětí, klopných obvodů typu D a výstupních budičů. Vnitřní (funkční) zapojení portů P0 až P3 ukazují obr. 1 až 4.
Obr.1 Vnitřní zapojení jednoho pinu portu P0
Obr.2 Vnitřní zapojení jednoho pinu portu P1
Obr.3 Vnitřní zapojení jednoho pinu portu P2
Obr.4 Vnitřní zapojení jednoho pinu portu P3
Jak je vidět z obr.1 až 4, vnitřní zapojení vstupně/výstupního obvodu jednotlivých portů se liší.
Stručná charakteristika portů
Port 0 jako jediný nemá ve výstupním budiči zvyšovací odpor -
jde tedy o obvod s otevřeným kolektorem. Pokud jej chceme použít jako
obecné vstupy/výstupy, musíme k pinům připojit externí odpory, jejichž
druhý konec připojíme na +Ucc. Port 0 se také může využívat při styku s
vnější pamětí.
Port 1 nemá žádnou alternativní funkci, díky tomu jej můžeme používat bez omezení.
Port 2 se kromě své normální funkce může využívat spolu s portem
0 ke komunikaci s externí pamětí. K tomuto účelu se využívají jen části
obou portů - výstupní budiče portu 0 a 2 a vstupní vyrovnávací paměť
portu 0. Na portu 0 je časově přepínán výstup nižšího bytu adresy pro
externí paměť s datovým bytem, který je zapisován nebo čten z paměti.
Port 2 pak vysílá vyšší byte adresy. Tato adresa je tedy 16-bitová,
abychom mohli adresovat až 64kB paměti. Port 2 jinak pracuje jako
normální port.
Port 3 - všechny piny portu 3 jsou vícefunkční. Kromě standardní
funkce navíc tento port poskytuje své piny pro potřeby jiným vnitřním
obvodům mikroprocesoru, seznam pinů a jim příslušné alternativní funkce
zobrazuje následující tabulka:
Pin |
Alternativní funkce |
P3.0 |
RXD (serial input) |
P3.1 |
TXD (serial output) |
P3.2 |
INT0 (external interrupt) |
P3.3 |
INT1 (external interrupt) |
P3.4 |
T0 (Timer/Counter 0 external input) |
P3.5 |
T1 (Timer/Counter 1 external input) |
P3.6 |
WR (external Data Memory write strobe) |
P3.7 |
RD (external Data Memory read strobe) |
Alternativní funkce pinů portu 3 může být aktivována pouze, pokud
bit v SFR příslušný danému pinu obsahuje log.1. Jinak pin zůstává v
log.0.
Popis vnitřního zapojení a funkce jednotlivých portů
Obrázky
1 až 4 ukazují funkční zapojení jednoho pinu každého ze 4 portů. V/V
pin tedy tvoří synchronní KO typu D (což je jeden bit v oblasti portů v
SFR). Ten načte log.hodnotu z vnitřní sběrnice po příchodu log.1 na
vstupu C (z vnitřního signálu CPU - Zápis do KO). Výstup Q klopného
obvodu je poslán na vnitřní sběrnici, pokud je aktivní (v log.1)
vnitřní signál z CPU - Čtení obsahu KO. Skutečný logický stav pinu
samotného je poslán na vnitřní sběrnici, pokud je aktivní vnitřní
signál CPU - Čtení stavu pinu. Některé instrukce, které čtou z portu,
aktivují signál Čtení obsahu KO, některé instrukce aktivují signál
Čtení stavu pinu.
Jak je vidět z obr.1 a 3, výstupní budiče portu 0 a 2 jsou přepínatelné
na vnitřní sběrnici Adresa a Adresa/Data vnitřním signálem CPU - Řízení
(v případě, že využíváme přístup k externí paměti). Během přístupu k
externí paměti zůstává stav portu 2 (tedy obsah SFR - oblast P2)
nezměněn, naopak do odpovídající oblasti SFR portu 0 jsou zapsány
jedničky.
Jak ukazuje obr.4, pokud KO pinu z portu 3 obsahuje jedničku,
výstupní log. úroveň pinu je dána stavem vnitřního signálu Alternativní
výstupní funkce. Skutečný log.stav pinu je vždy dostupný na vnitřním
signálu CPU - Alternativní vstupní funkce.
Porty 1,2 a 3 mají ve výstupních budičích vnitřní zvyšovací
odpory (angl. pull-up). Port 0 má naproti tomu výstupy s otevřeným
kolektorem (nemá tedy vnitřní zvyšovací odpory). Každý pin kteréhokoliv
portu může být nezávisle používán jako vstupní nebo jako výstupní.
Porty 0 a 2 nemohou být používány jako všeobecné v/v piny, pokud jsou
používány jako adresově-datová sběrnice při přístupu do externí paměti.
Pokud tedy chceme piny použít jako vstupní, KO příslušného pinu musí
obsahovat jedničku, což způsobí zavření FET tranzistoru ve výstupním
budiči (FET je připojený přes negovaný výstup KO). Potom pro porty
1,2,3 platí, že pin je v úrovní log.1 díky zvyšovacímu odporu, ale může
být přestaven do log.0 vnějším zdrojem připojeným k pinu.
Port 0 se od ostatních portů liší tím, že nemá ve výstupních budičích
vnitřní zvyšovací odpory. Místo odporu je zde druhý FET tranzistor (na
obr.1 je to ten horní), který se ale využívá jen když port vysílá
jedničky během přístupu k externí paměti (na GATE tranzistoru je
log.1). V ostatních případech je FET tranzistor zavřený (na GATE je
log.0). Proto piny portu 0, používané jako výstupní, se chovají jako
obvod s otevřeným kolektorem. Zápisem log.1 do KO zůstávají oba FET
tranzistory zavřeny a pin se tak dostává do stavu vysoké impedance.
Po resetu mikroprocesoru jsou do KO všech portů zapsány jedničky
(všechny porty jsou tedy nastaveny jako vstupní). Jsou-li do KO
následně během programu zapsány log.0, mohou být porty znovu
přenastaveny jako vstupní zapsáním jedniček do jejich KO.
Zápis do portu
Při vykonávání instrukce, která mění hodnotu KO portu, nová data
přijdou do KO během fáze S6P2 posledního cyklu instrukce. Nicméně, KO
portu jsou ve skutečnosti vzorkovány jejich výstupními budiči pouze
během fáze 1 kteréhokoliv hod.cyklu. Během fáze 2 drží výstupní budič
hodnotu, která byla získána ve fázi 1. Z toho důvodu, nová data v KO
portu nepřijdou na výstupní pin portu až do doby následující fáze 1.
Další fáze 1 v tomto případě bude až fáze S1P1 dalšího strojového
cyklu.
Obr. 5 Zápis dat do portu - časový průběh
Jestliže změna stavu portu vyžaduje přechod z 0 do 1 u portu 1,2 a 3,
zvyšovací odpor je snížen až o dva řády během fází S1P1 a S1P2 cyklu,
ve kterém dochází k přechodu z 0 do 1. To je uděláno proto, aby se
zvýšila rychlost přechodu. Takto snížený zvyš.odpor může dodat až
100-krát větší proud než při své normální hodnotě. Snížení zvyšovacího odporu je umožněno tím, že zvyšovací odpory tvoří FET tranzistory, nikoliv lineární rezistory.
Obr. 6 Vnitřní zapojení výstupního budiče portů 1 a 3, port 2 vypadá obdobně
Zvyšovací odpor sestává ze 3 tranzistorů FET s P kanálem (T1,T2,T3).
Tzn. při log.0 na GATE bude otevřen, při log.1 bude zavřen. Stávající
tranzistor ve výst.budiči (na obr. 2 až 4, na obr.6 označen jako T4) je
FET s N kanálem - při log.0 na GATE je tedy zavřen, při log.1 otevřen.
Tranzistor T1 je otevřen na 2 hodinové cykly po přechodu z 0 do 1
v KO portu. Když je otevřen, otevře zároveň T3 (přes invertor). Tento
invertor a tranzistor plní KO, který tak drží log.1.
Pokud pin portu vysílá jedničku (nastaven jako vstupní), může být
externím zdrojem (součástkou) přizemněn, což způsobí zavření T3, takže
pin pak přechází do stavu vysoké impedance. T2 je velmi malý jakoby
zvyš.odpor, který je otevřen vždy, když je T4 zavřený. Je přibližně
10-krát menší než T3. Má tu funkci, že obnovuje log.1 na pinu v
případě, že na pinu 1 byla a došlo k její ztrátě vlivem externího
zdroje (přizemněním). Port 2 funguje podobně s rozdílem při přístupu do
externí paměti - pokud port vysílá adresu, pak při jedničkách v této
adrese port ponechává otevřený tranzistor T3 (velký zvyšovací odpor).