Puerto paralelo

  ¿Qué es el puerto paralelo?. Tal vez esta pregunta no sea muy difícil de responder para cualquiera que haya usado una computadora alguna vez. Es la ficha o conector que usualmente se sitúa en la parte trasera del gabinete de la PC, y en donde se conecta la impresora u otros dispositivos, como escáneres y demás. Sin embargo, y en especial en aplicaciones electrónicas, se le puede extraer mucho provecho a este medio de comunicación entre le PC y el exterior, aprovechando con esto las grandes prestaciones de la misma.
  En primer lugar, conviene aclarar que esta nota está dirigida a todos aquellos cuyos puertos paralelos sean IBM-compatibles, es decir, que poseen un conector DB-25. Esto es extraño, puesto que este conector es el de serie que se utiliza para los interfaces serie. El conector es normalmente hembra (tiene orificios en lugar de patitas) para distinguirlo de los conectores serie que son habitualmente machos y que puede tener también la computadora. La Amiga I 000, sin embargo, utiliza un conector DB-25 macho para su interfaz paralelo (por ser algo diferente).
  a continuación se muestra una ficha del tipo DB-25, indicándose en ella las diferentes funciones de los distintos pines. Notar que algunas de las líneas tienen una abreviatura convencional que se indica entre paréntesis


 


 

  Las tierras cumplen dos funciones: la primera es que vinculan las tierras de señal de los dos dispositivos que se interconectan de modo que puedan compartir una tierra común como referencia para la señal. La otra es que, puesto que, la conexión entre los dos dispositivos se realiza a menudo mediante un cable tipo cinta, las tierras (llamadas muchas veces retornos de tierra en este contexto) actúan como blindajes de las líneas mas importantes.
  Como su nombre lo indica, la salida de datos transfiere información desde la computadora a un periférico en paralelo. Esto se hace con ocho bits (un byte) por vez utilizando los terminales 2-9. DO se considera el bit menos significativo (LSB) y D7 el mas significativo (MSB). A este conjunto de líneas se las denomina "salidas de datos".
  A las otras cuatro líneas de salida (STB, AUTOFD, SLCT IN, IF)) se las denomina "salidas de diálogo" y envían señales específicas al dispositivo, interrogándolo para cumplir su labor. El funcionamiento detallado de este procedimiento escapa a los alcances de este artículo.
  Finalmente a las cinco líneas de entrada (SEL, PE, OCUPADO, ACK, FAULT), se las denomina "entrada de diálogo" y, junto con las salidas de diálogo, complementan el procedimiento de comunicación entre la PC y el dispositivo en cuestión. Un detalle importante de las líneas de entrada es que el pin ACK (patilla 10) trabaja con pulso negativo (es decir está negado).
  En definitiva y, en base a lo expuesto arriba, disponemos de 12 salidas y 5 entradas, una de las cuales está negada. Veamos ahora cómo controlarlas y manejarlas.   Para tener pleno acceso al puerto paralelo es necesario, en primera instancia, algún compilador, cualquiera es válido desde ensamblador hasta visual basic o visual C++ pasando por "C" y basic. Sin embargo, y a pesar de la gran diversidad de lenguajes, la sintaxis de las respectivas instrucciones para enviar (escribir) y recibir (leer) datos del puerto es similar.
  En lo que respecta a escribir la instrucción se compone de dos parámetros que son la dirección y el dato. La dirección es el lugar en dónde va a ser escrito el dato. Existen tres direcciones posibles en los sistemas IBM compatible, en dónde ubicar al puerto paralelo estas son 0x378 (888), el 0x278 y el 0x3BC. La más frecuentemente utilizada es la primera. Una aclaración importante es que las direcciones corresponden a las alidas de datos, es decir, en la dirección 0x378 (o cualquiera de las otras), se tiene acceso a los ocho bits denotados desde D0 a D7. Para acceder a los otro cuatro bits de salida se le debe sumar dos unidades a la dirección original (0x37Apor ejemplo) y se tiene acceso a los cuatro bits más significativos.
  La segunda parte de la instrucción, es decir, el dato; corresponde a la combinación de unos y ceros lógicos que se enviarán al puerto. Conviene aclarar que los unos se presentan como + 5 a 3,8 voltios y los ceros como una tensión inferior a los 0,8 V. Además es conveniente no extraer de cada línea más de 5mA, por lo que se hace imprescindible el uso de algún buffer para aislar el puerto. Habitualmente el dato a escribir es representado en hexadecimal por la comodidad que esto conlleva. Así, por ejemplo, para poner todos unos en los datos deberíamos escribir un 0xFF. Análogamente para poner todos los bits en cero el número sería 0x00.
  La sintaxis de las instrucciones para la escritura en el puerto en los diversos lenguajes es similar aunque, obviamente, existen ciertas diferencias. Veamos cómo se procede en cada lenguaje.
  En "C" se utiliza la instrucción outport, o bien outportb, ambas incluidas en la cabecera "dos.h". Un ejemplo muy simple de cómo escribir un 0xFF en el puerto es el siguiente:

#include <dos.h>
void main(void)
{
outport(0x378,0xFF);
exit(1);
}

  En este ejemplo simplemente colocamos las salidas D0 a D7 en uno. Esto lo podemos comprobar si medimos dichas salidas con un multímetro, observando que el valor de tensión respecto de masa es de 5V aproximadamente.
  Para realizar esta misma tarea en ensamblador utilizamos la instrucción out. El dato a escribir se encuentra en el registro AX (AL, AH) y la dirección en el DX (DL, DH).
  En BASIC la instrucción recibe el mismo nombre, es decir, out. la sintaxis es similar que en "C", osea, dirección y dato en ese orden. En este caso se omiten los paréntesis y el punto y coma final, propios del lenguaje "C".
  Finalmente, veamos cómo controlar el puerto a través de Visual Basic (cualquier versión de 32 bits). Para ello, necesitaremos tener en nuestro directorio de sistema ("C\windows\system") una librería especial llamada INPOUT32.DLL. Si no la tenés pulsa
aquí
para bajarla. Además de la mencionada librería se incluye un módulo (denominado "inpout32.bas") con las correspondientes llamadas a la DLL. Una vez descargada la librería basta agregar el módulo al proyecto para disponer entonces de la instrucción out, similar a BASIC.
  En este momento estamos en condiciones de desarrollar un primer circuito básico de prueba. Éste va a consistir en prender o apagar 8 Leds conectado cada uno a los pines D0 a D7. El diagrama esquemático es el siguiente:


 

  En donde J1 es la ficha DB-25 del puerto paralelo, R1 a R8 son resistencias de 1/8W de 330 ohms. D1 a D8 son leds. Finalmente IC1 es un SN74AC541 o similar.
  Una vez montado, este circuito será de gran utilidad para probar cualquier programa que utilice el puerto paralelo. Las distintas aplicaciones de éste son inmensas.
  Para leer datos desde el puerto se utiliza otra instrucción que, como la anterior, posee una sintaxis similar en los diversos leguajes. Para BASIC y VISUAL BASIC, se escribe como inp. En "C" este comando recibe el nombre de inport o bien inportb (ambas en la cabecera "dos.h"). Finalmente en ensamblador la intrucción es inp. En todos los casos el único argumento de la instrucción es la dirección que, en este caso, corresponde con la del puerto más uno. Recordemos que se disponen 5 líneas de entrada y que una de ellas se encuentra negada. Un circuito típico para probar la lectura del puerto paralelo es el siguiente:
 


 

  Nuevamente J1 es la ficha DB-25. R1 A R5 son resistencias de 1/8 W 10 kiloohms. S1 a S5 son pulsadores o llaves. Nótese que el circuito tiene en cuenta la línea negada, lo que "normaliza" la lectura.
  Tomando como referencia a estos circuitos se puede diseñar y construir un sin número de circuitos y aplicaciones utilizando el puerto paralelo y cualquier lenguanje de programación. Muchos de estos circuitos los puedes encontrar en la sección
miscelánea
. Algunas aplicaciones son: Control de motores paso a paso, sistemas de alarma, generador de señales digital, fuente digital, efectos de luces, efectos sonoros,... y muchos más.
  Como ves la lista es enorme y las posibilidades de este nuevo uso del puerto son infinitas.
 


Volver a Principal