EL PUERTO PARALELO

El puerto paralelo se utiliza generalmente para manejar impresoras. Sin embargo, dado que este puerto tiene un conjunto de entradas y salidas digitales, se puede emplear para hacer prácticas experimentales de lectura de datos y control de dispositivos. Esta obra pretende dar a conocer los aspectos más relevantes del puerto paralelo, de modo que se pueda utilizar como una interface de entrada/salida que funcione de modo subordinado a rutinas de software. Este trabajo surge de la necesidad de una guía para la práctica de la adquisición de datos y control de dispositivos como una alternativa al uso de Controladores Lógicos Programables (PLC) y Tarjetas de Adquisición de Datos, de modo que se puedan hacer experiencias con sistemas en Tiempo-Real. Se asume cierto conocimiento del lector de conceptos básicos de programación y electrónica. En este trabajo se utilizará como herramientas de software en Delphi, Turbo Pascal, Turbo C y Visual Basic.

Aspectos generales Puertos de Entrada / Salida (E/S)

Los puertos de E/S se constituyen en el medio por el cual el microprocesador de un computador se comunica con su entorno. Existen puertos para cada interacción de la unidad de procesamiento principal con sus dispositivos auxiliares. Así, existe un puerto de entrada del teclado, un puerto de salida para el vídeo, un puerto de entrada para el ratón, etc. La computadora Personal (PC) puede direccionar hasta 64K puertos de E/S. Cada puerto se designa por un número. A continuación se listan las direcciones en hexadecimal de los puertos más usuales de E/S. Direcciones de puertos más usuales de E/S

Actualmente se utiliza también para manejar otros periféricos como CD ROM. Este puerto tenía la capacidad de transmitir 8 bits de datos a la vez (del PC a la impresora). Este permite una comunicación de 8 bits en ambas direcciones. aunque éste había aumentado su velocidad considerablemente. Por último. Estos dos últimos son al puerto estándar como el Pentium al 286.Historia. pero no en el diseño operacional). el puerto original es bidireccional en diseño básico. limitaba la distancia de los cables externos hasta un máximo de 1. para utilizarlo como controlador de las impresoras de matriz de punto de alto desempeño. la forma de diseño que le dieron. y era extremadamente dependiente del software. Al hacerse extensamente utilizado.8 metros. el puerto paralelo ha sufrido varias modificaciones para hacerlo más veloz. protectores de copia. etc. En el momento que el puerto paralelo fue presentado. no había un estándar para la interface eléctrica. tres grandes grupos de problemas aparecieron a los desarrolladores y usuarios de este puerto: Primero. El puerto paralelo (Standart Parallel Port SPP) estaba incluido en el primer PC y se agregó a éste como una alternativa al bajo rendimiento del puerto serial. El puerto bidireccional fue introducido con el PS/2 compatible. Esto causaba muchos problemas cuando se quería garantizar la operación en múltiples plataformas. Algo interesante de notar es que el puerto original tenía la posibilidad de ser bidireccional realizando una conexión entre dos pines de un componente electrónico que venía incluido en éste. cintas de copia de respaldo. tarjetas de red. como una respuesta a estas necesidades. además de ser bidireccionales. Estos fabricantes. las impresoras de punto fueron el principal dispositivo externo que se conecto a éste. (Dicho de otro modo. En 1991 hubo una reunión de fabricantes de modo que se pudiera desarrollar un nuevo estándar para el control inteligente de impresoras a través de una red. no había cambio en la arquitectura o desempeño. donde estaban incluidos Lexmark. Texas Instruments y otros. el puerto paralelo llegó a ser la respuesta para conectar dispositivos más rápidos. la IBM (International Business Machines) introdujo la Computadora Personal (PC). discos duros. IBM. Tipos de puerto paralelo En la actualidad se conoce cuatro tipos de puerto paralelo: * Puerto paralelo estándar (Standart Parallel Port SPP) * Puerto Paralelo PS/2 (bidireccional) * Enhanced Parallel Port (EPP) * Extended Capability Port (ECP) En la siguiente tabla se muestra información sintetizada de cada uno de estos tipos de puertos. se creó el puerto bidireccional. Finalmente se han creado el Enhanced Parallel Port (EPP) y el Extended Capability Port (ECP). formaron la Network Printing Alliance (NPA). scanners. Después de este inicio. Inicialmente el puerto paralelo se utilizó para la comunicación con impresoras. evolución y tipos de puertos paralelos Historia En 1981. La máxima velocidad de transferencia alcanzable estaba por los 150 kbyte /seg. Ya que el puerto original era unidireccional. Evolución Desde la introducción del PC al mercado. Segundo. mientras que el puerto serial lo hacía de uno en uno. .

se crea un controlador de múltiples entradas y salidas (Multi I/O) donde se instalan controladores de discos. Este puerto utiliza un conector hembra DB25 en la computadora y un conector especial macho llamado Centronic que tiene 36 pines. El puerto paralelo tiene tres registros: * Registro de datos * Registro de estado * Registro de control En la tabla que se muestra a continuación se muestra la relación que existe entre las líneas físicas del conector del PC y los registros. No obstante. Es posible conectar el DB25 de 25 pines al Centronic de 36 pines ya que cerca de la mitad de los pines del Centronic van a tierra y no se conectan con el DB25. o también con la tarjeta del "monitor monocromático y adaptador de impresora de IBM". Los registros del puerto paralelo Cada registro del puerto paralelo es accesado mediante una dirección. En la actualidad (1999) el puerto paralelo se incluye comúnmente incluido en la placa madre de la computadora (MotherBoard). Las nuevas implementaciones del puerto permiten una comunicación bidireccional mediante estas líneas. Con la llegada de clones al mercado. indicadores de estado desde la impresora al PC (falta papel. estado. control e intercambio de mensajes desde el PC a la impresora.Descripción del puerto paralelo Descripción general Inicialmente se colocó al puerto paralelo en la tarjeta del "Adaptador de impresora de IBM". Las líneas de estado son usadas para intercambio de mensajes. Cada una de estas líneas (control. Las líneas de datos suministran los datos de impresión del PC hacia la impresora y solamente en esa dirección. datos) puede ser referenciada de modo independiente mediante un registro. Descripción del conector DB25 del PC y el conector DB25 del Centronic El puerto paralelo está formado por 17 líneas de señales y 8 líneas de tierra. . la conexión del puerto con el mundo externo no ha sufrido modificaciones. puerto de juegos y el puerto paralelo. puertos serie. impresora ocupada. error en la impresora). Las líneas de señales están formadas por tres grupos: * 4 Líneas de control * 5 Líneas de estado * 8 Líneas de datos En el diseño original las líneas de control son usadas para la interface.

el BIOS comprueba si hay puertos paralelos en las direcciones base 3BCh. Las posiciones que no son usadas pueden estar en 0. El adaptador de impresora podría usar la dirección base 3BCh. Significa que hay un puerto. Normalmente la asignación de direcciones es como sigue: . El BIOS detecta estos puertos escribiendo AAh al registro de datos (en la dirección de E/S Base + 0). y luego si en el registro de datos se lee AAh. le colocan la dirección del primer puerto encontrado. Durante el arranque. o más tarde 378h o 278h. y almacena la dirección base de cualesquiera que hayan sido encontrados en posiciones consecutivas de la tabla. y 278h. en ese orden. Algunos programas pueden ignorar esta tabla.Tabla general del puerto paralelo Notas: Un dato en alto es un 1. un dato en bajo es un 0 La entrada y salida son desde el punto de vista del PC Explicación del funcionamiento mediante el BIOS y el MS-DOS IBM especificó direcciones base para el puerto paralelo estándar (dentro del espacio de direccionamiento de Entrada/Salida del 80x86). El BIOS (Basic Input Output System) de IBM crea en el momento de arranque o POST (Power On Seft Test) una tabla en el espacio de la memoria principal (RAM) para 4 direcciones base de puerto paralelo de impresora. estos se almacenan como 4 bytes empezando con la dirección de memoria 408h. o como algunos BIOS lo hacen. pero esta es usada por lo menos por el propio BIOS (mediante la INT 17 de E/S de impresora) y por el MS-DOS. 378h.

exe del siguiente modo: Ejecutar el comando: debug. D2. MS-DOS Bajo MS-DOS se puede usar el comando externo debug. Entonces se debe leer el contenido de estas direcciones de memoria. entonces la dirección es: 0378 en hexadecimal. D6. D1. si encontramos que la dirección base es 378h. estado y control serán: * Base (datos)=378h * Estado=379h * Control=37Ah Cada una de ellas permite accesar a los siguientes bits (descritos en la tabla general): * Base (datos)=D0. S5. el puerto paralelo tiene su dirección base en dos direcciones consecutivas de memoria. S7 * Control=C0. D5. C2. Como se dijo anteriormente. S4. . luego aparece el símbolo Escribir después de este signo d 40:0008 Dependiendo del equipo aparece un volcado de la memoria de la siguiente forma: (los datos pueden variar) 0040:0000 ______________________78 03 00 00 00 00 00 00 La dirección del puerto se encuentra en forma invertida (78 03).Dirección/ Nombre/ Ubicación 3BCh_____ LPT1 _____Adaptador de impresión primario 378h_____ LPT2 _____Adaptador de impresión secundario Las referencias a cada registro del puerto se realizan de la siguiente forma: * Base (datos)=base+0 * Estado=base+1 * Control=base+2 Por ejemplo. C3 Programación y acceso a puertos Detección de la dirección base del puerto paralelo Primeramente se debe tener algún procedimiento para poder determinar cuál es la dirección base del puerto. D4. S6. entonces las direcciones del registro de datos. C1. a fin de determinar si existe un puerto y cuál es su dirección. D3. D7 * Estado=S3.exe. Cabe hacer notar que esta dirección puede ser diferente en otros PC.

tick : Integer. writeln('La dirección base en decimal es : '. puntero_int_1C : Pointer. Var base:word. Este programa se compila con Turbo Pascal. dir_control : Word.exe) En Turbo Pascal con ensamblador Program buscar_base.0} Program analisis_PP. cadena.base).pas} {Analizador de estado del Puerto Paralelo} {Autor: Juan Carlos Galarza Roca} {Diciembre de 1997} {Versión : 1. es:[si] {Colocar en ax el contenido de la dirección de memoria [0040:0008]} mov base.base). begin asm mov ax. {Actualizar la variable base con el valor de ax} end. utiles. ax. uses crt. end. dos.(Se escribe q y luego enter para salir de debug. . sw_m_t : Integer. Ax} mov es. Analizador del puerto paralelo Este analizador se utiliza para determinar la dirección base del puerto y además permite visualizar el contenido de los registros en forma continua y en formato binario y hexadecimal. dir_estado. 0040h {Colocar 0040h en el reg. uses crt. interrupt. var dir_base. writeln (' La dirección base en decimal es : '. Begin base:=memW[$0040:$0008].W-} procedure manejador.S-. {Archivo analisis. Var base : word. ax {Direccionar el segmento es con el valor de ax} mov ax. end. En Turbo Pascal Program buscar_base. {$F+. uses crt.

{sw_m_t es la bandera del manejador de tareas Esta bandera es actualizada por el programa principal } x:=whereX.'). write(' <. write(' <.'). write(' -> '). write(' -> '). 31: begin gotoxy(60+a.end.b). gotoxy(23. write(' <. begin if sw_m_t=0 then begin. write(' -> '). write(' -> ').b).b). write(' <. 15: begin gotoxy(60+a. {Devolver la posición original del cursor} end.end. write(' <.'). textcolor(7).b) . gotoxy(39+a. write(' <. gotoxy(52+a.b). y : Integer. dir_base:=memW[$0040:0008]. gotoxy(52+a.b)..2). tick:=0.b). gotoxy(x. textcolor(9). writeln('Direcciones: ').b). writeln('Datos : '. textcolor(9).writeln('Analizador del Puerto Paralelo'). .b). write(' -> ').puntero_int_1C).write('Explorando.end. 27: begin gotoxy(60+a. write('> ').b). 23: begin gotoxy(60+a.b). write(' -> ').5).').b).' (h)').').'). case tick of 13: begin gotoxy(60+a. gotoxy(8. gotoxy(52+a. de modo que se haga la lectura de datos y a la vez se despliegue el indicador} var a. clrscr. gotoxy(52+a.end.Addr(manejador)).end. gotoxy(52+a. write('< '). b.end. gotoxy(52+a.end. dir_estado:=dir_base+1.b). textcolor(2). gotoxy(52+a. write('-> ').b).b). 34: tick:=13. SetIntVec($1C.b).20677500572 segundos} a:=6. write(' -> ').b). 29: begin gotoxy(60+a. {Colocar el manejador de tareas} GetIntVec($1C. 17: begin gotoxy(60+a. textcolor(2).b). dir_control:=dir_base+2. write(' -> '). write('<.'). { La variable tick se incrementa cada 18. {se guarda la posición del cursor en la pantalla} tick:=tick+1. gotoxy(52+a.b). '). b:=3.write(' <-'). end. write(' <. gotoxy(52+a. 21: begin gotoxy(60+a.b). 33: begin gotoxy(60+a.{Este manejador se utiliza para temporizar el despliegue del indicador de exploración. end.end.end.'). {$F-. 25: begin gotoxy(60+a.b). x.dec_a_hexa(dir_base).y).end.b). gotoxy(52+a. write(' <')..'). gotoxy(10. 19: begin gotoxy(60+a. gotoxy(52+a.S+} begin cursor_off. write(' <.b). y:=whereY.end.4).

14). write('Pines 9 8 7 6 5 4 3 2'). write('Registro de Control'). cursor_on. write('Nombre -S7 S6 S5 S4 S3 ** ** **').6). gotoxy(9.dec_a_hexa(dir_estado).11). dec_bin(port[dir_base]). textcolor(2).19). gotoxy(9. {Ciclo repetivo principal} repeat sw_m_t:=1. writeln('Control: '. write('Datos : '. write('Valor '). dec_bin2(port[dir_base]). write('Estado : '. gotoxy(25.24). textcolor(2). sw_m_t:=0.puntero_int_1C). gotoxy(25. write('Nombre D7 D6 D5 D4 D3 D2 D1 D0').' (d) ').' (d) ').write(' (b)'). textcolor(2).9).write('[Copyrigth (c) 1997 por JCGR Soft ]').' (h)'). write('Registro de Estado'). dec_bin(port[dir_estado]). En Turbo Pascal Port[dir_base]:=5. writeln('Estado: '). gotoxy(36.7). se debe escribir 5 en el registro de datos (dirección base): Notas: dir_base y dir_estado es de tipo word.20).10). {Restaurar manejador de tareas} SetIntVec($1C. Este byte debe referirse a cada uno de los bits del registro.' (d) ').16). gotoxy(25.12). write('Nombre ** ** ** ** -C3 C2 -C1 -C0'). Esto significa que se debe definir el byte a escribir en sistema binario. dec_bin2(port[dir_control]). until keypressed. Envio y lectura de datos del puerto Envío de datos al puerto El puerto paralelo puede ser usado como una comunicación directa con el PC.dec_a_hexa(dir_control). El acceso se realiza escribiendo un byte (8 bits) en registro determinado.port[dir_estado]:3. . gotoxy(25. write('Control: '. write('Registro de Datos').21). gotoxy(25. y dato es de tipo byte.6).15). de este modo es posible desarrollar aplicaciones en tiempo-real que necesiten un rápido tiempo de respuesta.port[dir_control]:3.write(' (b)'). delay(100).7). gotoxy(36. textcolor(7).22). gotoxy(10. gotoxy(25.port[dir_base]:3. gotoxy(36.' (h)'). textcolor(7). writeln('Estado : '.5). gotoxy(34. end.17).gotoxy(10.4). otoxy(8. gotoxy(25. textcolor(7).write('Valor '). textcolor(2). write('Pines ** ** ** ** 17 16 14 1'). dec_bin2(port[dir_estado]). write('Pines 11 10 12 13 15 ** ** **'). textcolor(9). dec_bin(port[dir_control]).write(' (b)').write('Valor '). gotoxy(25. gotoxy(9. gotoxy(25. Por ejemplo si queremos escribir en el registro de datos el bit D0 y el bit D2 entonces el byte es: Luego. textcolor(7).

se realizan operaciones a nivel de bits. significa que los bits S5 y S6 están activos(tienen un nivel alto. si el dato leído es igual a 96. para saber si determinado bit que se ha leído del registro de estado está en un nivel alto (1 lógico) se puede hacer la operación "Y" lógica (AND) de la lectura con un valor que resulta de elevar 2 a la posición que ocupa ese bit en el byte. o sea. En ensamblador mov dx. la dirección base+1. y luego realizar la comparación. un 1). 5 {Colocar en ² al ² el número 5} out dx. dato:=Port[dir_estado]. dir_base {Direccionar en dx la dirección base} mov al. Por ejemplo. al {Enviar al puerto} Lectura de datos del puerto La lectura de datos se realiza accesando un byte del registro determinado. Note que sólo se debe leer el registro de estado. dir_estado {Direccionar dx con el registro de estado del puerto} in al. 5).En C Outportb(dir_base. dato=inportb(dir_estado). En el registro ² al ² está el dato leído} Por ejemplo. Estas operaciones permiten aislar uno más bits. Enmascaramiento Tanto en el envío como recepción de datos binarios. En Turbo Pascal Var dato: byte. En C unsigned int dato. entonces la operación es: Masc:=2^5=32 (Byte_leido AND masc) En el caso que el bit 5 esté en un nivel alto: Byte_leido Byte_leido . dx {Leer del puerto. Si el bit que se desea conocer es el bit 5. Este proceso se denomina enmascaramiento. Al hacer la lectura se debe convertir el byte a binario para determinar él o los bits que interesen. En ensamblador mov dx.

y en especial en aplicaciones electrónicas. . DO se considera el bit menos significativo (LSB) y D7 el mas significativo (MSB). como escáneres y demás. las tierras (llamadas muchas veces retornos de tierra en este contexto) actúan como blindajes de las líneas mas importantes. Máscara para el bit 5 y el 7 Masc= 2^5+2^7=160 ¿Qué es el puerto paralelo?. que poseen un conector DB-25. conviene aclarar que esta nota está dirigida a todos aquellos cuyos puertos paralelos sean IBM-compatibles. A continuación se muestra una ficha del tipo DB-25. es decir. o igual a masc. y en donde se conecta la impresora u otros dispositivos. se realiza la suma los valores. La otra es que. Como su nombre lo indica. sin embargo. 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.0 1 0 1 0 0 0 0 80 S7 S6 S5 S4 S3 S2 S1 S0 Posición AND 0 0 1 0 0 0 0 0 Máscara = 32 Resulta 0 0 0 0 0 0 0 0 0 máscara Si el bit 5 es 1. utiliza un conector DB-25 macho para su interfaz paralelo (por ser algo diferente). Tal vez esta pregunta no sea muy difícil de responder para cualquiera que haya usado una computadora alguna vez. entonces el resultado siempre es 0. Haciendo la comparación: Si (Byte_leido AND masc) = masc entonces Inicio /* las acciones a realizar cuando el 4to bit es 1 */ Fin Si el bit 5 es 0. puesto que. se le puede extraer mucho provecho a este medio de comunicación entre le PC y el exterior. 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. Ej. la conexión entre los dos dispositivos se realiza a menudo mediante un cable tipo cinta. aprovechando con esto las grandes prestaciones de la misma. Sin embargo. Es la ficha o conector que usualmente se sitúa en la parte trasera del gabinete de la PC. La Amiga I 000. lo cual es diferente a masc. Esto es extraño. entonces el resultado es 16. A este conjunto de líneas se las denomina "salidas de datos". la salida de datos transfiere información desde la computadora a un periférico en paralelo. En caso que se desee realizar el enmascaramiento de más de un bit. indicándose en ella las diferentes funciones de los distintos pines. En primer lugar. Esto se hace con ocho bits (un byte) por vez utilizando los terminales 2-9. puesto que este conector es el de serie que se utiliza para los interfaces serie.

En lo que respecta a escribir la instrucción se compone de dos parámetros que son la dirección y el dato. exit(1). Un ejemplo muy simple de cómo escribir un 0xFF en el puerto es el siguiente: #include <dos.0xFF). complementan el procedimiento de comunicación entre la PC y el dispositivo en cuestión. por ejemplo. SLCT IN. o bien outportb. *** . el dato. OCUPADO. obviamente. La dirección es el lugar en dónde va a ser escrito el dato. observando que el valor de tensión respecto de masa es de 5V aproximadamente. AH) y la dirección en el DX (DL. es decir. interrogándolo para cumplir su labor. ambas incluidas en la cabecera "dos. AUTOFD. Un detalle importante de las líneas de entrada es que el pin ACK (patilla 10) trabaja con pulso negativo (es decir está negado). Veamos cómo se procede en cada lenguaje. algún compilador.h> void main(void) { outport(0x378.8 voltios y los ceros como una tensión inferior a los 0. disponemos de 12 salidas y 5 entradas. PE. Para tener pleno acceso al puerto paralelo es necesario. se las denomina "entrada de diálogo" y. FAULT). en la dirección 0x378 (o cualquiera de las otras). Existen tres direcciones posibles en los sistemas IBM compatible.A las otras cuatro líneas de salida (STB. Sin embargo. el 0x278 y el 0x3BC. y a pesar de la gran diversidad de lenguajes. en dónde ubicar al puerto paralelo estas son 0x378 (888). por lo que se hace imprescindible el uso de algún buffer para aislar el puerto. se tiene acceso a los ocho bits denotados desde D0 a D7. Así. en primera instancia. La sintaxis de las instrucciones para la escritura en el puerto en los diversos lenguajes es similar aunque. la sintaxis de las respectivas instrucciones para enviar (escribir) y recibir (leer) datos del puerto es similar. En definitiva y. Para realizar esta misma tarea en ensamblador utilizamos la instrucción out. Finalmente a las cinco líneas de entrada (SEL. La más frecuentemente utilizada es la primera. En "C" se utiliza la instrucción outport. Análogamente para poner todos los bits en cero el número sería 0x00. } En este ejemplo simplemente colocamos las salidas D0 a D7 en uno. junto con las salidas de diálogo. Habitualmente el dato a escribir es representado en hexadecimal por la comodidad que esto conlleva. para poner todos unos en los datos deberíamos escribir un 0xFF. corresponde a la combinación de unos y ceros lógicos que se enviarán al puerto. cualquiera es válido desde ensamblador hasta visual basic o visual C++ pasando por "C" y basic. ACK. 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. una de las cuales está negada. es decir. Esto lo podemos comprobar si medimos dichas salidas con un multímetro.8 V. Una aclaración importante es que las direcciones corresponden a las alidas de datos. Conviene aclarar que los unos se presentan como + 5 a 3. IF)) se las denomina "salidas de diálogo" y envían señales específicas al dispositivo. El funcionamiento detallado de este procedimiento escapa a los alcances de este artículo. existen ciertas diferencias. El dato a escribir se encuentra en el registro AX (AL.h". DH). Veamos ahora cómo controlarlas y manejarlas. La segunda parte de la instrucción. en base a lo expuesto arriba. Además es conveniente no extraer de cada línea más de 5mA.