Un circuito simple y un programa para mostrar las posibilidades de utilizar las salidas del Puerto paralelo. Copyright Tomi Engdahl 1996-2000 El Puerto paralelo de una PC puede ser un canal muy útil de E/S para conectar sus propios circuitos a la PC. El puerto es muy sencillo de utilizar si usted primero conoce algunos trucos básicos. Este documento trata de mostrar esos trucos de una manera de fácil comprensión. ATENCION: El puerto paralelo puede dañarse muy fácilmente si Ud. comete errores en los circuitos que le conecte. Si el puerto paralelo está integrado al motherboard (como en muchas computadoras nuevas) reparar el puerto paralelo dañado puede ser muy caro (en muchos casos, es más barato reemplazar el motherboard que reparar el puerto). Lo más seguro es comprar una placa de E/S barata que tenga un puerto paralelo extra y usar éste para sus experimentos. Si Ud. dañara el puerto paralelo en esta placa, reemplazarla es fácil y barato. LIMITACIÓN DE RESPONSABILIDAD: Se han tomado cuidados razonables para producir esta información. Sin embargo, el autor no se hace responsable por cualquier efecto que el uso de esta información tenga en su equipamiento o cualquier resultado del uso de esta información. Es responsabilidad del usuario final determinar si es adecuado para cualquier propósito particular. Los circuitos y el software mostrados aquí pueden tener un uso no comercial sin consentimiento del autor. ¾ Cómo conectar circuitos al Puerto paralelo El Puerto paralelo de una PC es un conector de 25 pines tipo D hembra en la parte posterior de la computadora. Este se utiliza normalmente para conectar la computadora a una impresora, pero actualmente están disponibles muchos otros tipos de hardware para ese puerto. No siempre se utilizan los 25 pines. Normalmente, usted podrá simplemente usar sólo 8 pines de salida (líneas de datos) y la señal de tierra. En la tabla siguiente se muestran tales pines. Esas salidas son adecuadas para muchos propósitos. pin funcion 2 D0 3 D1 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 Los pines 18,19,20,21,22,23,24 y 25 están todos conectados a tierra. Los pines de datos son salidas de niveles TTL. Esto significa que tendrán idealmente 0V cuando están en nivel lógico bajo (0) y +5V cuando están en nivel lógico alto (1). En la práctica, los voltajes puede diferir del ideal cuando el circuito está bajo carga. La corriente de salida que el puerto paralelo puede entregar está limitada a sólo algunos miliamperes. ¾ Circuito simple para controlar LEDs Se puede hacer un circuito simple para manejar un pequeño led a través del puerto paralelo de la PC. Los únicos componentes necesarios son un LED y una resistencia de 470 ohms. Simplemente conecte el diodo en serie con la resistencia. La resistencia es necesaria para limitar la corriente tomada del puerto paralelo a un valor que encienda leds comunes con una intensidad aceptable y que sea un valor seguro (para no sobrecargar el integrado del puerto paralelo). En los casos prácticos, la corriente de salida será de unos pocos miliamperes para el led, lo que causará que un led común se encienda pero no llegue al máximo de brillo. Luego, conecte el circuito al Puerto paralelo de manera que uno de los terminales vaya a un pin de datos (el que vaya a usar para controlar ese led) y el otro vaya a cualquiera de los pines de tierra. Asegúrese de conectar el circuito de manera que el polo positivo del LED (la patita más larga) vaya al pin de datos. Si conecta el led de la manera contraria, no se encenderá. Puede conectar un circuito a cada uno de los pines de datos del puerto paralelo. De esta forma, tendrá ocho leds controlables por software. 2 El software de control es sencillo. Cuando Ud. mande un 1 al pin de datos donde el led está conectado, ese led se encenderá. Cuando mande un 0 a ese mismo pin, el led dejará de estar encendido. ¾ Programa de Control El siguiente programa es un ejemplo de como controlar los pines de datos del Puerto paralelo LPT1 desde un programa propio. Este ejemplo directamente controla los registros del puerto paralelo, por lo que no funciona bajo algunos sistemas operativos multitarea que no permiten hacer ese manejo. Trabaja bien bajo MSDOS. Puede mirar el código en Borland Pascal 7.0 (también se podría compilar con versiones anteriores) y luego descargar el programa compilar LPTOUT.EXE Program lpt1_output; Uses Dos; Var addr:word; data:byte; e:integer; Begin addr:=MemW[$0040:$0008]; Val(ParamStr(1),data,e); Port[addr]:=data; End. ¾ Como usar el programa LPTOUT.EXE es un programa muy simple de usar. El programa toma un parámetro, que es el valor del dato a enviar al puerto paralelo. El valor debe ser un entero en formato decimal (por ejemplo, 255). Se pueden usar números hexadecimales, pero deben estar precedidos por el signo $ (por ejemplo, $FF). El programa no tiene ningún tipo de chequeo de errores para simplificarlo. Si el número que ingresa no está en el formato correcto, el programa enviará algún valor extraño al puerto ¾ Ejemplos para utilizar el programa LPTOUT 0 Pone todos los pines a nivel bajo. LPTOUT 255 Pone todos los pines a nivel alto. LPTOUT 1 Pone el pin de datos D0 en nivel alto y todos los otros pines de datos en nivel bajo. ¾ Como calcular sus propios valores para mandar al programa. Tiene que pensar que el valor que se le da el programa como un número binario. Cada bit el número binario controla un bit de salida. La siguiente tabla describe la relación de esos bits, los pines de salida del puerto paralelo y los valores de esos bits. 3 Pin Bit Valor 2 D0 1 3 D1 2 4 D2 4 5 D3 8 6 D4 16 7 D5 32 8 D6 64 9 D7 128 Por ejemplo, si quiere poner los pines 2 y 3 a nivel 1 lógico (el led prendido), entonces tendrá que enviar el valor 1+2=3. Si quiere poner a nivel 1 lógico los pines 3,5 y 6, entonces deberá enviar el valor 2+8+16=26. De esta manera Ud. puede calcular el valor de cualquier combinación de bits que quiera enviar. ¾ Haciendo cambios al código fuente Ud. puede cambiar muy fácilmente el número de puerto paralelo en el código fuente cambiando la dirección de memoria desde donde el programa lee la dirección del puerto paralelo. Para más información, verifique en la siguiente tabla. Formato del segmento de datos de la BIOS en el segmento 40h: Offset 08h 0Ah 0Ch 0Eh Tamaño Descripción Palabra Palabra Palabra Palabra Dirección base de E/S del Dirección base de E/S del Dirección base de E/S del [no en PS] Dirección base 1er Puerto 2do Puerto 3er Puerto de E/S del paralelo, 0 si no hay ninguno paralelo, 0 si no hay ninguno paralelo, 0 si no hay ninguno 1er Puerto paralelo, 0 si no hay ninguno Por ejemplo, cambie la línea addr:=MemW[$0040:$0008]; en el código fuente a addr:=MemW[$0040:$000A]; si quiere usar como salida LPT2. ¾ Una alternativa para el programa de control: Depurador de DOS (Debug) El depurador de DOS es un editor de bytes que permite ver y modificar archivos a nivel de bytes. Es una prestación de muchas versiones modernas de DOS (por ejemplo, MS–DOS versión 7). Si bien el MS–Dos no es comúnmente usado hoy en día, aun puede se puede acceder a él desde Windows 95, Windows 98 o Windows NT presionando Inicio –> Ejecutar y escribiendo command (o CMD en Windows 2000 o NT). Puede intentar utilizar Debug bajo estos entornos (depende del sistema que use). Puede iniciar el depurador desde la línea de comandos de DOS (DOS real o una ventana de MS– DOS) escribiendo DEBUG y presionando enter. Una vez que el depurador es invocado, aparece en pantalla un signo menos (–), el símbolo de comando del Debug. Escriba el siguiente comando para llevar los pines de salida del puerto paralelo a nivel alto o 0378 ff Y puede escribir el siguiente comando para llevar a todos los pines de salida a nivel bajo nuevamente. o 0378 00 En la línea de comando de la primera orden, “o” significa una salida a un Puerto de un byte. El siguiente número “0378” es la dirección de E/S del puerto paralelo en formato hexadecimal (cambie la dirección si su puerto está en otra dirección). El último número (“FF” o “00”) es el byte enviado a los pines de datos del puerto paralelo en formato hexadecimal. El depurador de DOS puede ser usado como una herramienta muy básica para experimentar con el puerto paralelo de la PC. 4 ¾ Usando otros lenguajes Los siguientes son ejemplos cortos de cómo escribir a los puertos de E/S usando diferentes lenguajes de programación. En los ejemplos, he usado la dirección de E/S 378h que es una de las direcciones en donde el puerto paralelo puede estar. Los siguientes ejemplos son muy útiles bajo DOS. Assembler MOV DX,0378H MOV AL,n OUT DX,AL Donde n es el dato que se quiere enviar. BASIC OUT &H378, N Donde N es el dato que se quiere enviar. C outp(0x378,n); o outportb(0x378,n); Donde N es el dato que se quiere enviar. El comando de E/S del puerto varia de un compilador a otro ya que no es parte de las librerías estandarizadas de C. Aquí hay un ejemplo de código para el compilador de Borland C++ 3.1 #include <stdio.h> #include <dos.h> #include <conio.h> /**********************************************************/ /*Este programa escribe en las salidas del Puerto paralelo*/ /**********************************************************/ void main (void) { clrscr(); /* Limpia la pantalla */ outportb(0x378,0xff); /* envía datos al Puerto paralelo */ getch(); /* espera por una tecla antes de terminar */ ¾ Control del puerto paralelo en programas bajo Windows Controlar directamente el puerto paralelo es posible bajo Windows 3.x y Windows 95, desde aplicaciones de 16 bits y librerías dinámicas (DLL). Entonces puede usar el ejemplo anterior en C en Windows 3.x y Windows 95 si hace que su programa sea una aplicación de 16 bits. Si quiere controlar el puerto paralelo desde Visual Basic o Delphi, consulte las librerías en el sitio Parallel Port Central en http://ww.lvr.com/parport.htm. 5 Controlar directamente el Puerto desde una aplicación no es posible bajo Windows NT, y para habilitar el control del puerto sin restricciones, tendrá que escribir algún tipo de control de dispositivo que haga eso. Puede encontrar esta clase de controlador en el sitio Parallel Port Central. ¾ Control del puerto paralelo desde Linux Linux permite el acceso a cualquier Puerto usando iopern syscal. Aquí hay algunas partes de código para Linux para escribir 255 en el puerto de la impresora. #include #include #include #include <stdio.h> <stdlib.h> <unistd.h> <asm/io.h> #define base 0x378 /* dirección de base del Puerto de impresora */ #define value 255 /* valor numérico a mandar al Puerto de la impresora */ main(int argc, char **argv) { if (ioperm(base,1,1)) fprintf(stderr, "No puedo encontrar el Puerto en %x\n", base), exit(1); outb(value, base); } Grabe el código fuente al archive lpt_test.c y compílelo con el comando: gcc -O lpt_test.c -o lpt_test El usuario tiene que tener privilegios para acceder a los puertos para ejecutar el programa, o usted debe ser el root para habilitar que se ejecuten estos programas sin problemas de acceso. Si usted quiere hacer un programa que pueda ser ejecutado por cualquiera, primeramente debe indicar que el propietario del programa es root (por ejemplo, hacer la compilación cuando usted es el root), dar a los usuarios derechos para ejecutar el programa y luego indicar que el programa siempre sea ejecutado con derechos de propietario (root) o con los derechos que tenga el usuario que lo quiera ejecutar. Se puede indicar que el programa se ejecutado con drechos de propietario usando el siguiente comando: chmod +s lpt_test Si usted quiere un programa más útil, puede descargar el código fuente del programa de control del puerto paralelo de http://www.hut.fi/Misc/Electronics/circuits/lptout.c. Este programa funciona de tal forma que usted puede indicar el dato a mandar al puerto paralelo como un argumento de la línea de comandos (ya sea en decimal o en hexadecimal) del programa y este enviará el valor al puerto paralelo. Se puede compilar el código fuente para el comando lptout usando la siguiente línea de compilación: gcc -O lptout.c -o lptout Una vez que haya compilado el programa puede ejecutarlo fácilmente. Por ejemplo, ejecutando /.lptout 0xFF va a poner a todos los pines de datos en 1 y ejecutando ./lptout 0x00 pone todos los pines de datos en 0. 6 ¾ Controlando algunos dispositivos electrónicos reales La idea de la interface mostrada a continuación puede ser expandida para controlar dispositivos electrónicos simplemente añadiendo un circuito buffer al puerto paralelo. La programación puede ser hecha exactamente de la manera que se mostró en los ejemplos. ¾ Construyendo su propio circuito de control de relé. El siguiente circuito es la sencilla interface que puede usar para controlar un relé desde el Puerto paralelo: El circuito puede manejar relés que tomen corrientes de hasta 100mA y operen a 24V o menos. El circuito necesita una fuente externa que tenga la tensión adecuada para controlar el relé (5...24V, dependerá del relé). El transistor realiza la transición de corriente y el diodo previene picos que se produzcan en la bobina del relé que puedan dañar su computadora. (si deja de lado el diodo, entonces el transistor y su computadora pueden dañarse). Las bobinas (los solenoides y las bobinas de los relés) tienen una gran impedancia, cuando deja de circular corriente, generan un gran pico de tensión. La mayoría de los diseños tienen un diodo o un circuito de protección diseñado para bloquear que el pico de tensión “golpee” el resto del circuito. Si el diodo deja de funcionar, entonces el pico de tensión puede arruinar el transistor que maneja el relé o inclusive su placa de E/S después de un período de tiempo. El modo de falla para el transistor que maneja la carga debería ser un corto circuito, lo que haría que el terminal del solenoide quedara conectado a masa indefinidamente. El circuito puede ser usado también para controlar pequeñas cargas como leds más grandes, lámparas y pequeños motores de corriente continua. Tenga en cuenta que todos esos dispositivos que planea controlar directamente desde el transistor deben consumir menos de ATENCION: Cheque una y otra vez el circuito antes de conectarlo a su computadora. Usando el tipo equivocado de componentes o componentes dañados puede causar que su puerto paralelo se arruine. Errores en el armado de circuitos pueden resultar en que se dañe su puerto paralelo y necesite comprar una nueva placa de E/S múltiples. El 1N4002 en paralelo con el relé es un componente de protección esencial y no debe ser dejado de lado en ningún caso o puede ocurrir un daño en el puerto a causa del alto voltaje inductivo de retorno de la bobina del relé (el relé detiene ese pico cuando ocurre). 7 ¾ Un nuevo diseño más seguro. El circuito anterior funciona bien cuando el transistor es del tipo correcto y funciona apropiadamente. Si por alguna razon, la base y el colector se tocan y ud. está manejando más de +5V en el lado del relé, el circuito puede pasar esa tensión más alta al puerto paralelo y dañarlo. El circuito siguiente utiliza dos diodos 1N4148 para proteger el puerto paralelo contra tensiones superiores a +5V y también contra polaridades incorrectas (La fuente del circuito es accidentalmente invertida) Una idea para agregar mayor seguridad es reemplazar el diodo 1N4148 conectado a tierra por un diodo zener de 5.1V. Este diodo protegerá al puerto paralelo de los picos de voltaje y también del voltaje negativo. 8 ¾ Un ejemplo de un mal circuito Algunas personas consideran particularmente importante poner el relé después del transistor. Además de no ser importante, es una práctica incorrecta para el buen funcionamiento del puerto paralelo. Este tipo de fallas de diseño se han publicado en Internet en muchas ocasiones. El siguiente circuito es un ejemplo de este tipo de falla de diseño (no lo construya): NOTA: éste es un mal diseño. No lo construya ni lo utilice. El problema de este circuito es que el voltaje que va al relé siempre está limitado a menos de 4.5V aún cuando se utiliza el valor de Vcc es más alto. El circuito funciona como un seguidor de emisor, lo que hace que el voltaje del emisor siempre sea el voltaje de la base menos la VBE (0.6..0.7V). Esto significa que con un tope 5.1V de tensión de control, se obtiene un máximo de 4.5V de salida sin importar la tensión de la fuente (Para cuando sea mayor de 5V y por debajo de la tensión de ruptura del transistor) Otro problema es que algunos casos este tipo de circuito puede empezar a oscilar si la resistencia de la base está justo en el límite. 9 ¾ Circuito con opto acoplador Si quiere tener una muy buena protección del puerto paralelo quizás deba considerar usar un opto acoplador siguiendo el siguiente circuito. Típica distribución de pines de un opto acoplador. (4N25, CNY 17) El opto acoplador está ahi para proteger el Puerto. Observe que no hay conexiones eléctricas internas entre el led y el transistor. El circuito es alimentado con una fuente externa que no está conectada a la computadora. Esto evita que cualquier corriente en el circuito externo pueda dañar el puerto paralelo. La entrada del opto acoplador es un led. R1 se usa para limitar la corriente cuando la salida desde el puerto está activada. Esa resistencia de 1Kohm limita la corriente alrededor de 3mA que es más que suficiente para manejar el transistor de salida. Por la salida del opto acoplador, es como un transistor con el colector en la parte superior del circuito y el emisor en la parte inferior. Cuando la salida es activada (por el ingreso de luz desde el led interno en el opto acoplador), la corriente circula a través de la resistencia y por el transistor, saturándolo. Esto permite que la corriente circule por el relé. Cortando la entrada en el puerto paralelo, se corta la salida del opto acoplador, por lo que no circulará corriente en el transistor y este dejara de conducir. Cuando el transistor está cortado no circula corriente por el relé, por lo que se apaga. El diodo absorbe la descarga de la energía contenida en la bobina, evitando que el relé alimente al circuito con un retorno no deseado. 10 El circuito puede ser usado para controlar cargas de alrededor de 100mA (depende de los componentes y la tensión de operación utilizada). La fuente externa puede ser de entre 5 y 25V. ¾ Circuito de potencia con opto acoplador Aquí hay una versión de potencia del circuito descrito anteriormente: En este circuito T1 se usa para controlar la corriente de base de T2 que controla la corriente total. Se puede optar por cualquier transistor de potencia que cumpla con los requerimientos de corriente y tensión. Algunos alternativas son por ejemplo TIP41C (6A 100V) o el 2N3055 (15A 100V). Dependiendo del factor de amplificación propio del transistor T2, quizás no sea posible usar toda la capacidad de corriente del colector para evitar el exceso de pérdidas por calor en ese transistor. El circuito es básicamente una modificación muy sencilla del circuito original con opto acoplador con un solo transistor. La diferencia en este circuito es que T2 controla la corriente de carga y T1 actua como una resistencia extra que garantiza que T2 con conduzca cuando no hay una señal de alimentación en el opto acoplador (una pequeña corriente que se filtre del opto acoplador no hará que T1 y T2 conduzcan) 11 Leyendo los pines de entrada en el puerto paralelo El puerto paralelo de la PC tiene 5 entradas. Esas entradas pueden ser leídas de la dirección Base E/S del puerto LPT +1. El significado de los bits en el byte que se puede leer desde ese puerto de E/S es: • D0: estado no especificado • D1: estado no especificado • D2: estado no especificado • D3: estado del pin 15 (ERROR) invertido • D4: estado del pin 13 (SELECTED) • D5: estado del pin 12 (PAPER OUT) • D6: estado del pin 10 (ACK) • D7: estado del pin 11 (BUSY) inverted Aquí algunos códigos para leer datos desde el Puerto LPT: Assembler MOV DX,0379H IN AL,DX Se toma el resultado desde el registro AL BASIC N = INP(&H379); Donde N es el valor numérico leído. C in = inportb(0x379); or in = inp(0x379); Donde N es el dato que se quiere leer. El comando de E/S del puerto varia de un compilador a otro ya que no es parte de las librerías estandarizadas de C. Traducción: Adrián Pelliza 28/6/2004 12