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

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.

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

FindLpt
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

LptLocazione
10000:0408
20000:040a
30000:040c
40000: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 :


LptData RegisterStatus RegisterControl Register
10x3780x3790x37a
20x2780x2790x27a
30x3bc0x3bd0x3be


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 pinNomeDirezioneRegistro
1
/strobe
outputControl
2data 0outputData
3data 1outputData
4data 2outputData
5data 3outputData
6data 4outputData
7data 5outputData
8data 6outputData
9data 7outputData
10/ackinputStatus
11
busy
inputStatus
12PeinputStatus
13SelectinputStatus
14
/autofeed
outputControl
15/errorinputStatus
16initoutputControl
17
/select in
outputControl
18..25gndgndgnd
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

PinBitDirNome
9d7->data7
8d6->data6
7d5->data5
6d4->data4
5d3->data3
4d2->data2
3d1->data1
2d0->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

PinBitDirNome
11
s7
<-
busy
10s6<-/ack
12s5<-pe
13s4<-select
15s3<-/error
s2riservato
s1riservato
s0riservato
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

PinBitDirNome
c7riservato
c6riservato
c5riservato
c4<-irq enable
17
c3
->
/select in
16c2->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.


Stampa la pagina