Questa pagina è stata scritta molti anni fa e quindi non posso più fornire alcun supporto
Questa pagina descrive un convertitore seriale/parallelo che permette di collegare alla porta parallela (scusate il gioco di parole...) di un personal computer un gran numero di uscite digitali. E' inoltre descritto lo schema del cavo con cui collegare alcuni miei progetti che utilizzano questo convertitore alla porta parallela di un PC.
Si tratta di una pagina che non presenta un circuito "autonomo" quanto piuttosto un'idea che va utilizzata per pilotare altri dispositivi. Più avanti potrete trovare qualche esempio.
Molto spesso è necessario collegare circuiti elettronici digitali alla porta parallela del personal computer: la cosa sfiora il banale se una decina di segnali in uscita sono sufficienti e se non è richiesta nessuna protezione al delicato hardware interno del PC da possibili danni di natura elettrica.
Per esempio su internet si trovano molti circuiti per il pilotaggio di motori passo-passo che, per ciascuno di essi (o per ciascuna coppia), prevedono una diversa porta parallela; spesso questi circuiti, in caso di guasto o errore di montaggio, semplicemente portano alla distruzione dell'intero PC !
L'idea che qui presento permette di collegare molte decine di segnali ad una singola porta parallela con l'isolamento ottico del PC (non una garanzia assoluta... ma ci siamo vicini!). Lo svantaggio essenziale è la relativa lentezza che, in condizioni pratiche, non permette di andare oltre poche decine di migliaia aggiornamenti al secondo. In condizioni estreme il tempo di aggiornamento potrebbe scendere fino a poco meno di 20 us, pari a poco più di un trasferimento di 500 kbyte al secondo.
L'idea si basa sull'utilizzo di un semplice e molto diffuso convertitore seriale / parallelo in tecnologia CMOS, il CD4094B ai cui fogli tecnici vi rimando per un approfondimento. Questo circuito integrato contiene al suo interno due blocchi:
Per isolare elettricamente il PC dal circuito è necessario provvedere un'alimentazione separata (non necessariamente a 5V, visto che si tratta di un integrato CMOS) ed inserire sui tre segnali digitali un optoisolatore. Si noti che, a seconda di come sono collegati anodo e catodo del led, è possibile il funzionamento dell'optoisolatore come isolatore invertente oppure non invertente.
Lo schema elettrico (di principio!) che ne scaturisce è, nel caso di 16 uscite, il seguente:
Si possono vedere:
L'utilizzo del circuito prevede che il bit che dovrà essere mandato in uscita sul pin Q8 dell'ultimo registro della catena sia posto per primo all'ingresso di ISO3, quindi che sia attivato il clock, poi è il turno del bit diretto verso Q7 e cos' via per 16 volte (nel caso di due registri connessi, altrimenti 8, 24, 80 volte...); in questa fase nessuna delle uscite cambia ma sono svolte solo operazioni interne all'integrato. Infine deve essere attivato l'ingresso di strobe che trasferisce contemporaneamente tutti i bit dei registri a scorrimento interni verso le uscite.
Di seguito la fotografia mostra un particolare di un circuito che implementa tale schema:
Il diagramma temporale seguente mostra la trasmissione ad un doppio registro a scorrimento, cioè16 bit complessivi. Dall'alto si vedono
Si noti che i segnali appaiono "invertiti" rispetto a quelli presenti sui fogli tecnici a causa della presenza degli optoisolatori in configurazione invertente. Il tempo richiesto è di circa 50 us ed è stato ottenuto con una porta parallela montata su scheda madre e pilotata da un device driver in ambiente windows; analoghi tempi sono ottenuti in ambiente dos oppure linux usando ioperm(). Usando parallele PCI ad alta velocità, i tempi possono scendere anche di molto (il limite "fisico" che ho misurato dipende molto dagli optoisolatori e usando 6n135 è intorno ai 20 us); usando parallele ISA i tempi possono raddoppiare. Il processore è sostanzialmente irrilevante a meno, ovviamente, di usare sistemi costruiti 20 anni fa. Si noti inoltre che usando SW che non utilizza device driver in ambiente windows il tempo potrebbe aumentare anche di un ordine di grandezza.
In molti casi pratici potrebbe essere utile collegare più catene di questo tipo in parallelo, usando più ingressi dati e mantenendo comuni il clock e lo strobe: questo permette, per esempio usando 6 ingressi dati + 1 clock + 1 strobe di controllare con 16 impulsi di clock 96 segnali digitali, aumentando quindi la velocità di trasferimento.
La mia scelta è stata quella di utilizzare fino a sei blocchi in parallelo costituiti ciascuno da due registri a otto bit, per un massimo di 96 uscite per ciascuna porta parallela: penso sia un compromesso accettabile tra flessibilità, costi, velocità.
Di seguito alcuni osservazioni che possono venire utili passando dallo schema di principio all'implementazione pratica:
L'immagine seguente mostra un particolare dei segnali presenti all'ingresso dell'optoisolatore (in basso) e alla sua uscita (in alto); nell'esempio specifico ho utilizzato gli optoisolatori a media velocità 6N135. Si noti come i fronti relativamente lunghi in uscita limitano la frequenza operativa a valori intorno al MHz. Un utile accorgimento è quello di scegliere le correnti nel led e le resistenze di pull-up in modo tale che i tempi di propagazione da alto a basso siano uguali a quelli da basso ad alto, come visibile nell'esempio.
Per far controllare i segnali ad un PC o a un microcontrollore è necessario scrivere un software opportuno. Lo schema a blocchi è semplice e facilmente ricavabile dalla descrizione a parole che ho appena fatto, dai diagrammi temporali o dai fogli tecnici dell'integrato 4094. Il codice si riduce a poche decine di istruzioni assembler per un microcontrollore tipico o a poche righe di C.
Se si vuole utilizzare la porta parallela di un PC è possibile usare la libreria del progetto VVIO che implementa tutte le funzioni necessarie. Consiglio in particolare di usare almeno la versione 0.2 che offre un minore consumo energetico e la possibilità di "rallentare" il trasferimento dei bit, cosa utile se si usano parallele estremamente veloci e/o optoisolatori lenti.
Per collegare un dispositivo ad un PC è ovviamente necessario realizzare il cavo di connessione. La prima versione che presento è esclusivamente passiva ed il suo funzionamento potrebbe a volte presentare qualche problema se si vuole collegare alla stessa porta parallela più di un circuito oppure se si sta usando un computer portatile. Più avanti riporto la versione "attiva" che risolve questi problemi.
Potete osservare lo schema del cavo per collegare sei circuiti attraverso connettori a 10 poli (4 pin non sono utilizzati). Ciascuno di essi permette di collegare un registro SIPO di lunghezza arbitraria, del tipo rappresentato nello schema precedente.
Facendo riferimento al connettore di destra e ai due schemi elettrici del cavo e del circuito, i collegamenti sono schematizzati nella seguente tabella:
Isolatore | Funzione | Led | Pin 5x2 | Pin LPT | Nome pin LPT |
ISO1 | strobe | anodo | 1 | 2 | Data 0 |
ISO1 | strobe | catodo | 2 | 25 | GND |
ISO2 | clock | anodo | 3 | 3 | Data 1 |
ISO2 | clock | catodo | 4 | 25 | GND |
ISO3 | D1 | anodo | 5 | 4 | Data 2 |
ISO3 | D1 | catodo | 6 | 25 | GND |
- | riservato | - | 7 | - | - |
- | riservato | - | 8 | - | - |
- | riservato | - | 9 | - | - |
- | riservato | - | 10 | - | - |
Per il rimanenti connettori cambiano le sole righe 5 e 6, come è possibile ricavare dallo schema elettrico del cavo stesso. Per esempio per il connettore di sinistra le differenze sono:
Isolatore | Funzione | Led | Pin 5x2 | Pin LPT | Nome pin LPT |
ISO3 | D6 | anodo | 5 | 9 | Data 7 |
ISO3 | D6 | catodo | 6 | 25 | GND |
Si noti che ai segnali strobe e clock (rispettivamente Data 0 e Data 1 della porta parallela) sono connessi fino a ben 6 led in parallelo, cosa praticamente non realizzabile con la generalità delle porte parallele: dovrebbero erogare circa 90mA per pin, ma già a 20mA alcune porte mostrano segni di "affaticamento". Diciamo che questo schema potrebbe essere adeguato per collegare contemporaneamente uno o due circuiti: la possibilità di un aumento di numero deve essere valutato caso per caso.
L'immagine seguente mostra il prototipo che ho realizzato usando due cavi piatti da 10 poli, due connettori 5x2, un connettore maschio DB25. Chi ha esperienza con i vecchi PC non faticherà a riconoscere che ho usato unicamente le parti utilizzate un tempo per collegare le porte seriali (scusate ancora il gioco di parole!) dalla scheda madre al case del PC.
Se si vogliono collegare fino a sei registri o si vuole utilizzare un PC portatile è meglio utilizzare la versione bufferata del cavo, per la quale è richiesta un'alimentazione esterna e qualche circuito integrato ma che funziona sicuramente con qualunque PC e per qualunque numero di connettori.
Facendo riferimento al connettore di destra i collegamenti sono raggruppati nella seguente tabella:
Isolatore | Funzione | Led | Pin 5x2 | Alimentazione | Pin LPT* | Nome pin LPT |
ISO1 | strobe | anodo | 1 | Vcc | - | - |
ISO1 | strobe | catodo | 2 | - | 2 | Data 1 |
ISO2 | clock | anodo | 3 | Vcc | - | - |
ISO2 | clock | catodo | 4 | - | 3 | Data 2 |
ISO3 | D2 | anodo | 5 | Vcc | - | - |
ISO3 | D2 | catodo | 6 | - | 4 | Data 3 |
- | riservato | - | 7 | - | - | - |
- | riservato | - | 8 | - | - | - |
- | riservato | - | 9 | - | - | - |
- | riservato | - | 10 | - | - | - |
* Attraverso una porta logica invertente
E' previsto un buffer invertente per ciascuna linea (nello schema di principio, con due soli connettori, sono dunque presenti 6 inverter). Si noti che il segnale è collegato al catodo dei led e quindi, a causa della "doppia negazione", questo tipo di connessione è perfettamente intercambiabile al cavo passivo, senza alcuna modifica al software.
Nel file isobuffer.tgz ho inserito lo schema ed il circuito stampato che permette di collegare ad un'unica porta parallela fino a sei circuiti del tipo:
Nella parte superiore del circuito si possono vedere i sei connettori di uscita, tra di loro indipendenti.
In basso si può osservare il connettore per la porta parallela ed il connettore di alimentazione (8... 15Vcc)
C1 | 470uF - 16 Vl - Condensatore elettrolitico verticale |
C2 | 4.7uF - Condensatore elettrolitico o tantalio |
C3 C4 C5 | 220 nF - Condensatore non polarizzato |
D1D2 | 1n4004 - Diodo (anche 1n400x o altro diodo generico da 1A) |
D3 | Led |
JP1JP2 JP3 JP4JP5 JP6 | Connettori 5x2 poli, passo 2.54mm |
JP7 | Connettore 2 poli passo 5mm |
P1 | Connettore DB25 maschio per circuito stampato |
R1 | 2K2 - 1/4W |
U1 U2 U3 | 74F04 - NOT sestuplo |
U4 | 7805 - Regolatore di tensione |
Alcune note sul circuito:
Il file isobuffer.tgz contiene:
licenza | La licenza d'uso che ho utilizzato |
schematic.pdf | Lo schema elettrico del circuito, in formato PDF |
bot.pdf | Circuito stampato lato saldature, in formato PDF |
assembly.pdf | Layout di assemblaggio, in formato PDF |
Per utilizzare questo circuito è necessario disporre dei seguenti file o documenti:
Iso-Buffer - Versione 1.0 - Agosto 2003
Copyright © 2003, Vincenzo Villa
La licenza d'uso da leggere ed accettare prima di utilizzare il prodotto
Tutti i nomi di prodotti e ditte sono proprietà dei legittimi proprietari.
Questo documento è disponibile nella sua forma integrale sul sito https://www.vincenzov.net.