Semplice interfaccia elettronica di controllo con la porta parallela pilotata da vb.net


Scritto da Giovanni Bernardo in data 13 ottobre 2009

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

pinout_porta_parallela

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

sistema_porte_com_e_lpt

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

sistema_impostazione_lpt1

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

controllo_led_da_porta_parallela_02

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

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

schema_led_su_porta_parallela

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:

parallel_port_control

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

parallel_port_control_02

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.

Parallel Port Control (53)

Articoli che potrebbero interessarti:

L'articolo ti è piaciuto o ti è stato utile per risolvere un problema? Supporta e mantieni in vita questo sito, ci basta soltanto un caffè o una birra

  1. #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.

  2. #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?

  3. #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)

  4. #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.

  5. #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

  6. #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.

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

  8. #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.

  9. #15 da nicola dagani il 23 gennaio 2010

    Complimenti per la spiegazione di questa pagina..

  10. #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!!

  11. #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.

  12. #19 da Bob il 21 marzo 2010

    grazie mille…..;-)

  13. #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ù.

  14. #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.

  15. #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.

  16. #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.

  17. #28 da Matteo il 1 aprile 2010

    Perfetto chiaro come sempre! Complimenti ancora!

  18. #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?

  19. #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.

  20. #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)

  21. #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è….

  22. #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

  23. #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.

  24. #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.

  25. #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.

  26. #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.

  27. #45 da Macchinista il 8 aprile 2010

    Appena avro modo di fare due foto non mancherò. Grazie ancora.

  28. #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

  29. #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.

  30. #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

  31. #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

  32. #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. ;-\

  33. #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.

  34. #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.

  35. #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?

  36. #66 da Agp il 17 giugno 2010

    scusa vb.net

  37. #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

  38. #72 da Agp il 17 giugno 2010

    Perfetto funziona tutto alla perfezione grazie veramente CIAO e ancora grazie

  39. #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è?

  40. #75 da Giovanni Bernardo il 17 giugno 2010

    Grazie, fanne buon uso.

(non verrà pubblicata)
  1. Ancora nessun trackback

Fusion theme by digitalnature | Articoli (RSS) e Commenti (RSS) ^