Salta la barra di navigazione [1] - Vai alla barra di navigazione [3] - Scrivimi una mail [4]

Convertitore seriale/parallelo

Sommario - Novità - Tutorial - Progetti - Risorse - Non solo elettronica - EN -

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.

Il problema

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'implementazione

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:

Lo schema elettrico di principio

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:

Una implementazione pratica

Il diagramma temporale seguente mostra la trasmissione ad un doppio registro a scorrimento, cioè16 bit complessivi. Dall'alto si vedono

  1. il clock
  2. il dato trasmesso 
  3. il segnale di strobe. 

Trasmissione ad un registro a scorrimento di 16 bit

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à.

Alcune osservazioni

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.

Un particolare in cui si vedono i tempi di salita

Il software

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.

Un cavo passivo di connessione

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.

Lo schema di una connessione "passiva"

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.

Un cavo passivo

Iso-Buffer

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.

Lo schema del buffer

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:

Il circuito per collegare sei convertitori alla parallela

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) 

I componenti

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:


EN - Pagina principale - Sommario - Accessibilità - Note legali e privacy policy - Posta elettronica

XHTML 1.0 Strict - CSS 3