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 :
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