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.