La porta parallela, così come ormai la seriale, va sempre più scomparendo (purtroppo!) soprattutto dai portatili. Veniva (viene) utilizzata per lo più per il collegamento delle stampanti (ma anche, tanto tempo fa, per scanner, drive iomega zip, chiavette per la protezione del software ecc). Per la sua semplicità di utilizzo, però, viene ancora oggi preferita dagli hobbysti per l’interfacciamento con numerosi dispositivi, primi tra tutti le CNC o i programmatori di microcontrollori/smartcard, ma anche per tante altre applicazioni.
La porta parallela è facile da utilizzare per il comando di dispositivi, proprio perchè consente l’invio contemporaneo di un byte su 8 distinte linee (trasmissione parallela – a differenza della trasmissione seriale che utilizza un’unica linea e quindi invia gli 8 bit uno dietro l’altro sulla stessa linea) : 8 linee di I/O, impostabili con un’unico invio di dati, che possono comandare altrettanti attuatori. In realtà, sulla porta parallela, di linee di I/O ce ne sono qualcuna in più, il che la rende appunto ideale per il controllo di relè, triac, mosfet ecc (per l’attuazione di motori, lampade ed altro) senza la necessità di dover “impazzire” con il codificare/decodificare una comunicazione seriale su di un’unica linea e quindi senza utilizzare microcontrollori e software “complicato”. In molti la usano per comandare display LCD (in maniera diretta) o motori passo/passo (tramite interfacce a transistor), soprattutto nelle CNC.
Per seguire meglio questa lezione, vi consiglio innanzitutto di scaricare dapprima il documento “Piedinatura e note di utilizzo della porta parallela” che ho appositamente preparato per voi nella sezione risorse: si tratta di un’unica pagina in formato PDF che può risultare molto utile tenerla sempre a portata di mano nel nostro piccolo laboratorio di elettronica.
La porta parallela
La porta parallela si presenta sul pc come un connettore di tipo Dsub a 25 poli:

Le linee su cui normalmente vengono inviati i dati alla stampante (o ad altri dispositivi), sono quelle colorate in viola nel disegno (pin da 2 a 9). Per tale motivo vi sono anche 8 pin di massa: generalmente ogni linea dati va intrecciata con una linea di massa in maniera tale da avere una migliore schermatura per la protezione dai disturbi.
Come vedete ho colorato i pin in maniera differente: questo perchè ogni gruppo di linee (identificato da un colore) appartiene ad un differente registro. Mi spiego meglio: la porta parallela, sul pc, viene controllata via hardware da 3 differenti registri chiamati Data, Status e Control.
Per controllare lo stato delle linee Data (indicate come Dn, e colorate in viola sullo schema), dovremo impostare opportunamente il registro Data ecc. Le linee Dati (data), sui nuovi pc sono bidirezionali: normalmente sono utilizzate come linee di output, ma settando ad 1 il bit 5 del registro Control, possono essere utilizzate come porte di ingresso.
Gli indirizzi esadecimali dei 3 registri delle porte parallele sono riportati nel documento che citavo prima nella sezione risorse: per la LPT1 (acronimo di Line Printer Terminal 1), che è la porta parallela presente di default sui pc (che la hanno), gli indirizzi sono:
0×378 per il registro Data (indicato anche come indirizzo Base)
0×379 per il registro Status (Base + 1)
0×37A per il registro Control (Base + 2)
L’indirizzo base, che è quello del registro Data, può anche essere dedotto dal Pannello di Controllo, Sotto Windows XP ci si arriva da Start -> Impostazioni -> Pannello di Controllo -> Sistema -> Hardware -> Gestione Periferiche -> Porte (Com e LPT) :

Doppio click su “Porta stampante …” -> Scheda Risorse

Il primo indirizzo I/O (0378 in questo esempio) è l’indirizzo del registro Data espresso in esadecimale.
I tre registri che comandano la parallela, sono registri ad 8 bit: per la linea dati, tutti e 8 bit li ritroviamo anche sul connettore (D0-D7).
Per la linea Status vediamo che mancano sul connettore i bit S0, S1 e S2: S0 e S1 non sono utilizzati, S2 è un IRQ negato: se su tale bit leggiamo uno stato logico 0, vuol dire che si è verificato un interrupt.
Per la linea Control vediamo invece che mancano sul connettore i bit da C4 a C7: C4 abilita l’interrupt, C5 come detto prima se impostato a 1 rende le porte D come ingressi, C6 e C7 non sono utilizzati.
Ci sono inoltre da fare ulteriori considerazioni: alcuni bit hanno uno stato invertito: ovvero sul corrispondente pin della porta parallela leggeremo 5volt (livello logico alto) quando il corrispondente bit è posto a Zero, di contro leggeremo 0volt (livello logico basso) quando il corrispondente pin è posto a Uno: questi sono i bit Co (pin n°1), S7 (pin n°11), C1 (pin n°14) e C3 (pin n°17), gli altri pin/bit si comportano in maniera normale (1 => 5Volt, 0 => oVolt).
Per inviare quindi un byte sulla linea dati basterà quindi impostare il registro Data in maniera opportuna.
Esempio
Ho una serie di relè collegati alla LPT1 (tramite apposita interfaccia), e voglio attivare unicamente i relè posti sulle linee D0 e D5, disattivando tutti gli altri: mi basterà impostare il registro 0×378 sul valore:
0b00010001 (in binario), oppure 17 in decimale oppure ancora 0×11 in esadecimale
Ovvero ci sarà bisogno di una funzione del tipo: port(0×378,0×11)
Capite quindi come è semplice potersi interfacciare con la seriale e perchè viene ancora così ampiamente utilizzata in campo elettronico.
Allo stesso modo è possibile inviare o ricevere dati sugli altri 2 registri (Control e Status), tenendo sempre conto che alcuni bit si comportano in maniera inversa rispetto allo standard e che alcuni pin sono a collettore aperto per cui non possono fornire i 5V (e ci sarà quindi bisogno di una resistenza di pull-up collegata ad una sorgente di alimentazione esterna) ma soltanto la linea di massa (fate riferimento al documento “piedinatura e note di utilizzo della porta parallela“).
Utilizzo pratico della porta parallela: semplice interfaccia a Led

In questo esempio, collegheremo 8 diodi led alla linea dati della porta parallela, e li faremo accendere via software. C’è innanzitutto da fare una premessa importantissima prima di cominciare:
La corrente in uscita dai pin della porta parallela è bassissima (circa 24mA) quindi è inadatta a comandare grossi carichi: a stento si possono pilotare dei Led tramite resistenza. La corrente inviata dagli altri pin di uscita, (a parte quelli della linea Data), è ancora più bassa: si parla di circa 7/8 mA (inutilizzabili per comandare direttamente anche un led), per cui la raccomandazioni sono:
1- Utilizzate una porta parallela aggiuntiva: sui pc fissi si può acquistare una scheda PCI che aggiunge una porta parallela in più. In questo caso se combiniamo guai, guasteremo unicamente la scheda aggiuntiva (il cui costo si aggira nei negozi intorno ai 15euro, in rete si può trovare ad un prezzo ancora più basso) e non tutta la scheda madre! Difatti se mandiamo in corto circuito un pin, o preleviamo più corrente di quella che la porta può fornire, il chip di controllo della parallela può guastarsi (ricordate sempre la legge di Murphy: se qualcosa potrà andare storto, ci andrà!), e questo è un bel guaio se utilizziamo la porta parallela integrata sul pc: dovremo sostituire la scheda madre e nel caso di un pc portatile… dovremo buttare tutto il portatile! Quindi: Attenzione! Soprattutto ai cortocircuiti!
2 – Utilizzate almeno un sistema di interfacciamento a transistor sia per non correre rischi di sovraccarico sia per tenersi isolati in qualche modo dalla porta parallela: collegare un transistor su ogni porta per stare tranquilli e alimentare i led (o i relè o altro) con una sorgente di alimentazione esterna. Potete utilizzare il seguente schema (i segnali di massa sia della porta parallela che dell’alimentazione esterna, andranno collegati insieme):
Questa configurazione va utilizzata per ogni pin di uscita. Al posto del BC237 (o BC337) potete utilizzare tanti altri transistor NPN come indicato nel documento “Pinout ed equivalenza transistor bjt di bassa potenza” presente nell’area risorse. Il transistor NPN va in conduzione quando sulla base giunge un livello logico alto, si trova in interdizione normalmente quando il pin sulla parallela si trova a livello logico basso, per tale motivo non ho inserito la resistenza di pull-down sulla base.
Lo schema con il transistor qui esposto può essere utilizzato per pilotare anche un relè al posto del diodo led. Un buon sistema di interfacciamento di uscite digitali con relè è proposto da Mauro Laurenti nella pagina “Scheda di controllo 4 Relays” che riporta anche il pcb e le istruzioni di funzionamento.
Molto più comodo sarebbe utilizzare gli array di transistor per risparmiare spazio e cablaggi, come un integrato tipo ULN2003 (il quale contiene 7 transistor al suo interno).
3 – Noi abbiamo fatto così e funziona, ma non si esclude che a qualcuno possa guastarsi la porta parallela. Se combinate guai, o qualcosa si guasta utilizzando questo circuito, settorezero nelle persone del webmaster e degli autori, non possono essere ritenuti responsabili: noi vi abbiamo avvisato (leggi anche il disclaimer).
Lo schema da me utilizzato per fare le prove è il seguente:

Il connettore disegnato è quello femmina visto frontalmente, oppure quello maschio visto dal lato saldature.
Come vedete ho collegato i led, tramite resistenze, unicamente alle otto porte dati e ho utilizzato un’unica linea di massa. Le resistenze utilizzate sono da 470Ω, che a 5 Volt consentono una corrente di 10,6mA, per cui come margine di sicurezza (rispetto ai 24mA) ci siamo, come led ho utilizzato i classici led rossi da 5mm (non usate quelli ultraluminosi, che richiedono più corrente per funzionare!).
Come gestire la porta parallela da VB.NET (e da altri linguaggi di programmazione)
Il Visual Basic (sia il vecchio 6.0 che il nuovo .NET) ha normalmente incluso il componente per la comunicazione seriale, per la comunicazione parallela invece no. Esistono tantissime librerie (gratuite) in giro che permettono di interfacciarsi con la porta parallela, tra le tante che ho provato ne ho “eletta” una che per me è davvero ottima e fornita con un bel corredo di funzioni, la libreria si chiama IO.DLL e può essere scaricata gratuitamente dal sito del suo sviluppatore: http://www.geekhideout.com/iodll.shtml
La cosa bella di tale libreria, a parte il fatto che sia gratuita e ben documentata, è che può accedere anche ad altre porte di I/O oltre alla parallela (fate riferimento alla pagina ufficiale per vedere a quali altre porte può accedere).
Per poterla utilizzare, non ho fatto altro che copiare la dll nella cartella “debug” (non è necessario copiarla in System32) e dichiarare ad inizio programma i prototipi di funzione così come indicato sulla pagina ufficiale della libreria:
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer) Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long) Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean Private Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Private Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Private Declare Function IsDriverInstalled Lib "IO.DLL" As Boolean
L’utilizzo delle funzioni è semplicissimo, indicando con Port l’indirizzo esadecimale della porta (ricordo: 0×378 per la LPT1, che però in Visual Basic.NET andrà scritto come &H0378) e con Data il dato da inviare, le funzioni andranno utilizzate così:
PortOut : invia un byte (8 bit: valori da 0 a 255) alla porta.
Esempio
Per accendere tutti i led col circuito mostrato prima, sulla porta LPT1, scriveremo in Visual Basic:
PortOut(&H378,255)
PortWordOut : stessa cosa di WordOut ma invia un valore di 16Bit
PortDWordOut : stessa cosa di WordOut ma invia un valore di 32bit
PortIn, PortWordIn e PortDWordIn : leggono un valore (rispettivamente di 8,16 e 32 bit) dalla porta
Esempio
Vogliamo leggere il valore del registro Status della porta parallela:
Dim StatusValue As Integer StatusValue = PortIn(&H379)
SetPortBit : setta (ovvero imposta a 1) il bit della porta specificata:
Esempio
Vogliamo accendere il led sulla porta D0, lasciando invariati gli altri bit:
SetPortBit(&H378,0)
SetPortBit : Resetta (ovvero imposta a 0) il bit della porta specificata.
NotPortBit : Inverte lo stato del bit della porta specificata.
GetPortBit : Ottiene il valore del bit della porta specificata
Esempio
Vogliamo ricavare lo stato del led sulla porta D0:
Dim D0Status As Boolean D0Status = GetPortBit(&H378,0)
Nota: In realtà questo metodo a me non funziona, per ricavare lo stato di una singola porta utilizzo la funzione PortIn, converto il risultato ottenuto in binario e infine prelevo il bit che mi interessa.
RightPortShift : Effettua la rotazione a destra dei bit della porta specificata, restituisce il valore del bit meno significativo (il quale “esce” dalla porta), e il valore passato alla funzione diviene il bit più significativo (il bit 7)
Esempio
Abbiamo che il valore attuale della porta è 10010011
Effettuando questa operazione:
RightPortShift(&H378,1)
Il valore della porta diventerà 11001001 (i valori sono stati spostati verso destra, il bit meno significativo è stato perso, e il valore da noi passato (1) diventa il bit più significativo)
LeftPortShift : Effettua la rotazione a sinistra dei bit della porta specificata, restituisce il valore del bit più significativo, e il valore passato alla funzione diviene il bit meno significativo (il bit 0)
IsDriverInstalled : Restituisce un valore diverso da zero se la libreria io.dll è installata e funzionante
Software di esempio
Ho realizzato un piccolo software di esempio che utilizza tale libreria, per accendere/spegnere le uscite sulla porta dati:

Lo stato delle linee viene portato alto o basso cliccando con il mouse sui relativi “led” disegnati sull’interfaccia. Le etichette associate ai led (nominate come D0, D1 ecc nell’immagine), possono anche essere cambiate per dargli dei nomi più significativi (questo se ad esempio facciamo un’interfaccia a transistor/relè/triac per comandare vari utilizzatori in casa):

Lo stato dei led non si aggiorna in maniera “stupida” alla pressione, ma verifica lo stato effettivo della porta. Le etichette, così come la porta parallela alla quale è collegata l’interfaccia, possono essere cambiate dal menù impostazioni. Nella barra di stato sono indicati: la porta LPT in uso e lo stato della linea dati in formato binario, esadecimale e decimale.
Potrebbe verificarsi un errore se è attivo lo spooler di stampa, in questo caso basta terminare il processo “spoolsv.exe” dal task manager (CTRL + ALT + CANC).
Il software per funzionare ha bisogno almeno del .NET Framework 2.0.
Il programma attualmente supporta unicamente la porta dati e il codice sorgente è disponibile previa donazione di supporto a piacere. Nel codice sorgente sono presenti delle semplici funzioni per la conversione nelle varie basi numeriche e dei buoni esempi di spunto su come aggiornare una serie di controlli a runtime.
Ringrazio ancora Fred Bulbak (www.geekhideout.com) per la disponibilità e per aver messo a disposizione questa semplice ed efficace libreria.
Articoli che potrebbero interessarti:



#1 da tom il 14 novembre 2009
L’eseguibile non funziona e non da segni di vita su Xp con framework 3.5 ..
Sarebbe gradito un piccolissimo sorgente in vb o c.
Complimenti comunque all’autore per il sito mlto carino e fatto bene.
Un Cordiale Saluto,
Tom
#2 da Giovanni Bernardo il 14 novembre 2009
Cosa vuol dire non funziona? Se non mi viene detto qual’è l’errore non posso trovare una soluzione. Personalmente il programma l’ho provato su altri pc e non da problemi, parte e funziona.
#3 da tom il 15 novembre 2009
scarico, scomprimo, eseguo l’eseguibile ma non fa nulla.. boo
Comunque pare strano anche a me, credevo fosse per i framework, ma lo ho reinstallato ma nulla..
Non capisco cosa possa essere il problema..
#4 da Giovanni Bernardo il 15 novembre 2009
Mi pare strano… Alla fine il programma è semplicissimo e l’ho compilato per il framework 2.0, quindi funziona anche col 3.5, e io col 3.5 faccio il test, hai modo di provarlo su un altro pc?
#5 da tom il 15 novembre 2009
Si, su un piccolo notebook (senza parallea però) ma mi fa lostesso..
Stavo pensando che magari non vada perchè sul mio home pc la parallela non è 0×378 ma 0xd400 perchè si trova su una scheda di espansione pci..puo essere??
(la mainboard ha solo usb e rs232)
#6 da tom il 15 novembre 2009
Ho anche provato a scrivere un piccolo software in VB dove quando clicco un bottone mando: PortOut(&Hd400,255)
e ovviamente ho dichiarato tutte le “Private Declare Sub…” che gentilmente hai messo in questa pagina..
ma non compila.. uff ..ho perso le speranze hehe
#7 da Giovanni Bernardo il 18 novembre 2009
La parallela non può avere indirizzo 0xD400 (? e poi… 4 cifre?). Controlla bene l’indirizzo della tua porta parallela dal pannello di controllo come ho scritto nell’articolo e fammi sapere che c’è scritto.
#8 da tom il 20 novembre 2009
L’indirizzo esatto della mia parallela è D400 in esadecimale, come dicono le proprietà.. ho provato con le inpout32.dll e funziona, ma con le io.dll non cè verso
#9 da Alessandro il 10 dicembre 2009
Salve, io sono un pivellino per l’elettronica, quindi questa domanda potrebbe essere stupida!perchè nel primo schema elettrico la R è di 470K
mentre nello schema che segue sono di 470 ohm?
Grazie!
#10 da Giovanni Bernardo il 10 dicembre 2009
Nel primo forse intendi quello del transistor e non c’è scritto 470K ma 4700R ovvero 4700 Ohm ovvero 4,7KOhm, serve per pilotare la base del transistor e non è un valore critico, può andar bene pure una 1K.
Quelle da 470Ohm servono per limitare la corrente nei led, si vede pure dagli schemi che le resistenze stanno collegate ad utilizzatori diversi.
#11 da Alessandro il 10 dicembre 2009
Ho sbagliato a scrivere(volevo scrivere 4,7K),non avevo capito stupidamente che quella sotto era un altra configurazione.
Quindi se ho capito :da LPT arrivano 5volts , la resistenza da 4,7K mi fa scorrere una corrente da 1mA che porta in conduzione il transistor e il led
si accende con l’ausilio di una alimentazione esterna.
Grazie mille ,l’impegno che c’è in questo sito è ammirevole!
#12 da Giovanni Bernardo il 10 dicembre 2009
Esatto, la resistenza più grande serve per mandare il transistor in saturazione e quindi farlo funzionare come un interruttore on/off e pilotare quindi i led, da alimentare con altra tensione, quindi avresti bisogno di utilizzare un transistor in quella configurazione per ogni led. In realtà io la prova l’ho fatta senza utilizzare il transistor e mettendo una resistenza un po’ più alta del normale per stare sicuro che non vi sia troppo assorbimento che può portare alla rottura del chip che controlla la parallela. Su un portatile questo problema è ancora più sentito, perchè una volta rotto il chip della parallela, si potrebbe danneggiare l’intera scheda madre e il portatile è da buttare. Per tale motivo consiglio di usare una parallela aggiuntiva su un pc fisso se non si è esperti.
#13 da Alessandro il 22 dicembre 2009
si potrebbe mettere dopo il transistor un relè 5v ?
#14 da Giovanni Bernardo il 22 dicembre 2009
Dopo il transistor puoi mettere ciò che vuoi, compatibilmente con la corrente che può passare tra emettitore e collettore. Il transistor illustrato va bene per pilotare un relè. Dato che i relè a 5 volt non sono facili da trovare e costano qualcosa in più, puoi anche metterne uno da 12 volt , ovviamente al posto del led e resistenza metterai il relè, alimentato a 12 volt, la massa della porta parallela e la massa della fonte di alimentazione a 12 volt andranno messe in comune. Dovrai inoltre mettere un diodo in controfase in parallelo all’alimentazione del relè per scaricare a massa eventuali correnti parassite che genera la bobina.
#15 da nicola dagani il 23 gennaio 2010
Complimenti per la spiegazione di questa pagina..
#16 da daxdaxdax il 27 gennaio 2010
Ciao a tutti,
Chi mi saprebbe dire in che modo riuscirei a fare tutto ciò con la mia porta parallela aggiunta apposta PCI che ha un intervallo EC00 – EC07 ?
Con le porte on board tutto funziona alla grande, complimenti!!
#17 da Bob il 14 marzo 2010
Salve a tutti!! mi sto avvicinando a questo campo perchè a mio parere molto interessante, volevo solo sapere se da Vb 6 si potessero comandare anche porte com e\o usb. grazie in anticipo per l’aiuto e complimenti per il sito, fatto bene e sopratutto capibile da uno come me…;-)
#18 da Giovanni Bernardo il 14 marzo 2010
Da VB6 puoi comandare le porte COM tramite il componente mscomm32.ocx. Per le porte USB è una questione molto diversa. L’USB non viene pilotato come una parallela o come una seriale scrivendo in appositi registri, l’USB è qualcosa di abbastanza complicato per chi è alle prime armi: non ha un protocollo standard di comunicazione e ogni dispositivo usb richiede il suo driver per poter comunicare, quindi per ogni dispositivo usb c’è bisogno di comunicare con il suo driver e non direttamente con la periferica. La risposta è comunque si, puoi usare l’usb a patto di avere i driver del dispositivo con cui vuoi comunicare e a patto di saperlo fare. Non è affatto una cosa semplice.
#19 da Bob il 21 marzo 2010
grazie mille…..;-)
#20 da conqueros il 26 marzo 2010
Ciao sono nuovo del sito, ma il programma di controllo è ancora disponibile? se si in che sezione lo trovo? ciao e rgazie.
#21 da Giovanni Bernardo il 26 marzo 2010
Io vedo il download sempre al suo solito posto, in fondo all’articolo. Non mi pare che ci sia scritto da qualche parte che il programma non c’è più.
#22 da conqueros il 26 marzo 2010
Scusa ma credo di non essermi espresso correttamente io clicco sul download ma non me lo scarica! mi richiede l’autenticazione io mi sono registrato ma ancora non riesco ad accedere alla sezione del download.
Grazie in anticipo della risposta.
#23 da Giovanni Bernardo il 26 marzo 2010
La registrazione è stata cancellata. Rileggi meglio quello che c’è scritto nel form di registrazione e quello che c’è scritto nella email che ti è arrivata dopo la registrazione.
#24 da Matteo il 31 marzo 2010
Ciao Giovanni. Innanzitutto complimenti per il sito e per le tue più che ottime guide davvero comprensibili per chiunque anche un principiante come me. A questo riguardo volevo farti una domanda. Ho interfacciato dei relè con la porta parallela e fin quì tutto bene. Volevo sapere se posso mandare un input quindi inviare un segnale oltre che far solo uscire segnali dal mio circuito verso il PC magari tramite un pulsante. Spero di essermi spiegato attendo una tua risposta grazie.
#25 da Giovanni Bernardo il 1 aprile 2010
Certo, come spiegato pure nell’articolo e nel documento da scaricare, la linea dati è bidirezionale, puoi farla diventare un ingresso cambiando un bit del registro status, alcuni bit del registro status, poi, sono ingressi. Se usi il registro status basta che controlli i bit del registro (base+1, cioè 0×379 se la parallela ce l’hai su 0×378). Se per esempio colleghi un input al bit S6 (bit 6 del registro status), se su tale pin arrivano +5V allora ti ritroverai quel bit a 1, se arriva massa ti ritroverai 0.
#26 da Matteo il 1 aprile 2010
Grazie per la risposta, ancora una cosa posso usare lo stesso metodo che si usa per i pulsanti dei Pic Micro come ho letto nella tua lezione o devo collegare il pulsante direttamente?
#27 da Giovanni Bernardo il 1 aprile 2010
Conviene sempre utilizzare lo stesso sistema, perchè è il più efficiente e semplice da realizzare. Tieni collegato l’ingresso fisso a +5V con una resistenza di pullup. Premendo il pulsante fai arrivare la massa e quindi nel programma intercetterai il bit a zero e non a uno.
#28 da Matteo il 1 aprile 2010
Perfetto chiaro come sempre! Complimenti ancora!
#29 da Macchinista il 1 aprile 2010
Giovanni ho ancora bisogno del tuo aiuto. Mi toccherà offrirti un caffè. Ho configurato tutta la mia interfaccia come hai scritto tu con il transistor ma quando inposto il Pin ad esempio D0 a 1 non accade nulla. Guardando con il tester direttamente sull’uscita della parallela mi da una tensione di 2.40 V come mai?
#30 da Giovanni Bernardo il 1 aprile 2010
Potrebbe anche essere normale, abbassa il valore della resistenza di base. Il transistor è un NPN?
#31 da Macchinista il 1 aprile 2010
Si il Transistor è un G547C NPN. Provando con un led con lo schema che hai postato senza transistor il led si accende appena appena… non capisco…
#32 da Giovanni Bernardo il 2 aprile 2010
Te l’ho detto, può essere normale, magari la tua parallela tira fuori quella tensione li. Usa un transistor con una resistenza di base più bassa. Alla fine il transistor dovrà funzionare soltanto come “interruttore”, portando la massa a un led o a un relè, l’altro capo del led o del relè saranno collegati ad una tensione esterna al circuito. Il segnale sulla base manda in saturazione il transistor, se il transistor non va in saturazione prova a diminuire la resistenza sulla base. Ricordati che se alimenti un relè, devi mettere un diodo in antiparallelo sui terminali.
#33 da Macchinista il 2 aprile 2010
Ecco forse non ho messo il diodo ora provo perchè anche non mettendo nessuna resistenza di base il transistor non va in saturazione.
#34 da Giovanni Bernardo il 2 aprile 2010
La resistenza ci vuole, pure bassa ma ci vuole. Non è che stai utilizzando un relè a 12V e alimenti a 5 ? Lo so che è banale dirlo ma non si sa mai… Oppure se il relè assorbe parecchio magari il 557 non ce la fa, prova con un BC337 che supporta fino a 500mA. Le masse le hai collegate insieme? (alimentazione esterna e massa della LPT)
#35 da Macchinista il 2 aprile 2010
Ok dopo svariati tentativi ce l’ho fatta… Grazie per il tuo aiuto… Ho ancora un piccolo ronzio come se tornasse della corrente dai transistor però forse è normale… Ti offro un caffè….
#36 da Giovanni Bernardo il 2 aprile 2010
Grazie del caffè. Prova a mettere pure un piccolo condensatore in parallelo al relè.
#37 da Macchinista il 2 aprile 2010
Ok grazie comunque adesso i relè riesco a comandarli ma non riesco a fare l’inverso dal pulsante far riconoscere al programma che il bit è a massa ho collegato il pulsante su S4. E dal programma legolo stato del registro Status ma non accade nulla portando il pin a massa.
#38 da Giovanni Bernardo il 2 aprile 2010
Come fai la lettura della porta? Voglio dire… ti sei scritto un software? La effettui la lettura di continuo? Non è che settando a 1 l’ingresso subito te lo ritrovi, devi rieffettuare la lettura della porta. Controlla inoltre che nella BIOS la parallela sia settata come ECP+EPP
#39 da Macchinista il 3 aprile 2010
Allora mi sono fatto un software in Vb.NET con un Timer che legge ogni 100ms lo stato del registro status e del registro Data e mi converte il valore ottenuto in binario. Sul registro Data funziona alla perfezione quando do l’impulso dal software il relè si eccita e il bit corrispondente va a uno, ma se premo il pulsante non varia nulla adesso guardo quel settaggio nel Bios e ti faccio sapere. Grazie per ora.
#40 da Giovanni Bernardo il 3 aprile 2010
Stai usando la DLL che ho messo nell’articolo? A molti da problemi, prova anche con la più classica inpout32.dll:
http://logix4u.net/Legacy_Ports/Parallel_Port/Inpout32.dll_for_Windows_98/2000/NT/XP.html
Con questa si trovano tutti bene senza problemi… Prima o poi aggiorno pure io il programma per utilizzare questa libreria qui.
#41 da Macchinista il 3 aprile 2010
Ho guardato anche la LPT nel Bios ed è settata come dici tu ECP+EPP, adesso provo la libreria che mi hai detto e ti faccio sapere grazie per l’aiuto.
#42 da Macchinista il 6 aprile 2010
Ho provato in questi giorni con la inpout32.dll ma il problema persiste non riesco a leggere i bit non so proprio come mai eppure è collegato tutto giusto. Anche provando con il tester la massa c’è eppure il valore non cambia.
#43 da Macchinista il 7 aprile 2010
Finalmente ho risolto tutti i miei dilemmi…. Come al solito mea culpa!!!!! Mi è bastato dare la massa della LTP1 e magicamente tutto funziona perfettamente!!!! Grande Giovanni continua così con il tuo ottimo sito!!
#44 da Giovanni Bernardo il 8 aprile 2010
Ok… Sembra una cosa ovvia eppure è un errore molto comune… Quando si collegano insieme vari dispositivi, utilizzanti alimentazioni differenti, la massa va sempre in comune. Se ti va, posta pure qualche foto del tuo lavoro sul gruppo facebook.
#45 da Macchinista il 8 aprile 2010
Appena avro modo di fare due foto non mancherò. Grazie ancora.
#46 da robertoluca il 23 aprile 2010
Scusa Giovanni la mia ignoranza,ma sono un dilettante in questo campo.Nel mio PC con S.O. xp SP2, ho scaricato il file Parallel_port_control.zip , l’ho scompattato e ho messo
IO.dll nella cartella Debug . Ho quindi lanciato parallel_port_control.exe ma mi viene segnalato un errore in parallel port control. In che cosa sbaglio o non ho capito ?
Devo forse installare dei programmi(VBA VB.net ecc…) visto che ho verificato il corretto settaggio della LPT come ECP+EPP e framework2.0
#47 da Giovanni Bernardo il 23 aprile 2010
Scusa ma non sei preciso, ti stai scrivendo tu un software e vuoi usare la dll? Probabilmente hai letto l’articolo in maniera molto frettolosa. Le questioni sono due:
1- ti vuoi scrivere tu un software in vb.net: copi la DLL nella cartella debug del tuo progetto.
2- vuoi usare il software scaricato da qui: devi rimanere tutto come sta
#48 da robertoluca il 3 maggio 2010
Hai ragione tu Bernardo , non sono stato chiaro io.
Io voglio usare il software scaricato da qui (Parallel_port_control.exe da 76Kb), per accendere i led sulla porta dati ,ma quando lo lancio non si apre il pannello di controllo ,ma windows mi dice:si è verificato un errore in parallel port control e quando vado a vedere i dati contenuti nella segnalazione errori leggo:
event type:clr20r3
P1:parallel_port_control.exe P2:1.0.0.0 P3:4ad4e1fb P4:parallel_port
P5:1.0.0.0 P6:4ad4e1fb P7:11 P8:c6 P9:system.invalidoperationexception
Che cosa significa?
Se avrai la pazienza di rispondermi di nuovo ti ringrazio ancora.
#49 da Giovanni Bernardo il 3 maggio 2010
Purtroppo il .net framework a volte li da questi problemi e dall’errore scritto purtroppo non posso risalire a nulla. Installa l’ultima versione del .net framework (cè il link nella sezione drivers), se usi vista esegui il programma come amministratore. Dopo l’errore prova a lanciarlo ancora un paio di volte.
#50 da Macchinista il 21 maggio 2010
Ciao Giovanni. Ritorno all’attacco con un problema che m si è posto questa sera. Ho aggiunto sul mio PC un scheda PCI per porta parallela. Andando sul pannello di controllo la imposta come LPT2 e leggendo il suo indirizzo è C000 – C007. Però impostando nel mio programma la porta &HC000 non mi imposta nulla nel senso che non funziona e va in crash il programm all’avvio. Sbaglio qualcosa io o quell’indirizzo è anomalo? Grazie.
#51 da Giovanni Bernardo il 22 maggio 2010
Guarda… Non sei il primo che mi dice una cosa del genere… Eppure mi risulta strano… Da standard la LPT2 dovrebbe cominiciare da 0×278 e la LPT3 da 0×3BC… E poi non capisco perchè da C000 a C007… Sono 8 indirizzi! La parallela ne deve avere 3 (Data, Status e Control)… come fai a trovarti da C000 a C007 ?! Al limite da C000 a C002! Mi viene un sospetto…
Ma non è che stai vedendo le proprietà della porta COM ????
In ogni caso prova a mettere 0×278 che è l’indirizzo standard della LPT2
#52 da Macchinista il 22 maggio 2010
Ho provato come mi hai detto. Sta volta il programma parte ma non fa nulla nel senso tutti i bit stanno a 1 sia Status che Data e se provo a cambiare lo stato non accade nulla. Cmq sto leggendo propio la scheda risorse dalle propietà della mia nuova scheda che si chiama PCI ECP Parallel Port (LPT2)
Nella scheda risorse mi da:
Intervallo I/O: C000 – C007
Intervallo I/O: BC00 – BC07
Intervallo di memoria FEBFE000 – FEBFEFFF
Intervallo di memoria FEBFD000 -FEBFDFFF
#53 da Giovanni Bernardo il 22 maggio 2010
Vedendo un po’ in giro pare che quegli indirizzi siano I/O ad utilizzo generico, per cui la tua scheda aggiuntiva pensa bene di utilizzare quelli li… Non capisco perchè ne indichi 8…. boh… Nelle proprietà della porta alla scheda “Impostazioni della porta” puoi anche cambiare il numero di LPT, prova a impostarlo a LPT3 per esempio e vedi se cambia qualcosa
#54 da Macchinista il 22 maggio 2010
Provato anche questo metodo ma sempre uguale tutti i Bit a 1 e come se fosse fantasma (ovviamente nel programma ho impostato i registri per la LPT3)… Sono disperato. ;-\
#55 da Macchinista il 23 maggio 2010
Penso di aver trovato la soluzione però mi serve il tuo aiuto Giovanni. Secondo da quanto dice questa discussione: http://forum.masterdrive.it/visual-basic-net-18/leggere-porta-parallela-non-integrata-38496/ la DLL non supporta un indirizzo così alto e quindi non funziona ma l’indirizzo è giusto che sia così xkè sempre da quanto dice le parallele aggiunte PCI hanno questo tipo di indirizzi. Riusciresti a ricompilare la dll? una delle 2 o la io.dll o la inpout32.dll ? io non ne sono in grado ma da quanto dici li in questo modo funzionerebbe!!
#56 da Giovanni Bernardo il 23 maggio 2010
Purtroppo no… Non ho mai fatto una cosa del genere mi dispiace… Non hai visto se in giro c’è qualche DLL che supporta gli indirizzi “alti” ? Oppure chiedi stesso sul loro forum
#57 da Giovanni Bernardo il 23 maggio 2010
Vedo che sul forum l’utente l’ha ricompilata… Al limite registrati e chiedigliela… Se la riesci ad ottenere passamela che magari la mettiamo anche qui, potrebbe essere utile ad altri.
#58 da Agp il 17 giugno 2010
Salve Giovanni sono nuovo di questo sito ho letto il tuo articolo molto interessante e preciso.Ora però ho un problema ho realizzato la scheda a led riesco a controllarli tramite un piccolo software creato da me però non riesco a ricavare lo stato puoi approfondirmi quel punto della guida grazie.
#59 da Giovanni Bernardo il 17 giugno 2010
Non capisco, cosa vuoi dire – cosa vuoi fare? Vuoi leggere il registro status? Devi leggere il contenuto del registro 0×379 (per la LPT1) e tenendo conto che i primi 2 bit del registro status non ci sono e quindi non ne devi tener conto, mentre il bit 2 è un l’IRQ
#60 da Agp il 17 giugno 2010
Vorrei conoscere lo stato dei led.come hai detto tu il Getportbit non funziona e non riesco a capire come hai risolto.
#61 da Giovanni Bernardo il 17 giugno 2010
Allora non hai letto bene perchè l’ho scritto nella stessa frase in cui dico che getportbit non funziona.
#62 da Agp il 17 giugno 2010
si ok ho letto ma non mi è chiaro appunto chiedevo di approfondire un po’ sono riuscito ad ottenere dei valori e a convertirli in binario a questo punto gli uno mi dovrebbero indicare i led accesi e gli zeri quelli spenti?
#63 da Giovanni Bernardo il 17 giugno 2010
esatto
#64 da Agp il 17 giugno 2010
Ottimo e fin qui ci sono ora un ultimo aiutino come faccio a prendere in considerazione solo ciò che mi interessa?Credo che sia necessari troncare il numero alle varie posizioni e questo come si fa da codice?
#65 da Giovanni Bernardo il 17 giugno 2010
con un AND e una maschera per selezionare solo il bit desiderato
http://www.settorezero.com/wordpress/operazioni-algebriche-booleane-come-si-utilizzano-gli-operatori-and-or-xor-e-not-e-come-applicarli-ai-registri-ad-8-o-piu-bit/
#66 da Agp il 17 giugno 2010
scusa vb.net
#67 da Agp il 17 giugno 2010
Dim reg As Byte = “00000001″
Dim mask1 As Byte = “00000001″
Label3.Text = reg & mask1
ho fatto questa semplice prova ma come risultato ottengo 11
help!!!
scusa il disturbo ti offrirò un caffè
#68 da Giovanni Bernardo il 17 giugno 2010
Dim reg As Byte = “00000001″
Scrivere tra le virgolette non voleva dire assegnare il valore ad una variabile stringa? Se la dichiari come Byte allora è un intero da 0 a 255 e tu li non hai scritto un intero tra 0 e 255. E’ strano pure che non ti da errore.
#69 da Agp il 17 giugno 2010
si effettivamente sono stupido ora che ci penso…comunque non riesco a trovare la giusta sintassi dove dovrei studiare oppure tu mi puoi dare qualche dritta?
#70 da Giovanni Bernardo il 17 giugno 2010
Nessuno è stupido. Adesso scrivere come ho fatto io è troppo lungo. Io in realtà mi sono creato delle funzioni per convertire i numeri in varie basi. Per pigrizia mi converto il valore numerico della porta in binario e mi scansiono la stringa ottenuta un carattere alla volta. Ti invio il mio progetto, vale solo per VB2008.
#71 da Agp il 17 giugno 2010
PERFETTO GRAZIEEE!!! proprio quello di cui avevo bisogno doppio caffè per te :-) ancora grazie
#72 da Agp il 17 giugno 2010
Perfetto funziona tutto alla perfezione grazie veramente CIAO e ancora grazie
#73 da Giovanni Bernardo il 17 giugno 2010
Studiati il codice che puoi impararci parecchie cosette interessanti.
#74 da Agp il 17 giugno 2010
Si ho notato anche i moduli esterni sono ricchi di roba veramente grazie. devo però segnalarti una cosa da un errore in blocco su questa dicitura PowerPacks.OvalShape anche nella progettazione perchè?
#75 da Giovanni Bernardo il 17 giugno 2010
Grazie, fanne buon uso.