Hardware Spp Board


Interfaccia di input/output per porta parallela espandibile fino a 64 linee. Spp Board
Figura 1


Schema elettrico
Schema elettrico
Figura 2

Datasheets degli integrati utilizzati per questo progetto
74138Decoder 1 su 8Datasheet
743748 latch DDatasheet
74157Mux quadruplo da 2 a 1 lineaDatasheet


Lo scopo di questo progetto e' quello di utilizzare la porta parallela del pc, conosciuta anche come porta stampante o lpt, come dispositivo di input output. In questa pagina troverete la descrizione del circuito in Figura 1 dando per scontato che chi legge conosca abbastanza approfonditamente il funzionamento della porta parallela. Se non sapete come funziona o avete dei dubbi potete fare riferimento al tutorial che trovate nella sezione teoria. Questo progetto fa uso della porta parallela in modalita' SPP. Inoltre questo progetto fa uso di un linguaggio di programmazione che in questo caso e' il C.

Ho realizzato questo progetto in quanto sentivo la necessita' di poter utilizzare piu' dispositivi di input/output, connessi alla porta parallela, che fossero selezionabili attraverso un chip select, proprio come succede quando si decodificano degli indirizzi del bus di un microprocessore. Considerando il funzionamento SPP, balza subito agli occhi che si dispone di queste linee : 12 linee di output, 5 linee di input (tutte monodirezionali, nel funzionamento SPP). E' stato naturale pensare che avrei potuto utilizzare 8 delle linee di output per effettuare appunto l'output e altre 3 linee di output, decodificandole, in modo da ottenere 8 chip select. Come si puo' vedere dallo schema elettrico ho quindi utilizzato i pin 14, 16 e 17 della porta lpt (corrispondenti alle linee autofeed/, bit 1 del Control register, initialize/, bit 2 del Control register e select in/, bit 3 del Control register), come ingressi di decodifica di un decoder 74138. A seconda del valore di queste 3 linne otterro' quindi l'attivazione in uscita del corrispondente chip select (cs0..cs7). Di fianco ai vari cs trovate il valore base da assegnare al Control register nel caso si vogliano attivare i diversi chip select. Per esempio, a fianco di cs4 trovate 0x08 : questo significa che per attivare cs4 e quindi il dispositivo 4 (dev 4 ), occorre scrivere sul Control register il dato 0x08.

Dando un occhiata al resto del circuito noterete che viene utilizzato un altro bit, strobe/ (piedino 1 e bit0 del Control register), per le operazioni di trasferimento vero e proprio dei dati. Per esempio esso viene utilizzato nel latch a 8 stadi 74374 per trasferire il byte in uscita quando il programma che gira sul pc lo decide (attendera' infatti che i dati siano stabili e poi inviera' un opportuno comando su strobe/ per trasferirli). Essendo lo strobe/ il bit 0 del Control register ed essendo autofeed/, initialize/ e select in/, rispettivamente i bit 1,2 e 3, per ogni cs selezionato avremo a disposizione 2 valori da poter assegnare al Control register : il valore base ed il valore base+1. Per quanto riguarda l'esempio precedente, cs4 sara' attivo sia con il valore 0x08 che con il valore 0x09 posto sul Control register. Questa possibilita' e' molto utile per la mia scheda, infatti e' stata prevista apposta, in quanto consente :
1) di poter trasmettere il dato quando questo e' effetivamente stabile e sotto il controllo del programma
2) di poter effettuare la lettura di 8 bit avendo a disposizione solamente 4 bit di input, con un multiplexer come il 74157 e sfruttando il famoso strobe/ (quando e' a 0 si leggono i 4 bit meno significativi, quando e' a 1 i 4 bit piu' significativi).

A questo punto, visto che l'abbiamo introdotto, vediamo come fare una lettura a 8 bit disponendo solo di 4 bit di input; in realta' ne avremmo 5 ma ne usiamo solo 4 per due motivi :
1) e' logico supporre che e' meglio leggere 8 bit con una doppia lettura di 4 bit piuttosto che utilizzarne 5.
2) il bit ack/, pin 10 e bit 6 del Status register deve essere mantenuto a disposizione se uno dei dispositivi, o una ulteriore scheda connessa a questa, volesse lanciare una richiesta di interrupt sulla porta parallela.

Ci si potrebbe chiedere il motivo della scelta della modalita' SPP, perche' non utilizzare la EPP o la ECP che permettono trasferimenti bidirezionali a 8 bit ? Anche in questo caso ci sono i soliti 2 motivi :
1) voglio assolutamente mantenere la compatibilita' verso il basso, verso cioe' quei pc (286, 386 e 486) che si trovano per pochi euro alle fiere che nessuno vuole piu'. Invece sono ancora utilissimi per connetterli al mondo esterno. Quasi sempre sono equipaggiati con porte parallele standard, SPP appunto.
2) la SPP ha linee di output aggiuntive che possono essere utilizzate per decodificare dei chip select.
Il rovescio della medaglia e' che con la SPP la lettura di 8 bit e' abbastanza macchinosa e lenta, occorrono infatti 2 lettura di 4 bit ciascuna. La lettura dei 4 bit meno significativi viene fatta con strobe/ a livello logico 0, la lettura dei 4 bit piu' significativi viene fatta con strobe/ a livello logico 1. Comunque fatta una volta e' fatta per sempre, basta creare una function in C che si occupi di eseguire queste operazioni, poi la possiamo riusare ogni volta che vogliamo. Ora io non so se ho "collegato" i bit del Status register con le uscite del 74157 nel modo migliore possibile, fatto sta che per leggere 8 bit mi occorrono tutte le operazioni di seguito indicate.
Considerato che, dopo le letture, lo Status register e' messo in queste condizioni :

Status register dopo la lettura dei 4 bit meno significativi (strobe/=0)
D7D6D5D4D3D2D1D0
bit3Xbit2bit1bit0XXX


Status register dopo la lettura dei 4 bit piu' significativi (strobe/=1)
D7D6D5D4D3D2D1D0
bit7Xbit6bit5bit4XXX


Occorrera' svolgere alcune operazioni per ottenere un byte che sia costituito dagli 8 bit , indicati in precedenza, che siano in fila, dal bit7 al bit0. Per fare questo vi invito a scaricare, in fondo alla pagina, ed utilizzare le funzioni che trovate nei vari moduli he ho predisposto per utilizzare questa scheda.

Riassumendo :

1) la Spp Board puo' indirizzare fino a 8 dispositivi di i/o a 8 bit

2) gli 8 chip select si attivano con gli indirizzi base (pari) che sono ripettivamente : 0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e.

3) a seconda del dispositivo usato si utilizza anche l'indirizzo dispari (base+1), che indirizza lo stesso chip select, per le operazioni di trasferimento dati in output o doppia lettura dei dati in input (2 letture da 4 bit ciascuna)

4) nel nostro caso abbiamo collegato il dispositivo di output al cs0 e quello di input al cs1, tutti gli altri sono liberi per future espansioni.

5) il dispositivo di output, essendo un latch, permette di mantenere il dato in uscita liberando la porta parallela.

Per i programmi ed i moduli di gestione vai alla pagina del software


Stampa la pagina