El Puerto LPT
El Puerto LPT
El Puerto LPT
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.
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
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.
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.
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
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
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.
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.
{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.
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}
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). ***