Porta parallela standard
Per prima cosa
In queste pagine trovate un piccolo tutorial sulla porta parallela standard Spp, interfaccia che
si trova su tutti i pc. L'autore non si assume nessuna responsabilita' in merito a danni o guasti
derivanti dall'applicazione di queste brevi note.
Personalmente, soprattutto a chi e' alle prime armi, consiglio di acquistare, per pochi euro, una
seconda parallela e di installarla in uno slot di espansione libero.
In questo caso basta collegare i ponticelli dell'indirizzo e irq della seconda scheda ed il gioco
e' fatto, per inserire l'indirizzo basta conoscere quello della parallela principale, e vedremo in seguito come si fa.
Conosciuto l'indirizzo della parallela principale ci basta selezionarne un altro fra quelli a disposizione.
Per quanto riguarda l'irq, se non avete la necessita' di gestire delle interruzioni lo potete
lasciare scollegato, oppure inserirlo su irq5 se la parallela principale ha l'irq7, oppure viceversa.
E' molto piu' saggio utilizzare la seconda parallela per i nostri esperimenti, soprattutto sui pc
moderni dove tutta la circuiteria, porte di i/o comprese, sono integrate sulla scheda madre.
Danneggiare la porta parallela per un errore nei collegamenti significa non poter piu' usare,
nel migliore dei casi, la porta parallela del pc e, se si e' sfortunati, danneggiare irrimediabilmente
anche la scheda madre.
In Figura 1 potete vedere la foto di una scheda parallela che ho acquistato ad una fiera dell'elettronica
per 1 euro.
Con 1 euro risparmiate l'intero pc !
Mi raccomando dunque di seguire questi consigli, se utilizzate un pc moderno soprattutto. Se invece
utilizzate un pc di cui non vi frega nulla allora potete andare tranquilli, ma buttare un pc per
non aver voluto spendere pochi euro non e' molto saggio.
Sembrero' esagerato ma le prime volte io ho effettuato numerosi errori di collegamento fra i miei
circuiti e la parallela, sembra impossibile ma di errori, anche grossolani, se ne fanno.
Porta parallela aggiuntiva del valore di pochi euro
Figura 1
I connettori
La porta parallela (lpt) e' disponibile sul retro del pc attraverso un connettore Cannon Db 25 poli femmina.
I case dei pc, purtroppo, vengono costruiti in funzione di un loro utilizzo in ufficio o per la
casa, ambienti nei quali essi convivono con altri dispositivi ad essi collegati.
Effettuati i collegamenti, di norma in fase di installazione, difficilmente
si sente in seguito la necessita' di dover accedere al retro del pc. Di qui gli strati di polvere che normalmente si
depositano dietro al computer.
Per coloro che invece utilizzano il pc come vero e proprio strumento di laboratorio questi case non
sono molto comodi.
Il mio case ideale dovrebbe avere tutte le porte di i/o sul davanti, magari sotto il floppy drive
o il cd rom, in modo tale da non dovere spostare il pc e tutti i cavi ad esso connessi ogni volta che
voglio accedere ai connettori della parallela, della seriale o della usb.
Sarebbe veramente bello disporre di un case del genere. In realta' si potrebbe realizzare modficandone
uno e riportando davanti, con dei cavi flat per esempio, le varie porte.
Per il momento io ho riportato, attraverso un flat cable, il connettore della porta parallela davanti,
sul tavolo, in modo tale che ogni volta che ne ho bisogno mi e' comodo.
Un altro buon motivo per fare una cosa del genere e che ogni volta che si va ad inserire o a togliere
il connettore sulla parallela si finisce per muoverla o per svitare i dadini esagonali che la tengono
ferma sul case. E' molto meglio utilizzare un flat cable.
Perche' ho scelto la Spp
Le porte parallele possono essere di 3 tipi, a seconda delle prestazioni che esse permettono :
- Spp : Standard Parallel Port
- Epp : Enanched Parallel Port
- Ecp : Extended Capabilities Port
La Spp e' la porta parallela standard, la piu' antica. Permette trasferimenti di dati a 8 bit, in output,
e a 5 bit in input. E' abbastanza lenta. Era stata realizzata pensando solo al collegamento con la
stampante.
La Epp e' piu' moderna, ce ne sono di varie versioni e permette trasferimenti di dati bidirezionali a 8 bit.
E' molto piu' veloce della Spp.
La Ecp e' ancora piu' moderna e permette una grande varieta' di funzionamento.
Perche' allora io ho scelto la Spp ?
Principalmente per due 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 letture di 4 bit ciascuna.
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.
Indirizzi
La porta parallela ha un indirizzo, chiamato indirizzo base, che di norma e' 0x378. Ma questo non e'
sempre vero, in realta' per esserne sicuri, ci basta andare a leggere l'indirizzo che e' scritto a partire
dalla locazione di memoria 0040:0008.
Da questa locazione in avanti sono infatti mappate tutte le eventuali lpt presenti nel pc.
In Figura 2 si vede come fare da una finestra dos, attraverso il comando debug.
Figura 2
In questo caso abbiamo letto 6 byte, l'indirizzo di ogni parallela e' formato da 2 byte, e troviamo che
esiste la lpt1 all'indirizzo 0x378 mentre lpt2 e lpt3 danno indirizzo pari a 0000 cioe' non esistono.
Questo metodo e' abbastanza semplice ma non si presta per essere utilizzato nella rilevazione automatica
dell'indirizzo.
E' comunque molto utile se dobbiamo conoscere al volo l'indirizzo.
Se volessimo fare un programma di gestione della parallela che, per essere veramente universale,
per prima cosa va a "scovare" l'indirizzo automaticamente allora possiamo vedere un programmino
in C che ho realizzato sfruttando alcune note trovate in rete (Figura 3) :
Figura 3
Il programma ha trovato la lpt1 e basta... anche se in questo caso ha trovato un indirizzo alla
locazione sopra la quale dovrebbe essere mappata la lpt4.
Ma io la lpt4 non ce l'ho per cui devono aver mappato qualche cosa di diverso sul suo indirizzo.
In ogni caso il dato da tenere in considerazione e' ovviamente quello relativo alla lpt1 che ha indirizzo
base pari a 0x378.
Questo e' il listato in C del programmino :
A completamento di quanto detto riporto comunque le locazioni di memoria sopra le quali sono
mappati i vari indirizzi delle lpt :
Indirizzi lpt e relative locazioni di memoria
| Lpt | Locazione |
| 1 | 0000:0408 |
| 2 | 0000:040a |
| 3 | 0000:040c |
| 4 | 0000:040e |
I registri e i pin della porta parallela Spp
Nel paragrafo precedente si e' fatto riferimento all'indirizzo base.
Questo perche' nella porta parallela Spp sono presenti 3 registri : Data Register,
Status Register e Control Register.
Essi hanno un loro indirizzo, il Data register corrisponde all'indirizzo base, lo Status register
all'indirizzo base+1 e il Control register all'indirizzo base+2.
Supponendo di avere 3 parallele installate sul nostro pc con indirizzo base rispettivamente paria a : 0x378, 0x278 e
0x3bc avremo la seguenta mappatura dei registri :
| Lpt | Data Register | Status Register | Control Register |
| 1 | 0x378 | 0x379 | 0x37a |
| 2 | 0x278 | 0x279 | 0x27a |
| 3 | 0x3bc | 0x3bd | 0x3be |
La porta parallela Spp ha 12 linee di output e 5 di input, il Data register ha 8 bit di output
unidirezionali, il Control register ne ha altre 4 in output e lo Status register ne ha 5 in input.
Vediamo di seguito una tabella con la corrispondenza fra i registri, i bit nello specifico ed i pin
del connettore cannon db 25.
Assegnamento Pin, Bit, Registri
| Db25 pin | Nome | Direzione | Registro |
1 | /strobe | output | Control |
| 2 | data 0 | output | Data |
| 3 | data 1 | output | Data |
| 4 | data 2 | output | Data |
| 5 | data 3 | output | Data |
| 6 | data 4 | output | Data |
| 7 | data 5 | output | Data |
| 8 | data 6 | output | Data |
| 9 | data 7 | output | Data |
| 10 | /ack | input | Status |
11 | busy | input | Status |
| 12 | Pe | input | Status |
| 13 | Select | input | Status |
14 | /autofeed | output | Control |
| 15 | /error | input | Status |
| 16 | init | output | Control |
17 | /select in | output | Control |
| 18..25 | gnd | gnd | gnd |
Questa tabella mette in relazione i vari pin del connettore cannon a 25 poli, colonna 1, i segnali ad essi
associati, colonna 2, la direzione di questi segnali, colonna 3 e il registro di cui essi fanno
parte.
Nelle tabelle che seguono vengono spiegati nel dattagli i tre registri della Spp.
Per convenzione in seguito indichero' i bit appartenenti ai veri registri con la prima lettera uguale
a quella del registro di cui fanno parte, esempio : per indicare i bit del Data register parlero'
di d7, d5 ecc., per quelli dello Status register parlero' di s6, s0 ecc e per quelli del Control
register parlero' di c2, c7. ecc.
Data register, indirizzo = base
| Pin | Bit | Dir | Nome |
| 9 | d7 | -> | data7 |
| 8 | d6 | -> | data6 |
| 7 | d5 | -> | data5 |
| 6 | d4 | -> | data4 |
| 5 | d3 | -> | data3 |
| 4 | d2 | -> | data2 |
| 3 | d1 | -> | data1 |
| 2 | d0 | -> | data0 |
Si tratta del Data register, il registro mappato all'indirizzo base. Esso e' composto di 8 bit
d0..d7 in scrittura, cioe' in output.
Status register, indirizzo = base+1
| Pin | Bit | Dir | Nome |
11 | s7 | <- | busy |
| 10 | s6 | <- | /ack |
| 12 | s5 | <- | pe |
| 13 | s4 | <- | select |
| 15 | s3 | <- | /error |
| s2 | | riservato |
| s1 | | riservato |
| s0 | | riservato |
Si tratta dello Status register, il registro mappato all'indirizzo base+1. Esso e' composto da
5 bit di input, da s7 a s3 e da altri 3 bit riservati, da s2 a s0. L'hardware della Spp inverte
il bit s7, corrispondente al segnale busy, pin 11.
Control register, indirizzo = base+2
| Pin | Bit | Dir | Nome |
| c7 | | riservato |
| c6 | | riservato |
| c5 | | riservato |
| c4 | <- | irq enable |
17 | c3 | -> | /select in |
| 16 | c2 | -> | init |
14 | c1 | -> | /autofeed |
1 | c0 | -> | /strobe |
Si tratta del Control register, il registro mappato all'indirizzo base+2. Esso e' composto da 4 bit di output,
da c3 a c0. E' anche presente un segnale denominato irq enable a cui possiamo accedere unicamente
via software, infatti non e' collegato a nessun pin.
Se il bit c4 di questo registro viene abilitato viene generata una richiesta di interrupt ogniqualvolta
viene rilevata una transizione da livello logico 1 a livello logico 0 sul bit s6, /ack, dello Status
register.
Anche in questo caso l'hardware della Spp inverte alcuni bit. Essi sono c3, c1 e c0.
Come gestire l'inversione dei bit
Come gia' visto in precedenza, l'hardware della Spp inverte alcuni bit di 2 registri. Sullo Status
register inverte il bit s7, sul Control register inverte i bit c3, c1 e c0.
Questo significa che se per esempio voglio leggere lo Status register e sul bit s7 ho un 1 logico
dopo la lettura mi ritrovero' uno 0 logico in corrispondenza di quel bit. Allo stesso modo, se
sul Control register effettuassi una scrittura per settare tutti i bit da c3 a c0, in realta' in
uscita otterrei c3 a 0, c2 a 1, c1 a 0 e c0 a 0.
Ci occorre pertanto un meccanismo software che si occupi di ri-invertire solo i bit che la Spp
inverte. In realta' fare questo e' molto semplice : basta fare un Exor fra il byte che la Spp
restituisce ed un byte che abbia ad 1 le posizioni dei bit che la Spp inverte, a 0 tutte le altre.
Quindi, in riferimento a quanto detto prima, dovremo mettere il byte letto sullo Status register in
exor con il byte 0x80.
Dovremo inoltre mettere in Exor con il byte 0x0b la parola scritta sul Control register.
Per il Data register non dobbiamo fare niente perche' in questo caso non viene invertito nessun
bit.
Esempio :
Effettuo una lettura dello Status register ed ottengo : 10011111
Il bit s7 vale 1 ma in realta' vale 0 perche' l'hardware lo ha invertito.
Allora metto il Control register in exor con il byte 10000000 (0x80) per cui ottengo
il dato corretto che e' : 00011111 (che e' la stesso byte di prima con s7 re-invertito cioe'
apposto).
Vediamo come fare in C :
Ad entrambe le function viene passato l'indirizzo corrispondente su addr, StatusIn restituisce una
char con il dato letto.
Per trovare queste ed altre function per la gestione della Spp
fate riferimento al progetto
Sppboard che e' un progetto completo che coinvolge tutte le cose dette in precedenza.