8255 (Programmable Parallel Interface)
Il dispositivo per la comunicazione parallela PPI 8255 (Programmable Parallel Interface) è stato introdotto moltissimi anni orsono, in concomitanza con i primi microprocessori 8080 Intel,
per rendere più flessibile l'uso dei propri prodotti. E' ancora molto usato o da solo o, più spesso, integrato assieme ad altri dispositivi di supporto, nei cosiddetti chip multifunzione che affiancano i microprocessori sulle schede madri. Grazie alla sua versatilità è stato utilizzato nelle interfacce più svariate: stampanti, tastiere, display, terminali, convertitori A/D e D/A, floppy, monitor CRT, macchine utensili, etc. Brevemente, è la classica interfaccia tra il microprocessore ed il mondo esterno.
|
|
- Si tratta di un integrato programmabile impaccato in contenitore DIN a 40 pin o in contenitore PLCC a 44 pin. Possiamo subito distinguere due gruppi di pin: 24 (8 per ogni porta) per i collegamenti con il mondo esterno, i restanti per il collegamento con il microprocessore.
In particolare, appartengono al primo gruppo i segnali PA0..PA7, PB0..PB7, PC0..PC7; fanno parte del secondo gruppo i segnali D0..D7, i 2 pin per l'alimentazione e tutti gli altri segnali di controllo.
|
- Il PPI 8255, mette a disposizione dell'utente tre porte di I/O parallelo ad 8-bit, il cui funzionamento può essere programmato in modo indipendente.
- Permette di eseguire input/output di bit, nibble e byte in modo completamente programmabile via software.
Architettura Interna del PPI 8255
Dal punto di vista del programmatore l'8255 si presenta come un insieme di 4 registri a 8-bit, tre corrispondenti alle porte ed uno al Registro di Controllo.
Accedendo ai registri associati alle 3 porte si esegue il trasferimento dati.
Accedendo al Registro di Controllo si definisce il modo di funzionamento per ciascuna porta.
Il Registro di Controllo può essere solo scritto.
I 4 registri sono accessibili tramite i pin D0-7, selezionando quello desiderato tramite i pin A0 e A1.
|
- Un buffer bidirezionale a 8-bit di tipo 3-state che rappresenta
l'interfaccia tra l'8255 e il bus dati, attraverso il quale vengono trasmessi o
ricevuti dati, parole di controllo e informazioni sullo stato del
PPI;
- Un blocco di controllo delle operazioni di lettura/scrittura, realizzato
tramite logica cablata, che si occupa di abilitare il funzionamento di
dispositivi interni in base alla configurazione dei segnali di comando
direttamente gestiti dal processore:
- Due blocchi di controllo per le porte, che comandano, in base
ai segnali provenienti dalla logica di controllo di R/W e alle parole di comando
provenienti dalla CPU, rispettivamente il gruppo formato dalla porta A e la
parte alta della porta C (gruppo A) e quello formato dalla porta B e la parte
bassa della porta C (gruppo B).
Dal punto di vista della programmazione del dispositivo, questi due blocchi
logici di controllo sono visti come un unico registro ad 8-bit, detto registro di
controllo, indirizzabile dal microprocessore nell'area di I/O;
|
- Tre porte di input/output a 8-bit, denominate A,B,C, che possono
essere programmate in diverse modalità configurando opportunamente il registro
di controllo con operazioni di scrittura.
La porta C, che in alcune modalità viene utilizzata come porta per i segnali
che regolano il sincronismo della trasmissione, è suddivisa in due semiporte da
4bit che possono essere programmate separatamente.
Questi i ruoli svolti da ciascuno dei segnali di controllo:
- -CS (Chip Select): un valore logico basso di questo segnale abilita la comunicazione tra CPU e PPI;
- -RD (Read): un valore logico basso abilita l'invio da parte del PPI verso la CPU, tramite il bus dati, di un byte che può rappresentare un dato ricevuto o lo stato dell'interfaccia;
- -WR (write): un valore logico basso abilita il PPI a ricevere dalla CPU, tramite il bus dati, un valore da emettere o un byte di controllo;
- Reset: un valore logico alto reinizializza il dispositivo, azzerandone il registro di controllo. Tutte le porte sono riprogrammate in modo 0 e con direzione Input.
- A0, A1 (port select): i valori di questi segnali controllano la selezione di una delle 3 porte di I/O o del Registro di Controllo (Control Word). Sono normalmente connessi ai bit meno significativi dell?Address Bus. La Tabella 1 ne illustra il funzionamento.
A1 | A0 | Registro |
0 | 0 | Registro Porta A |
0 | 1 | Registro Porta B |
1 | 0 | Registro Porta C |
1 | 1 | Registro di Controllo |
Tabella 1
N.B. Durante le operazioni di acquisizione o invio di dati attraverso le porte del PPI, la logica di controllo si preoccupa di abilitare il trasferimento dati fra il buffer che interfaccia il bus dati con il PPI e i buffer che interfacciano il PPI con il mondo esterno; si garantisce così la sincronizzazione fra il microprocessore e i dispositivi periferici, che in generale lavorano a clock differenti;
Le Modalità di funzionamento del PPI 8255
La programmazione del PPI avviene caricando nel registro di controllo opportuni valori che consentono non solo di selezionare le varie porte come porte di ingresso/uscita, ma anche di definire per ciascuna di esse la modalità di funzionamento, che può essere scelta tra:
- MODO 0: rappresenta la modalità più semplice, quella in cui non esiste alcun protocollo di sincronizzazione tra porta e dispositivo esterno, nel senso che le porte vengono interpretate come semplici dispositivi sensibili alle variazioni di livello proveniente dall'esterno (input diretto), oppure come uscite bloccate al livello voluto (output bufferizzato).
Ciò implica che il trasmettitore invia il proprio dato senza verificare che il ricevente sia predisposto alla sua ricezione, e che il ricevente non viene avvertito quando il dato è stato posto sulla linea da parte del trasmettitore.
Definendo per le porte questa modalità di funzionamento quindi, si demanda il controllo della cadenza da dare alle operazioni di I/O al programma di gestione, che dovrà tenere conto delle caratteristiche del dispositivo collegato.
Per questo motivo il modo 0 viene generalmente utilizzato per semplici operazioni di acquisizione dati provenienti direttamente da sonde rilevatrici, attraverso un campionamento cadenzato dei dati presenti sulla linea, oppure per l'invio dei segnali di comando.
- MODO 1: introduce un primo tipo di controllo hardware sulla trasmissione, subordinando il trasferimento dei dati a dei segnali di controllo che devono essere passati da un estremo all'altro dei canali di comunicazione (protocollo di tipo handshake).
L'operazione di acquisizione dei dati provenienti da un dispositivo periferico in modo 1 avviene attraverso le seguenti fasi:
a) il terminale deposita un dato sulla linee di collegamento ad 8-bit e invia all'8255 un segnale di dato pronto (input strobe) sul primo filo di controllo;
b) l'8255, blocca il dato presente sulla linea nel latch di ingresso della porta selezionata e invia al terminale un segnale di dato ricevuto (input buffer full) sul secondo filo di controllo. Si comunica così l'avvenuta registrazione nel latch e si esibisce contemporaneamente la trasmissione di un nuovo dato;
c) l'8255, se abilitato, invia al microprocessore una richiesta di interruzione tramite il terzo filo di controllo, segnalando la presenza di un dato nel buffer
di ingresso;
d) una volta che il microprocessore ha prelevato il dato dal buffer, l'8255 inverte il segnale di input buffer full, abilitando così il dispositivo esterno all'invio di un nuovo dato.
L'operazione inversa, viene gestita utilizzando i segnali duali di incronizzazione:
a) l'8255, riconosciuta la possibilità di inviare un dato sulla linea,
lo pone sulle 8 linee dati e, dopo una breve attesa per la stabilizzazione dei segnali elettrici, comunica l'evento con un segnale di dato disponibile (output buffer full), riconosciuto come strobe dal periferico;
b) l'8255 rimane in attesa di un segnale di dato riconosciuto
(acknoledgement), corrispondente alla negazione dell'input buffer full.
c) Ricevuto il segnale, viene resettato il segnale di dato disponibile e, qualora il dispositivo sia abilitato, invia una richiesta di interruzione per comunicare al microprocessore la disponibilità della porta ad accettare un nuovo dato da inviare in uscita.
- MODO 2: è stato progettato per la gestione di colloqui
paralleli ad 8bit in modo half duplex e prevede l'utilizzo di quattro segnali
per il controllo handshake di tipo bidirezionale.
Lo scambio di informazioni di controllo fra 8255 e terminale avviene in maniera analoga a quella descritta per il modo 1, anche se in questo caso sono presenti contemporaneamente quattro segnali di controllo, due utilizzati per la procedura di ingresso secondo la sequenza dato pronto e dato ricevuto e gli altri due per la procedura d'uscita secondo la sequenza dato disponibile dato riconosciuto. Inoltre viene utilizzato un unico segnale di richiesta d'interruzione sia per l'input che per l'output.
Quando il PPI è programmato per operare in modo 1 o 2, alcune linee associate alla porta C possono essere utilizzate per inviare alla CPU delle richieste d'interruzione.
L'abilitazione o l'interdizione all'invio di questi segnali d'interruzione viene
controllata tramite appositi flip-flop di inte (Interrupt enable) il cui
valore può essere definito tramite le operazioni set/reset che possono essere
gestite tramite il registro di controllo.
La Programmazione del PPI 8255
La programmazione del PPI, sia per quanto riguarda la modalità di funzionamento sia per quel che concerne l'abilitazione alle interruzioni, avviene attraverso dei byte che il microprocessore invia all'8255 sul bus dati (D0..D7), indirizzandoli verso il registro di controllo (segnali A0 e
A1 entrambi alti).
Il formato di questi byte prende il nome di maschera di controllo, ed ha il formato seguente:
In particolare quando il bit più significativo (D7) vale 1, il
byte di controllo consente di impostare le modalità di funzionamento delle tre
porte secondo il seguente schema:
D7 |
1 |
Preimpostato per la programmazione delle porte |
D6-D5 | 00 01 10 | MA - Modo di funzionamento del gruppo A MODO 0 MODO 1 MODO 2 |
D4 | 1 0 |
PA - Direzione del trasferimento per la porta A INPUT OUTPUT |
D3 | 1 0 |
PCH - Direzione del trasferimento per la parte alta della porta C INPUT OUTPUT |
D2 | 0 1 |
MB - Modo di funzionamento del gruppo B MODO 0 MODO 1 |
D1 | 1 0 |
PB - Direzione del trasferimento per la porta B INPUT OUTPUT |
D0 | 1 0 |
PCL - Direzione del trasferimento per la parte bassa della porta C INPUT OUTPUT |
Tabella 2
Quando invece il bit più significativo (D7) assume il valore 0, il byte di controllo permette di modificare il valore dei singoli flip-flop di abilitazione delle interruzioni, usati nelle modalità 1 e 2.
D7 |
0 |
Preimpostato per la programmazione dei flip-flop |
D6..D4 | |
Non significativi |
D3..D1 | 000 001 010 ... 111 |
AB - Address Bit, indirizzo di selezione del bit della porta C su cui operare bit 0 bit 1 bit 2 ... bit 7 |
D0 | |
DB - Data Bit, bit di dato assegnato al bit indirizzato della porta C |
Tabella 3
Le Comunicazioni del PPI 8255
- Nel Modo 0 è possibile utilizzare indipendentemente le tre porte del PPI, creando ben quattro gruppi di linee di I/O (porte A e B, parte alta C, parte bassa C), ciascuno dei quali può essere attivato all'occorrenza come input o come output.
Attenzione nel modo 0 la sincronizzazione è tutta a carico del programma di gestione, adifferenza del modo 1 nel quale i segnali di controllo, automaticamente generati e letti
dal PPI, permettono alla porta di adeguarsi alla velocità di trasmissione o
ricezione del dispositivo esterno.
- Il Modo 1, più complesso del precedente, è stato espressamente progettato per la gestione di colloqui paralleli ad 8-bit in modo simplex, durante i quali la gestione dei segnali di sincronizzazione (segnali di handshake) è demandata al PPI.
Inoltre è prevista la possibilità di gestire le operazioni di input/output in modo asincrono collegando alcune linee della porta C direttamente al PIC (Programmable Interrupt Controller) di sistema: in questo modo è possibile, se necessario, generare delle richieste di interruzione per operazioni di acquisizione o trasmissione da parte della CPU.
In questa modalità sono ovviamente utilizzabili per il trasferimento dei dati solo le porte A e B dal momento che alla porta C viene demandata la gestione dei segnali di sincronizzazione e di interruzione.
- Nel Modo 2 siamo di fronte ad un metodo più sofisticato espressamente progettato per la
gestione dei colloqui ad 8-bit in modo half-duplex, durante i quali la gestione dei segnali di sincronizzazione (segnali di handshake) è completamente demandata al PPI.
Inoltre è prevista la possibilità di gestire le operazioni di input/output in modo asincrono collegando alcune linee della porta C direttamente al PIC di sistema, così da poter generare delle richieste di interruzione per operazioni di acquisizione o trasmissione dati da parte della CPU.
In questa modalità solo la porta A può essere utilizzata per il trasferimento
dati mentre la porta C gestisce i segnali di sincronizzazione che sono gli
stessi previsti dal modo 1 per la porta A supponendola attiva contemporaneamente
sia per l'input che per l'output.
Applicazioni
Nei semplici esempi prospettati supporremo di avere installato un PPI8255 all'indirizzo base 0300h e quindi l'assegnazione degli indirizzi sarà la seguente:
rPA = 0300h | rPB = 0301h | rPC = 0302h | rCTRL = 0303h |
- Programmare in asm86 un PPI8255, funzionante in modo 0, con PA in output e PB e PC in input. Il problema fondamentale è la preparazione della maschera di programmazione, costituita da 8 bit impostati secondo la tabella 2 e le richieste del problema: D7=1 (Impostazione predefinita), D6=0 e D5=0 (Modo 0 gruppo A), D4=0 (PA in Output), D3=1 (PCH in Input), D2=0 (Modo 0 gruppo B), D1=1 (PB in Input), D0=1 (PCL in Input).
Pertanto la maschera sarà: 10001011b oppure 8Ah, ed il codice seguente programmerà il PPI8255:
MOV AL,8Ah
MOV DX,0303h
OUT DX,AL
- Emettere su PA 8 bit di valore 00110101 e leggere lo stato di PB. Dopo aver programmato il PPI8255 come al punto 1, eseguire il codice seguente:
MOV AL,35h
MOV DX,0300h
OUT DX,AL
MOV DX,301h
IN AL,DX
Il dato 35h verrà emesso su PA, i dati presenti su PB verranno caricati (letti) nel registro AL.