Il PIO (parallel input/output) è un integrato che mette
a disposizione due porte di I/O programmabili. E'stato studiato per funzionare
assieme ad una CPU Z80 e non può essere collegato direttamente ad
altri processori. Ogni porta può funzionare in diverse modalità,
e dispone di due segnali ausiliari (RDY e STB) che consentono la sincronizzazione
con le periferiche esterne (segnali di handshaking). Inoltre ogni porta
può generare un interrupt, e più dispositivi PIO si possono
collegare in cascata con i pin IEIN e IEOUT per realizzare una catena di
interrupt a diversa priorità (daisy chain).
|
Integrato Z80 PIO
Rosso: BUS dati a 8 bit
Blu: Alimentazioni e clock.
Giallo: I segnali di controllo
Grigio scuro: ingressi, se non sono usati collegare IEIN a +5V con
una resistenza e ASTB BSTB a massa.
PA0..PA7 e PB0..PB7 sono i pin di ingresso uscita delle due porte,
gli altri segnali sono uscite, se non vengono usate si lasciano scollegate
(servono per gli interrupt e l' handshaking). |
|
I segnali di controllo sono molti e sono richiesti anche
M1 e il clock perché il PIO li usa per sincronizzarsi internamente
con lo Z80. Il pin WR dello Z80 non è necessario in quanto il PIO
riesce a "capire" dalla combinazione degli altri segnali se si sta tentando
di scrivere in esso. Inoltre non è richiesto un pin di reset in
quanto questo è automatico all'accensione.
Il segnale E abilita il PIO e generalmente proviene da un address decoder.
A/B seleziona la porta A (se basso) o B (se alto). C/D seleziona il registro
dati (se basso) o il registro di controllo (se alto) della porta scelta
con A/B. Generalmente A/B e C/D vengono collegati ai pin A0 e A1 dello
Z80.
Se opportunamente programmato il PIO può generare degli interrupt
sul pin di uscita INT. Il pin IEIN basso impedisce al PIO di generare interrupt,
pertanto va tenuto alto con una resistenza. IEOUT si collega all'IEIN di
un altro eventuale PIO, altrimenti si lascia scollegato.
Se i segnali RDY e STB non vengono usati è bene lasciare RDY
scollegato e STB bloccato a massa. |
Questa pagina tratta della modalità di funzionamento più
semplice, detta "modo di controllo". In questa modalità i segnali
RDY e STB non vengono usati (STB è ignorato e RDY forzato a 0) e
i singoli pin delle porte possono essere configurati come ingressi o come
uscite.
La figura seguente mostra come collegare un singolo PIO al BUS dello
Z80, se non si vogliono usare gli interrupt del PIO il pin INT del PIO
può rimanere scollegato:
Visto che i segnali A/B C/D ed E sono collegati ai bit A0 A1 A2 del
BUS indirizzi, i registri dati e di controllo si trovano mappati a 4 indirizzi
consecutivi:
Per configurare una porta in "modo di controllo" bisogna inviare al
registro di controllo di quella porta due byte, il primo stabilisce il
modo di funzionamento e il secondo quali pin devono essere uscite e quali
ingressi (X=bit indifferentemente 1 o 0):
Ad esempio, inviando al registro di controllo della porta A (indirizzo
2) i due byte 11111111B e 00000111B la porta A viene configurata da PA0
a PA2 come ingressi e da PA3 a PA7 come uscite. A questo punto è
possibile scrivere sulle uscite con OUT (0);A e leggere dagli ingressi
con IN A,(0). Naturalmente in questo caso in scrittura il valore dei bit
D0..D2 di A viene ignorato, e in lettura i valori dei bit D3..D7 in arrivo
dalla porta non hanno alcun significato.
Non sono necessarie porte esterne di adattamento perché il PIO
è progettato apposta per lavorare con i segnali dello Z80, e rappresenta
quindi la soluzione ideale se si vuole disporre di 16 fili di ingresso/uscita
con il minor numero di componenti. Come per la CPU anche i PIO esistono
in diverse versioni, lo Z80A-PIO lavora fino a 4 Mhz, lo Z80B-PIO lavora
fino a 6 Mhz.
Se si volessero collegare più PIO si dovrebbe usare un 74138
che controlla i bit di indirizzamento superiori ad A1 per scegliere quale
PIO abilitare. Facendo un po'di attenzione è possibile però
usare una "scorciatoia" e collegare più PIO anche senza alcun address
decoder:
Questi due PIO condividono tutti i segnali ad esclusione del pin di
abilitazione. Il primo PIO viene abilitato da quegli indirizzi che hanno
il bit A2 a 0, il secondo da quegli indirizzi che hanno il bit A3 a 0:
ATTENZIONE: Con questo collegamento
si deve prestare molta attenzione a non usare indirizzi di I/O che rappresentati
in binario hanno i bit A2 e A3 contemporaneamente a zero. In questo caso
infatti si abiliterebbero entrambi i PIO e sorgerebbero conflitti sul BUS
dati che potrebbero danneggiarli.
Se non si vogliono usare gli interrupt dei PIO, i pin INT si possono
lasciare scollegati. Il circuito di questo schema è predisposto
per poter usare gli interrupt di tutte 4 le porte. Il segnale IEOUT del
PIO1 va collegato a IEIN del PIO2, in questo modo quando il primo PIO deve
generare un interrupt disabilita il secondo portando basso IEOUT (e IEIN
del secondo). Si vede già da questo come il PIO1 ha una priorità
maggiore rispetto al 2, all'interno di ogni singolo PIO la porta A ha priorità
maggiore rispetto alla porta B. Nel nostro caso la porta con priorità
maggiore è la A del PIO1, quella con priorità minore è
la B del secondo.
NOTA: Le uscite INT dei PIO sono di di tipo open collector, quindi
sulla linea INT del processore è comunque necessaria una resistenza
di pull'up da 10K.
Con due soli PIO e il modulo logico con CPU e memorie è possibile
realizzare un sistema completo con 32 fili di ingresso/uscita singolarmente
configurabili, e che possono essere programmati per generare fino a 4 tipi
diversi di interrupt (uno per ogni porta).
Cliccare sul disegno per vedere
lo schema elettrico