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.

    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.

    A1A0Registro
    00Registro Porta A
    01Registro Porta B
    10Registro Porta C
    11Registro 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;

    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, 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).

    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
    Modo di funzionamento del gruppo A
    MODO 0
    MODO 1
    MODO 2
    D4 
    1
    0
    Direzione del trasferimento per la porta A
    INPUT
    OUTPUT
    D3 
    1
    0
    Direzione del trasferimento per la parte alta della porta C
    INPUT
    OUTPUT
    D2 
    1
    0
    Modo di funzionamento del gruppo B
    MODO 0
    MODO 1
    D1 
    1
    0
    Direzione del trasferimento per la porta B
    INPUT
    OUTPUT
    D0 
    1
    0
    Direzione del trasferimento per la parte bassa della porta C
    INPUT
    OUTPUT

    Tabella 2

    Quando invece il bit più significativo 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
    Selezionano il bit della porta C su cui operare
    bit 0
    bit 1
    bit 2
    ...
    bit 7
    D0  Definisce il valore da assegnare al bit

    Tabella 3

    • 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.

    Nei semplici esempi prospettati supporremo di avere installato un PPI8255 all'indirizzo base 0300h e quindi l'assegnazione degli indirizzi sarà la seguente:
    rPA = 0300hrPB = 0301hrPC = 0302hrCTRL = 0303h
    1. 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
      
    2. 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.