Technorati Profile Add to Technorati Favorites ELECTRONICA DESARROLLO: Manejo de puerto paralelo con IO.DLL

viernes, 15 de junio de 2007

Manejo de puerto paralelo con IO.DLL

Este blog fue diseñado para apoyar a la comunidad de desarrolladores de electrónica. Se publicarán artículos de proyectos desarrollados por el Administrador del blog, Ingeniero Electrónico, quien estará atento a sus inquietudes o sugerencias igualmente todos pueden compartir sus conocimientos e intercambiar opiniones o aportes dentro de un marco de respeto y tolerancia. Los artículos publicados aquí son elaborados con tal sencillez que son totalmente comprensibles y los proyectos indicados pueden ser llevados a cabo por cualquier estudiante o profesional del ramo de la electrónica.

--English-------Español



CONTROL DEL PUERTO PARALELO DE UN COMPUTADOR

Justificación: Se escogió este sencillo proyecto como el primero en Proyectos de Electrónica, por su gran utilidad que puede dársele en cualquier momento.

Objetivo: Elaborar un programa que envié datos (bytes) a través del puerto paralelo de nuestro pc. Dicho software debe trabajar bajo windows xp, windows 2003, windows 2000, windows ME y windows 9x.

Utilidad: Enviar datos al puerto paralelo es de gran utilidad ya que a través de este pueden activarse/desactivarse cargas empleando relés o triacs, también pueden enviarse órdenes a un dispositivo microcontrolado o a un PIC.

Marco teórico

Todos los computadores de escritorio traen un conector DB 25 Hembra de color púrpura con una distribución de pines como se muestra en la figura 1. En el presente proyecto se emplearán las líneas D0 a D7 (pines 2 al 9) para sacar los datos de control, y el pin 25 (GND) para dar la referencia eléctrica.


Figura 1. Puerto Paralelo



Como estandard el puerto paralelo de un PC posee tres bytes:

DATAPORT, STATUSPORT y CONTROLPORT.

Para este proyecto se utilizará el DATAPORT, el cual posee obviamente una dirección asignada, la cual puede variar dependiendo del tipo de PC, para determinar cual es la dirección adecuada Usted debe dirigirse al panel de control, sistema,
administrador de dispositivos, puerto (COM y LPT), y luego haga click derecho sobre LPT1 o LPT2 según el puerto que desea controlar y de nuevo haga click en propiedades, busque la pestaña recursos y observe que intervalo de I/O le corresponde. Para nuestro caso se observa lo siguiente:

I/O Range 378-37F


Como estos valores se encuentran en base hexadecimal convertimos a decimal y obtenemos

I/0 Range 888-895

Por defecto escogemos la primera opción es decir número del Dataport es 888.

Utilizaremos incialmente Visual Basic 6.0 para la creación de nuestro software de control.

Dado que Microsoft en sus sistemas operativos recientes a creado modos de protección para los puertos del pc de tal forma que ellos no son tan fáciles de accesar como lo eran en las versiones 9x de windows, hemos de necesitar una librería "universal" que nos permita acceder de una forma práctica a dichos puertos, ella es la librería io.dll. Primero debe descomprimir el paquete en una carpeta cualquiera y luego buscar i0.dll y copiarlo.
Una vez copiada esta librería se debe instalar en la carpeta system32 de windows. La ruta a seguir es C:\WINDOWS\system32,(solamente pegarla en esta carpeta).

Elaboración del software

1. Elabore un nuevo proyecto Estándar.Exe en visual basic 6.0 como se muestra en la figura 2.

Figura 2. Nuevo proyecto estándard .EXE

2. Cree un módulo general como se muestra en la figura 3 usando la herramienta añadir un nuevo formulario.

Figura 3. Añadiendo un nuevo módulo.

3. Abra el nuevo módulo y pegue el siguiente código en él:

Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean

4. Por último cree un nuevo formulario y añada un botón para cada bit a controlar, como lo muestra la figura 4, también añada un botón para limpiar el puerto y otro para activar todo el puerto.

Figura 4. Formulario con que que se controla cada bit del puerto paralelo

El código correspondiente a cada botón es el siguiente:

Private Sub Command1_Click() ' bit 0 en 1
PortOut 888, 1
End Sub

Private Sub Command2_Click()
' bit 1 en 1
PortOut 888, 2
End Sub

Private Sub Command3_Click()
' bit 2 en 1
PortOut 888, 4
End Sub

Private Sub Command4_Click()
' bit 3 en 1
PortOut 888, 8
End Sub

Private Sub Command5_Click()
' bit 4 en 1
PortOut 888, 16
End Sub

Private Sub Command6_Click()
' bit 5 en 1
PortOut 888, 32
End Sub

Private Sub Command7_Click()
' bit 6 en 1
PortOut 888, 64
End Sub

Private Sub Command8_Click()
' bit 7 en 1
PortOut 888, 128
End Sub

Private Sub Command9_Click()
' D0 a D7 en 0
PortOut 888, 0
End Sub

Private Sub
Command10_Click() 'D0 a D7 en 1
PortOut 888, 255
End Sub

Obsérvese lo siguiente: la instrucción portout tiene dos valores a asignar estos son: Número del puerto y dato a sacar. Por tal razón se establece el puerto 888 y el dato a enviar en decimal. Como no todos casos son iguales ud debe identificar muy bien el número del puerto como se indico anteriormente y cambiar el este código fuente al nuevo valor del número de puerto.

Para el software anterior, cada vez que se de click a un botón de la ventana formulario se obtendrá algún dato de salida en el puerto paralelo. Para comprobarlo es necesario elaborar un hardware sencillo a base de leds con el anodo en la salida del pin del pueto paralelo y el cátodo a GND. También puede probarse el anterior software con un multímeto si se desea con la función Voltaje en dc y la punta roja de prueba en la salida del pin de puerto y la punta negra en el pin 25 (GND).

Ya están disponibles algunos circuitos de ejemplo para probar este software visítalos.

Visita mi blog personal: Luis Roberto Arteaga - Mi curriculum








24 comentarios:

luis roberto dijo...

Excelente ami me funcio a las mil maravillas....gracias proyectos de electrónica.

David dijo...

Saludos Ing, Luis Roberto, Soy David RM, el del correo que hace unos dias envie.

Mi duda es sobre el proyecto del puerto paralelo con IO.dll sobre las conexiones con el PIC y cual hay que utilizar, en mi escuela estoy trabajando con el 18F452. Por tu atencion te doy las gracias

administrator dijo...

Saludos David, este proyecto habla de como implementar un software (en el PC) que gestione el puerto paralelo, para darle utilidad con un PIC lo puedes hacer con cualquier referencia desde los de la serie 12fxxx hasta la serie 18fxxxx. El 18F452 esta perfecto, en el debes conectar por ejemplo el puerto B hacia los pines correspondientes en el puerto paralelo del PC, teniendo en cuenta cuales pines son de entrada y cuales de salida (pines de salida del PC con pines de entrada del PIC). Adicionalamente te aconsejaría colocar una compuerta YES entre ellos asi, en el caso de ocurrir un percance se dañaría ésta y no el PIC o el puerto paralelo.

David dijo...

Gracias por la aclaracion, en estos dias comprare el integrado compuerta YES, tomare en cuenta los pines de entrada y salida, y realizare las conexiones. Hare el seguimiento de como lo explicas y obtendre mis concluciones, espero poder desarrollarlo sin mas problemas. Estoy en contacto por cualquier datalle que surga. Por tu tiempo y atencion te doy las Gracias.

David dijo...

Gracias, a funcionado muy bien, ya lo habia hecho desde hace tiempo pero debido a la escuela no pude agradecer, un detalle la compuerta yes que menciona es una buffer, gracias.

administrator dijo...

Bien David gracias por tus comentarios. Saludos.

Gustavo dijo...

Saludo.

Si se quisiera apagar un LED que ya esta encendido, sin tener que apagar todos los puertos, esto ¿se puede hacer?.

NO se si en ese caso se use SetPortBit y ClrPortBit, no sabria como usarlas.

Electrónica Desarrollo dijo...

Hola Gustavo, puedes usar SetPortBit para colocar el bit del byte de salida en 1 y NotPortBit para dejarlo en 0.
Ejemplo:
*Pone el bit 0 a nivel 1:
SetPortBit 888, 0
*Pone el bit 0 a nivel 0:
NotPortBit 888, 0
ojo con el número de puerto que este acorde a tu PC.

Anónimo dijo...

Muchas gracias.

Eric dijo...

Hola. Me podría explicar por favor mejor eso de la elaboración de un hardware sencillo, es decir, se conectan directamente los leds, o con un conector al paralelo. Y también eso del puerto 888 ¿a qué se refiere?. ¿Cómo sabré con el programa a qué pin le está enviando la señal en el paralelo?. Bueno felicitaciones por su blog y de antemano muchas gracias.

Electrónica Desarrollo dijo...

Hola Eric, si en realidad la prueba con LEDs es muy simple puedes conectar por ejemplo al pin 2 del puerto paralelo (figura 1) el ánodo del LED y el cátodo de ese led con una resitencia en serie de 220 ohms al pin 25 (GND)luego a través de la ventana que diseñaste (por ejemplo la de la figura 4) le das clic izquierdo al botón 'bit 0', puedes hacerlo una o más veces y verás como el LED enciende y apaga. el mismo proceso para los 7 pines restantes del puerto paralelo. Claro obviamente debes conectar un conector DB25 MACHO y su cable llevarlo a la breadboard (protoboard) o a la placa impresa según lo que dispongas. El número del puerto paralelo para el caso de mi PC es 378h si introduces este número el calculadora de tu PC (debe estar en modo científico)cuando esta seleccionada la opción Hex y luego eliges la opción Dec verás de donde sale dicho resultado (888) que es el que el programa maneja en la sentencia PortOut. espero estas simples orientaciones te ayuden, espero tu respuesta.

Electrónica Desarrollo dijo...

Eric, si quieres verifica el post "Circuitos para el Puerto Paralelo", allí podrás despejar tu dudas en cuando al harware de conexión de los LEDs.

Eric dijo...

Hola, muchas gracias, me ha servido bastante para aclarar las dudas, aunque me queda una: en el esquema que se muestra en el nuevo post para ensamblar el hardware (el dibujo uno), dice que hay que conectar los leds y colocar unas resistencias de 470 ohms, pero usted me infoma acá que sea de 220. ¿Da igual o tiene que ser alguna de las dos?. Muchas gracias.

Electrónica Desarrollo dijo...

Hola Eric, con respecto a tu última duda y resumiendo sería: Si tienes LEDs 3mm entonces usa resistencia de 470 ohms 1/4 de Watt y si tienes LEDs de 5mm usa resistencia de 220 ohm 1/4 de Watt.

Eric dijo...

Muchas gracias. Ahora alguno de estos días iré a comprar los materiales para empezar a hacer la circuitería. Le agradezco muchísimo su ayuda y estaré en contacto para contarle mis avances. Nuevamente muchas gracias por prestarme su ayuda.

Eric dijo...

Hola, bueno le cuento que ya armé el circuito y desarrollé el software, pero lamentablemente no funcionan los leds. Entonces para corroborar que el circuito estuviera bien armado en el protoboard coloqué un voltaje externo (de un transformador) y probé cada led y afortunadamente prendieron, eso me indicó que el circuito está en buenas condiciones.

El puerto paralelo antes de sacarle el conector que no iba a utilizar (le saqué este conector para dejar los cables más libres para llevarlos al protoboard) lo probé imprimiendo un documento en una impresora con este puerto y funcionó, eso me indicó que el cable paralelo estaba bien.

Entonces luego de lo anterior conecté los cables tal como decía el diagrama 1 en la sección hardware, pero al presionar los botones no ocurre nada. Realicé lo del io.dll para que funcionara pero aún sigo con el problema.

Leyendo en internet me enteré que el io.dll no era suficiente ya que el XP bloquea los puertos, y que había que usar un programa llamado UserPort, lo probé y tampoco obtuve resultados satisfactorios.

Bueno después de todo esto no sé qué problema hay, ya que está bien la conexión del cable al protoboard pero nada. Me gustaría si usted puede por favor sugerirme alguna idea adicional para resolver este inconveniente. De antemano muchas gracias.

Electrónica Desarrollo dijo...

Hola de nuevo Eric, En cuanto a lo de IO.dll, si lo colocas tal como explico en esta entrada no necesitas absolutamente nada más, ya que precisamente esta librería abre los puertos no solo de XP, sino de Win2000. En cuanto al circuito del otro post, esta correcto y funciona bien, yo lo he probado muchas veces y en distintos equipos con distintos sistemas operativos (xp y 2000). Mi sugerencia sería que revisaras el número del puerto paralelo de tu PC,que port estas utilizando LPT1 o LPT2? que número tiene en Hexa? También te pediría que revisaras si IO.dll está donde te indico.
Cualquier otra inquietud estaré atento.
Saludos.

Eric dijo...

Buenas tardes. Muchísimas gracias, ya solucioné el problema (que era un desajuste en el protoboard). Ahora me funciona muy bien.

Nuevamente gracias por toda su ayuda.

Eric dijo...

Como sugerencia menciono que este software también funciona en Windows Vista, para los que deseen hacer este proyecto en aquel sistema operativo.

Electrónica Desarrollo dijo...

Me alegra mucho que todo funcione y me gustó mucho quelos hayas probado en win vista, en realidad tambien sirve para win98 faltaría ver si en win 7 funcione, eso no lo sé.
Muchas gracias por comentar. Recuerda mencionar a tus amigos y colegas la existencia de este blog.

Eric dijo...

Muchas gracias a usted por su colaboración. Por supuesto que daré a conocer su blog a mis colegas interesados. Felicidades por este blog tan excelente.

jimmy dijo...

gracias, funciona muy bien, pero si quiero leer datos desde el puerto que tengo que hacer.

Desarrollamos Proyectos dijo...

Hola Jimmy, la respuesta a tu inquietud es usar la función PortIn en lugar de PortOut, ambas se encuentran ya definidias en le módulo entoces solo es utilizarla con el número de puerto correcto según tu PC.
Saludos, Electronica-desarrollo.

EFEXS80 dijo...

Estoy desarrollando un cnc por lpt con un laptop antiguo, con este Blog pude ver el codigo para usar libreria io.dll y controlar los motores Nena17.
Gracias a la persona que dedicó tiempo en compartir su conocimiento.