Вы находитесь на странице: 1из 11

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 prcticas experimentales de lectura de datos y control de dispositivos. Esta obra pretende dar a conocer los aspectos ms 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 gua para la prctica de la adquisicin de datos y control de dispositivos como una alternativa al uso de Controladores Lgicos Programables (PLC) y Tarjetas de Adquisicin de Datos, de modo que se puedan hacer experiencias con sistemas en Tiempo-Real. Se asume cierto conocimiento del lector de conceptos bsicos de programacin y electrnica. 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 interaccin de la unidad de procesamiento principal con sus dispositivos auxiliares. As, existe un puerto de entrada del teclado, un puerto de salida para el vdeo, un puerto de entrada para el ratn, etc. La computadora Personal (PC) puede direccionar hasta 64K puertos de E/S. Cada puerto se designa por un nmero. A continuacin se listan las direcciones en hexadecimal de los puertos ms usuales de E/S. Direcciones de puertos ms usuales de E/S

Historia, evolucin y tipos de puertos paralelos Historia


En 1981, la IBM (International Business Machines) introdujo la Computadora Personal (PC). 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, para utilizarlo como controlador de las impresoras de matriz de punto de alto desempeo. Este puerto tena la capacidad de transmitir 8 bits de datos a la vez (del PC a la impresora), mientras que el puerto serial lo haca de uno en uno. En el momento que el puerto paralelo fue presentado, las impresoras de punto fueron el principal dispositivo externo que se conecto a ste. Al hacerse extensamente utilizado, el puerto paralelo lleg a ser la respuesta para conectar dispositivos ms rpidos. Despus de este inicio, tres grandes grupos de problemas aparecieron a los desarrolladores y usuarios de este puerto: Primero, aunque ste haba aumentado su velocidad considerablemente, no haba cambio en la arquitectura o desempeo. La mxima velocidad de transferencia alcanzable estaba por los 150 kbyte /seg. y era extremadamente dependiente del software. Segundo, no haba un estndar para la interface elctrica. Esto causaba muchos problemas cuando se quera garantizar la operacin en mltiples plataformas. Por ltimo, la forma de diseo que le dieron, limitaba la distancia de los cables externos hasta un mximo de 1,8 metros. En 1991 hubo una reunin de fabricantes de modo que se pudiera desarrollar un nuevo estndar para el control inteligente de impresoras a travs de una red. Estos fabricantes, donde estaban incluidos Lexmark, IBM, Texas Instruments y otros, formaron la Network Printing Alliance (NPA), como una respuesta a estas necesidades.

Evolucin
Desde la introduccin del PC al mercado, el puerto paralelo ha sufrido varias modificaciones para hacerlo ms veloz. Ya que el puerto original era unidireccional, se cre el puerto bidireccional. El puerto bidireccional fue introducido con el PS/2 compatible. Este permite una comunicacin de 8 bits en ambas direcciones. Algo interesante de notar es que el puerto original tena la posibilidad de ser bidireccional realizando una conexin entre dos pines de un componente electrnico que vena incluido en ste. (Dicho de otro modo, el puerto original es bidireccional en diseo bsico, pero no en el diseo operacional). Finalmente se han creado el Enhanced Parallel Port (EPP) y el Extended Capability Port (ECP). Estos dos ltimos son al puerto estndar como el Pentium al 286, adems de ser bidireccionales. Inicialmente el puerto paralelo se utiliz para la comunicacin con impresoras. Actualmente se utiliza tambin para manejar otros perifricos como CD ROM, cintas de copia de respaldo, discos duros, tarjetas de red, protectores de copia, scanners, etc.

Tipos de puerto paralelo


En la actualidad se conoce cuatro tipos de puerto paralelo: * Puerto paralelo estndar (Standart Parallel Port SPP) * Puerto Paralelo PS/2 (bidireccional) * Enhanced Parallel Port (EPP) * Extended Capability Port (ECP) En la siguiente tabla se muestra informacin sintetizada de cada uno de estos tipos de puertos.

Descripcin del puerto paralelo Descripcin general


Inicialmente se coloc al puerto paralelo en la tarjeta del "Adaptador de impresora de IBM", o tambin con la tarjeta del "monitor monocromtico y adaptador de impresora de IBM". Con la llegada de clones al mercado, se crea un controlador de mltiples entradas y salidas (Multi I/O) donde se instalan controladores de discos, puertos serie, puerto de juegos y el puerto paralelo. En la actualidad (1999) el puerto paralelo se incluye comnmente incluido en la placa madre de la computadora (MotherBoard). No obstante, la conexin del puerto con el mundo externo no ha sufrido modificaciones. Este puerto utiliza un conector hembra DB25 en la computadora y un conector especial macho llamado Centronic que tiene 36 pines. 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. Descripcin del conector DB25 del PC y el conector DB25 del Centronic

El puerto paralelo est formado por 17 lneas de seales y 8 lneas de tierra. Las lneas de seales estn formadas por tres grupos: * 4 Lneas de control * 5 Lneas de estado * 8 Lneas de datos En el diseo original las lneas de control son usadas para la interface, control e intercambio de mensajes desde el PC a la impresora. Las lneas de estado son usadas para intercambio de mensajes, indicadores de estado desde la impresora al PC (falta papel, impresora ocupada, error en la impresora). Las lneas de datos suministran los datos de impresin del PC hacia la impresora y solamente en esa direccin. Las nuevas implementaciones del puerto permiten una comunicacin bidireccional mediante estas lneas. Cada una de estas lneas (control, estado, datos) puede ser referenciada de modo independiente mediante un registro.

Los registros del puerto paralelo


Cada registro del puerto paralelo es accesado mediante una direccin. El puerto paralelo tiene tres registros: * Registro de datos * Registro de estado * Registro de control En la tabla que se muestra a continuacin se muestra la relacin que existe entre las lneas fsicas del conector del PC y los registros.

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

Explicacin del funcionamiento mediante el BIOS y el MS-DOS


IBM especific direcciones base para el puerto paralelo estndar (dentro del espacio de direccionamiento de Entrada/Salida del 80x86). El adaptador de impresora podra usar la direccin base 3BCh, o ms tarde 378h o 278h. 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 direccin de memoria 408h. Durante el arranque, el BIOS comprueba si hay puertos paralelos en las direcciones base 3BCh, 378h, y 278h, en ese orden, y almacena la direccin base de cualesquiera que hayan sido encontrados en posiciones consecutivas de la tabla. Las posiciones que no son usadas pueden estar en 0, o como algunos BIOS lo hacen, le colocan la direccin del primer puerto encontrado. Algunos programas pueden ignorar esta tabla, 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. El BIOS detecta estos puertos escribiendo AAh al registro de datos (en la direccin de E/S Base + 0), y luego si en el registro de datos se lee AAh. Significa que hay un puerto. Normalmente la asignacin de direcciones es como sigue:

Direccin/ Nombre/ Ubicacin 3BCh_____ LPT1 _____Adaptador de impresin primario 378h_____ LPT2 _____Adaptador de impresin 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, si encontramos que la direccin base es 378h, entonces las direcciones del registro de datos, estado y control sern: * 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, D1, D2, D3, D4, D5, D6, D7 * Estado=S3, S4, S5, S6, S7 * Control=C0, C1, C2, C3

Programacin y acceso a puertos


Deteccin de la direccin base del puerto paralelo Primeramente se debe tener algn procedimiento para poder determinar cul es la direccin base del puerto. Como se dijo anteriormente, el puerto paralelo tiene su direccin base en dos direcciones consecutivas de memoria. Entonces se debe leer el contenido de estas direcciones de memoria, a fin de determinar si existe un puerto y cul es su direccin.

MS-DOS
Bajo MS-DOS se puede usar el comando externo debug.exe del siguiente modo: Ejecutar el comando: debug.exe, luego aparece el smbolo Escribir despus 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 direccin del puerto se encuentra en forma invertida (78 03), entonces la direccin es: 0378 en hexadecimal. Cabe hacer notar que esta direccin puede ser diferente en otros PC.

(Se escribe q y luego enter para salir de debug.exe)

En Turbo Pascal con ensamblador


Program buscar_base; uses crt; Var base : word; begin asm mov ax, 0040h {Colocar 0040h en el reg. Ax} mov es, ax {Direccionar el segmento es con el valor de ax} mov ax, es:[si] {Colocar en ax el contenido de la direccin de memoria [0040:0008]} mov base, ax; {Actualizar la variable base con el valor de ax} end; writeln (' La direccin base en decimal es : ',base); end.

En Turbo Pascal
Program buscar_base; uses crt; Var base:word; Begin base:=memW[$0040:$0008]; writeln('La direccin base en decimal es : ',base); end.

Analizador del puerto paralelo


Este analizador se utiliza para determinar la direccin base del puerto y adems permite visualizar el contenido de los registros en forma continua y en formato binario y hexadecimal. Este programa se compila con Turbo Pascal.
{Archivo analisis.pas} {Analizador de estado del Puerto Paralelo} {Autor: Juan Carlos Galarza Roca} {Diciembre de 1997} {Versin : 1.0} Program analisis_PP; uses crt, dos, cadena, utiles; var dir_base, dir_estado, dir_control : Word; puntero_int_1C : Pointer; tick : Integer; sw_m_t : Integer; {$F+,S-,W-} procedure manejador; interrupt;

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

gotoxy(10,6); writeln('Estado : ',dec_a_hexa(dir_estado),' (h)'); gotoxy(10,7); writeln('Control: ',dec_a_hexa(dir_control),' (h)'); {Ciclo repetivo principal} repeat sw_m_t:=1; textcolor(9); gotoxy(34,4); writeln('Estado: '); gotoxy(36,5); write('Datos : ',port[dir_base]:3,' (d) '); dec_bin(port[dir_base]);write(' (b)'); gotoxy(36,6); write('Estado : ',port[dir_estado]:3,' (d) '); dec_bin(port[dir_estado]);write(' (b)'); gotoxy(36,7); write('Control: ',port[dir_control]:3,' (d) '); dec_bin(port[dir_control]);write(' (b)'); textcolor(7); gotoxy(9,9); write('Registro de Datos'); gotoxy(25,10); write('Pines 9 8 7 6 5 4 3 2'); gotoxy(25,11); write('Nombre D7 D6 D5 D4 D3 D2 D1 D0'); textcolor(2); gotoxy(25,12); write('Valor '); dec_bin2(port[dir_base]); textcolor(7); gotoxy(9,14); write('Registro de Estado'); gotoxy(25,15); write('Pines 11 10 12 13 15 ** ** **'); gotoxy(25,16); write('Nombre -S7 S6 S5 S4 S3 ** ** **'); textcolor(2); gotoxy(25,17);write('Valor '); dec_bin2(port[dir_estado]); textcolor(7); gotoxy(9,19); write('Registro de Control'); gotoxy(25,20); write('Pines ** ** ** ** 17 16 14 1'); gotoxy(25,21); write('Nombre ** ** ** ** -C3 C2 -C1 -C0'); textcolor(2); gotoxy(25,22);write('Valor '); dec_bin2(port[dir_control]); textcolor(2); otoxy(8,24);write('[Copyrigth (c) 1997 por JCGR Soft ]'); textcolor(7); sw_m_t:=0; delay(100); until keypressed; cursor_on; {Restaurar manejador de tareas} SetIntVec($1C,puntero_int_1C); end.

Envio y lectura de datos del puerto


Envo de datos al puerto El puerto paralelo puede ser usado como una comunicacin directa con el PC, de este modo es posible desarrollar aplicaciones en tiempo-real que necesiten un rpido tiempo de respuesta. El acceso se realiza escribiendo un byte (8 bits) en registro determinado. Este byte debe referirse a cada uno de los bits del registro. Esto significa que se debe definir el byte a escribir en sistema binario. Por ejemplo si queremos escribir en el registro de datos el bit D0 y el bit D2 entonces el byte es:

Luego, se debe escribir 5 en el registro de datos (direccin base): Notas: dir_base y dir_estado es de tipo word, y dato es de tipo byte.

En Turbo Pascal
Port[dir_base]:=5;

En C Outportb(dir_base, 5); En ensamblador mov dx, dir_base {Direccionar en dx la direccin base} mov al, 5 {Colocar en al el nmero 5} out dx, al {Enviar al puerto}

Lectura de datos del puerto


La lectura de datos se realiza accesando un byte del registro determinado. Al hacer la lectura se debe convertir el byte a binario para determinar l o los bits que interesen. Note que slo se debe leer el registro de estado, o sea, la direccin base+1. En Turbo Pascal Var dato: byte; dato:=Port[dir_estado];

En C
unsigned int dato; dato=inportb(dir_estado);

En ensamblador
mov dx, dir_estado {Direccionar dx con el registro de estado del puerto} in al, dx {Leer del puerto. En el registro al est el dato ledo} Por ejemplo, si el dato ledo es igual a 96, significa que los bits S5 y S6 estn activos(tienen un nivel alto, un 1).

Enmascaramiento
Tanto en el envo como recepcin de datos binarios, se realizan operaciones a nivel de bits. Estas operaciones permiten aislar uno ms bits. Este proceso se denomina enmascaramiento. Por ejemplo, para saber si determinado bit que se ha ledo del registro de estado est en un nivel alto (1 lgico) se puede hacer la operacin "Y" lgica (AND) de la lectura con un valor que resulta de elevar 2 a la posicin que ocupa ese bit en el byte, y luego realizar la comparacin. Si el bit que se desea conocer es el bit 5, entonces la operacin 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

0 1 0 1 0 0 0 0 80 S7 S6 S5 S4 S3 S2 S1 S0 Posicin AND 0 0 1 0 0 0 0 0 Mscara = 32 Resulta 0 0 0 0 0 0 0 0 0 mscara Si el bit 5 es 1, entonces el resultado es 16, o igual a masc. Haciendo la comparacin: 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, entonces el resultado siempre es 0, lo cual es diferente a masc. En caso que se desee realizar el enmascaramiento de ms de un bit, se realiza la suma los valores. Ej. Mscara para el bit 5 y el 7 Masc= 2^5+2^7=160 Qu es el puerto paralelo?. Tal vez esta pregunta no sea muy difcil de responder para cualquiera que haya usado una computadora alguna vez. Es la ficha o conector que usualmente se sita en la parte trasera del gabinete de la PC, y en donde se conecta la impresora u otros dispositivos, como escneres y dems. Sin embargo, y en especial en aplicaciones electrnicas, se le puede extraer mucho provecho a este medio de comunicacin 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 extrao, 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 tambin la computadora. La Amiga I 000, sin embargo, utiliza un conector DB-25 macho para su interfaz paralelo (por ser algo diferente). A continuacin se muestra una ficha del tipo DB-25, indicndose en ella las diferentes funciones de los distintos pines. Notar que algunas de las lneas tienen una abreviatura convencional que se indica entre parntesis

Las tierras cumplen dos funciones: la primera es que vinculan las tierras de seal de los dos dispositivos que se interconectan de modo que puedan compartir una tierra comn como referencia para la seal. La otra es que, puesto que, la conexin entre los dos dispositivos se realiza a menudo mediante un cable tipo cinta, las tierras (llamadas muchas veces retornos de tierra en este contexto) actan como blindajes de las lneas mas importantes. Como su nombre lo indica, la salida de datos transfiere informacin desde la computadora a un perifrico 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 lneas se las denomina "salidas de datos".

A las otras cuatro lneas de salida (STB, AUTOFD, SLCT IN, IF)) se las denomina "salidas de dilogo" y envan seales especficas al dispositivo, interrogndolo para cumplir su labor. El funcionamiento detallado de este procedimiento escapa a los alcances de este artculo. Finalmente a las cinco lneas de entrada (SEL, PE, OCUPADO, ACK, FAULT), se las denomina "entrada de dilogo" y, junto con las salidas de dilogo, complementan el procedimiento de comunicacin entre la PC y el dispositivo en cuestin. Un detalle importante de las lneas 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 cmo controlarlas y manejarlas. Para tener pleno acceso al puerto paralelo es necesario, en primera instancia, algn compilador, cualquiera es vlido 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 instruccin se compone de dos parmetros que son la direccin y el dato. La direccin es el lugar en dnde va a ser escrito el dato. Existen tres direcciones posibles en los sistemas IBM compatible, en dnde ubicar al puerto paralelo estas son 0x378 (888), el 0x278 y el 0x3BC. La ms frecuentemente utilizada es la primera. Una aclaracin importante es que las direcciones corresponden a las alidas de datos, es decir, en la direccin 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 direccin original (0x37Apor ejemplo) y se tiene acceso a los cuatro bits ms significativos. La segunda parte de la instruccin, es decir, el dato; corresponde a la combinacin de unos y ceros lgicos que se enviarn al puerto. Conviene aclarar que los unos se presentan como + 5 a 3,8 voltios y los ceros como una tensin inferior a los 0,8 V. Adems es conveniente no extraer de cada lnea ms de 5mA, por lo que se hace imprescindible el uso de algn 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 deberamos escribir un 0xFF. Anlogamente para poner todos los bits en cero el nmero sera 0x00. La sintaxis de las instrucciones para la escritura en el puerto en los diversos lenguajes es similar aunque, obviamente, existen ciertas diferencias. Veamos cmo se procede en cada lenguaje. En "C" se utiliza la instruccin outport, o bien outportb, ambas incluidas en la cabecera "dos.h". Un ejemplo muy simple de cmo 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 multmetro, observando que el valor de tensin respecto de masa es de 5V aproximadamente. Para realizar esta misma tarea en ensamblador utilizamos la instruccin out. El dato a escribir se encuentra en el registro AX (AL, AH) y la direccin en el DX (DL, DH). ***