|
Puerto LPT
EL PUERTO DE IMPRESORA
Los ordenadores PC han estandarizado un tipo de interfaz para la comunicaci�n
con la impresora, conocida normalmente como CENTRONICS. Esta interfaz es capaz
de enviar caracteres a la impresora de forma paralelo. Cada car�cter est�
codificado en un byte, del cu�l cada bit se transmite por un terminal diferente
Existen otros terminales que conectan ordenador e impresora, que sirven para
intercambiar informaci�n de control y de estado, a fin de implementar un
sencillo protocolo.
Para realizar esta interfaz, los PCs disponen de unos elementos hardware
espec�ficos, denominados puertos de impresora o tambi�n puertos paralelo.
En un PC pueden instalarse varios de estos puertos que se distinguen entre
s� con los nombres LPT1, LPT2 y LPT3 (en algunos casos tambi�n LPT4). Todos
ellos son id�nticos, salvo que tienen asignadas diferentes direcciones en
el mapa de entrada/salida.
Cada uno de estos puertos ocupa tres direcciones del mapa de E/S:
Puerto de Datos: De 8 bits, es donde la CPU escribe los datos que se env�an
a la impresora (caracteres).
Puerto de Estado: Registro de 8 bits de donde la CPU puede conocer diversos
aspectos del estado de la impresora (apagada, sin papel, etc). Se usan s�lo
5 de los 8 bits.
Puerto de Control: Registro de 8 bits donde la CPU puede escribir diversas
se�ales que reconoce la impresora (validaci�n de datos, inicializaci�n, etc).
Se usan 4 bits.
Estos tres registros ocupan posiciones consecutivas, por lo que basta con
especificar la primera de ellas. El puerto de datos ser� el puerto base.
La ROM-BIOS de los PCs contiene programas elementales para el manejo de
estos puertos. En primer lugar, durante el proceso de arranque del ordenador
se detecta su presencia y se almacenan sus direcciones base en una zona de
variables situada en el segmento 0040H (zona de variables del BIOS). En esta
zona se pueden encontrar los siguientes datos:
Printer_Base: En los offsets 0008H, 000AH, 000CH y 000EH, con 2 bytes cada
uno de ellos, est�n las direcciones de E/S en las que se encuentran los
puertos base de LPT1, LPT2, LPT3 y LPT4 respectivamente.
Lista de equipamiento: En el offset 0010H se encuentra una palabra que
muestra de forma rudimentaria los dispositivos que se han encontrado en
el arranque. Los bits 15 y 14 indican el n�mero de puertos de impresora
instalados. Print_Tim_Out: En los offsets 0078H, 0079H, 007AH y 007BH se
encuentran los valores de TIME_OUT asociados a cada puerto. Se trata de
valores que se van a utilizar para establecer cu�nto tiempo se va a esperar
para determinar que la impresora no est� disponible (est� apagada, no tiene
papel, etc).
Las direcciones del mapa de memoria de E/S en las que se suelen colocar los
puertos de impresora son:
Impresora | Puerto de Datos | Puerto de Estado | Puerto de Control
LPT1 03BCh 03BDh 03BEh
LPT2 0378h 0379h 037Ah
LPT3 0278h 0279h 027Ah
Tabla 1
Se�ales de la interfaz Centronics
El puerto paralelo, utilizado en general para el control de la impresi�n,
maneja las se�ales que se muestran en la tabla siguiente. De todas ellas,
las que normalmente intervienen en el protocolo de comunicaci�n entre el PC
y la impresora son BUSY y STROBE#. Algunas impresoras pueden no utilizar
alguna de las se�ales descritas en la tabla.
PUERTO NOMBRE Dir Pin DB25 DESCRIPCI�N
DATOS D0..D7 S 2-9 8 terminales de datos. Desde D0 a D7.
ESTADO BUSY E 11 Un nivel alto indica que la impresora
est� ocupada y no puede recibir datos
nuevos. Tambi�n se pone a 1 en
situaciones de error.
ACK# E 10 Un nivel bajo indica que la impresora
ha recibido un dato y est� disponible
para recibir uno nuevo.
PE E 12 Un nivel alto indica que la impresora
no tiene papel.
SLCT IN E 13 Un nivel alto indica que la impresora
est� on-line.
ERROR# E 15 Un nivel bajo indica que se ha producido
un error en la impresora. No hay papel,
mal funcionamiento, etc.
Tabla 2
El puerto de Datos
Generalmente es s�lo de salida, pues se dise�� para enviar caracteres a
la impresora. Actualmente este puerto es bidireccional. La correspondencia
entre los bits del registro de datos y las se�ales presentes en el
conector DB25 del exterior es:
BIT 7 6 5 4 3 2 1 0
FUNCI�N D7 D6 D5 D4 D3 D2 D1 D0
Tabla 3
El puerto de Estado
Es un puerto de entrada. Est� destinado a la lectura del estado de las
l�neas de interfaz con la impresora. La se�al BUSY es invertida antes
de llegar al registro. La correspondencia entre los bits del registro
de estado y las se�ales presentes en el conector DB25 del exterior es:
BIT 7 6 5 4 3 2 1 0
FUNCI�N BUSY
(inv.)
ACK# PE SLCT
IN
ERROR# -- -- --
Tabla 4
El puerto de Control
Es un puerto de salida destinado a la escritura de comandos sobre la impresora.
Las se�ales SLCT#, AUTOFD# y STROB# son invertidas antes de llegar a los
correspondientes terminales de conector externo. El bit 4 (IRQEN) no es una
se�al que corresponda a alguno de los terminales de la interfaz Centronics.
Se trata de un flag que habilita o prohibe la generaci�n de la interrupci�n
IRQ7 cuando se activa la se�al ACK#. Las rutinas del BIOS que se ocupan de la
impresora no utilizan esta interrupci�n. La correspondencia entre los bits del
registro de control y las se�ales presentes en el conector DB25 del exterior es:
BIT 7 6 5 4 3 2 1 0
FUNCI�N -- -- -- IRQEN SELECT#
(inv.)
INIT# AUTOFD#
(inv.)
STROBE#
(inv.)
Tabla 5
EL PUERTO DE IMPRESORA COMO CONTROL Y ADQUISICI�N DE DATOS
Un puerto es un mecanismo que conecta a un procesador con el mundo exterior.
Por medio de un puerto, el procesador recibe una se�al desde un dispositivo
de entrada y env�a una se�al a un dispositivo de salida. Los puertos son
identificados por sus direcciones en el intervalo 0000h-03FFh, lo que permite
el uso de 1024 puertos en total. Las direcciones no son de memoria, est�n
situadas en un mapa diferente de entrada/salida.
Todo lo descrito en el apartado anterior define el funcionamiento del manejo
de la impresora, a trav�s de unos puertos. Pero estos mismos puertos se pueden
ver de otra forma, sencillamente como tres puertos consecutivos de E/S un poco
particulares.
Para la comunicaci�n con los puertos se utilizan las instrucciones IN y OUT
de ensamblador.
IN transfiere informaci�n desde un puerto de entrada al registro AL si es
un byte, y al AX si es una palabra. El formato es:
IN reg_acum, puerto
OUT transfiere informaci�n a un puerto de salida desde el registro AL (byte)
o el AX (palabra). El formato es:
OUT puerto, reg_acum
Si consideramos los puertos de datos, estado y control vistos anteriormente,
los podemos ver de la siguiente manera:
D7 � Dato 7 S7 � Busy (inv) C7 -- --
D6 � Dato 6 S6 � ACK# C6 -- --
D5 � Dato 5 S5 � PE C5 -- --
D4 � Dato 4 S4 � SLCT IN C4 -- --
D3 � Dato 3 S3 � ERROR# C3 � SELECT (inv)
D2 � Dato 2 S2 -- -- C2 � INIT#
D1 � Dato 1 S1 -- -- C1 � AUTOFD# (inv)
D0 � Dato 0 S0 -- -- C0 � STROBE# (inv)
Tabla 6
Es decir, disponemos de dos puertos de salida, uno de 8 bits y otro de 4 bits
y un puerto de entrada de 5 bits para el prop�sito que nosotros decidamos,
conociendo las direcciones que ocupan.
Recordar el significado de las se�ales marcadas con "(inv)". Esto quiere decir
que est�n invertida por hardware. Es decir, si se ejecuta la instrucci�n
OUT 037AH, 0FFh
se est�n poniendo a 1 todos los bits del registro del puerto de control, pero
en el conector externo del puerto, el DB25, aparecer�a un 1 s�lo en el pin 16
(INIT#), en los pines 1, 14 y 17 aparecer�a un cero (STROBE#, AUTOFD# y SELECT
respectivamente).
La distribuci�n de se�ales en los pines del conector de salida del PC (hembra)
se muestran a continuaci�n:

Figura 1. Los pines del 18 al 25 est�n conectados a GND.
Ejemplo de control de hardware externo a trav�s del puerto paralelo: control de
encendido de diodos LED y lectura de pulsadores externos.
En la siguiente figura se puede ver el montaje correspondiente a un grupo de 8
diodos LED conectados al puerto de datos, 4 al puerto de control y 5 pulsadores
al puerto de estado. Las resistencias en serie con los LEDs sirven para limitar
la corriente que circula por el puerto, que no debe ser elevada para no da�arlo
(del orden de 3-4 mA de salida y 12-15 mA de entrada). Las que est�n conectadas
a los pulsadores se denominan de pull-up y sirven para fijar un nivel l�gico en
ausencia de pulsaci�n. Los LEDs se encendr�n cuando haya un cero l�gico a la
salida del pin correspondiente del puerto.

Figura 2
Nota: el bit 7 del puerto de estado y los bits 1, 14 y 17 del de control est�n
invertidos. Para trabajar con ellos se recomienda el uso de la instrucci�n
OR-Exclusiva (XOR) que, a trav�s de una m�scara, corrija lo anterior despu�s
de leer del puerto de estado o antes de escribir en el de control.
Las instrucciones siguientes encender�an los LEDs a modo de un contador binario:
mov cx,0FFh ; la cuenta se repetir� 256 veces
mov ax,0FFh ; primer n�mero de la cuenta. Recordar que con un 1 est�n apagados
mov dx, puerto ; se supone definida puerto=03BCh, por ejemplo
cont: out dx, al ; saca al puerto de datos el contenido de al
dec ax ; actualiza la cuenta
loop cont ; se repite 256 veces
out dx,0FFh ; apaga todos los leds
Manejo de la interrupci�n del puerto paralelo.
El bit 4 del puerto de control, seg�n la tabla 5, se denomina IRQEN. Este bit
habilita o permite que se produzca la interrupci�n asociada a la entrada ACK#.
Cuando este bit est� a 1 y la se�al ACK# pasa del nivel l�gico 1 al nivel 0
se produce una petici�n de interrupci�n, que es la IRQ7.
En el dise�o original del PC, IBM reserv� 8 interrupciones hardware,
comenzando por la interrupci�n 08h, para expansi�n de interrupciones,
que son com�nmente conocidas como IRQ0 a IRQ7. As� la IRQ0 se corresponde
con la interrupci�n 08h, la IRQ1 con la 09h, etc. La IRQ7 se corresponde
pues con la 0Fh, estando sus vectores a partir de la direcci�n 0000:003Ch.
Para que una petici�n de una IRQ llegue a la CPU, �sta debe estar permitida,
no enmascarada. El puerto 021h est� asociado con la m�scara de interrupciones
de las IRQ. Para habilitar una determinada interrupci�n se deber� escribir
un cero en la posici�n correspondiente, sin modificar el resto. As�, si lo
que se quiere es permitir la IRQ7 habr� que poner a cero el bit m�s
significativo del puerto 021h, como muestra el c�digo siguiente:
in al,021h ; lee la m�scara de las IRQ
and al, 01111111b ; impone un 0 en el bit m�s significativo, IRQ7. No
modifica el resto
out 021h, al ; escribe la m�scara
Con estas operaciones quedar� habilitada la IRQ7. Una vez atendida de
la forma que se haya previsto, el programa debe indicar a la CPU que la
interrupci�n ya ha sido procesada, para ello debe escribir un 1 en el
bit 5 del puerto 020h, es decir:
mov al, 020h ; carga en al 0010 0000 b
out 020h, al ; lo escribe en al puerto 020h
Finalmente, tan s�lo queda por activar el bit que permite que la se�al
ACK# genere una petici�n de IRQ7. Para ello se deber� poner a 1 el bit
4 del puerto de control , sin modificar el resto. Cuando no se quiera
que se produzca una IRQ7, basta con poner a cero este bit.
Al finalizar el programa, no s�lo se deben restablecer los vectores de
interrupci�n modificados, sino que tambi�n se debe inhibir la IRQ7,
dejando la m�scara del puerto 021h como estaba.
Un programa que utilice la interrupci�n del puerto paralelo puede tener
esta estructura, en lo que se refiere al manejo de dicha interrupci�n:
Al comienzo:
modificar vectores de la interrupci�n 0Fh (IRQ7)
permitir la interrupci�n IRQ7, poner a 0 el bit 7 del puerto 021h
Durante la ejecuci�n, siempre que haga falta:
habilitar la interrupci�n en el puerto de control, bit 4
repetir
procesar la interrupci�n
escribir 020h en el puerto 020h
hasta que se deba inhibir
inhibir la interrupci�n, poniendo un cero en el bit 4 del puerto de
control
Al terminar
inhabilitar la IRQ7, poner a 1 el bit 7 del puerto 021h
recuperar los vectores de interrupci�n anteriores
Bibliograf�a:
Los microprocesadores xx86 y la arquitectura del PC. Antonio Garc�a
Guerra. Ed. Sistemas y Servicios de Comunicaci�n. Madrid 1995.
Lenguaje ensamblador y programaci�n para PC IBM� y compatibles.
Peter Abel. Ed. Prentice Hall Hispanoamericana, S.A..1996
The indispensable PC hardware book. Hans-Peter Messmer. Ed.
Addison-Wesley. 1996
MANEJO EN PASCAL
Para conocer la direcci�n de memoria de los 4 puertos Centronics, una
funci�n �til es la siguiente:
{ Entrada: NUM = N�mero del puerto paralelo }
{ Salida :TRUE, cuando paralelo }
{ Var. globales: Port1, Port2 }
{ Info: Las direcciones de base de hasta 4 puertos paralelos }
{ se encuentran en las cuatro palabras de memoria }
{ comenzando en 0040:0008 }
function DirPort( Numero: integer ): boolean;
begin
if ( Port1 0 ) then
begin
Port2 := Port1 + 1;
GetPortAdr := TRUE;
end
else
DirPort := FALSE;
end;
De esta manera leemos las 4 posiciones de base de hasta 4 puertos
paralelos que se encuentran en las 4 palabras de memoria comenzando
en 0040: 0008. Para entrar y sacar datos lo har�amos con una llamada
a las rutinas en ensamblador comentadas anteriormente. En lenguaje C
proceder�amos igualmente:
reconocer�amos las direcciones de los 4 puertos paralelo y mediante las
rutinas en ensamblador leer�amos o escribir�amos en los diferentes
registros.
char var1 = inport (unsigned int port);
outport (unsigned int port, char var2);
2) Estas rutinas van a funcionar solamente si el programa corre en una sesi�n
de DOS. Ocasionalmente Windows (la versi�n que sea) se porta medio ego�sta
con los puertos y no deja accesarlos directamente. Si no les permite ejecutar
el programa desde una ventana, van a tener que "rebootear" la m�quina en DOS.
-------------------------------------------------------------------------------------
Comencemos:
Este puerto se comunica con el mundo mediante una conexi�n con 25 hoyos
peque�os que est� detr�s de casi todas las PC, y que se utiliza generalmente
para conectar la impresora (de hecho para eso fue dise�ado originalmente
[Van Gilluwe, 94] ). Este tipo de conexi�n es llamado "DB 25 hembra"
Las siglas "DB" significan "Data Bus").
Los puertos paralelos han permanecido casi igual desde las primeras
PC. Se han hecho algunas extensiones a su funcionamiento, pero siempre
respetando la compatibilidad con los modelos anteriores. El modelo de
puerto paralelo que se describe aqu� es el modelo est�ndar, de modo que
su funcionamiento es v�lido para cualquier tipo de PC.
Este modelo es unidireccional (significa que cada pin es de entrada o
salida, pero no ambos), y puede transmitir 150 Kbytes por segundo. Esto
es (repetimos) el est�ndar de puerto paralelo que se ha usado desde las
XT. Actualmente ya puede alcanzarse una respetable velocidad de 2 Mega
bytes por segundo, y con bidireccionabilidad en los puertos. Sin embargo,
se pretende aqu� definir globalmente algo que pueda funcionar por igual
en todas las PCs, y no solamente en los modelos m�s nuevos.
Si se desea experimentar con estos puertos extendidos (los
bidireccionales), ser� necesario investigar primero las especificaciones
particulares de la m�quina. El "Enhanced Parallel Port", por ejemplo,
s�lo est� presente de los modelos 386SL y 486SL en adelante. Ok, Ok,
alguien preguntar�: "�pero para qu� quiero aprender a hacer robots
compatibles con puertos paralelos tan anticuados y obsoletos? �y aparte
en DOS! �ya no se usa!". Muchachos, tomen en cuenta que no siempre la
escuela les va a poder prestar tan facilmente una Pentium III de 500
Mhz con Windows 2000 para sus primeros experimentos de rob�tica. As�
que es mejor que puedan hacer que su robot funcione en cualquier m�quina.
De todos modos, las instrucciones para la programaci�n de los puertos
paralelos m�s avanzados pueden encontrarse en cualquier libro reciente
(de 1993 en adelante) sobre arquitectura de las PC. Un libro recomendado
para ello es "The Undocumented PC", de Frank van Gilluwe.
La siguiente figura muestra el diagrama de un puerto paralelo est�ndar.
El dibujo muestra la salida del puerto tal y como se ve al estar viendo
a la computadora desde atr�s (de todos modos, los n�meros de los pines
est�n grabados ah� mismo en la conexi�n. S�lo tienen que mirarla muy
de cerquita). Este es el diagrama que se encontrar�a en la mayor�a de
los manuales t�cnicos. Como puede verse, est� espec�ficamente dise�ado
para la impresora. Las flechas que salen del puerto son los comandos
que se env�an a �sta (salto de hoja, inicializaci�n, selecci�n,
habilitaci�n), y tiene una entrada para cada se�al que la impresora
puede mandar: error, impresora no seleccionada, impresora ocupada,
sin papel, y "reconocimiento" (ACK).

Como se puede ver en el diagrama, el puerto est� enfocado espec�ficamente
al manejo de la impresora. Esto nos da un total de doce bits de salida
y cinco bits de entrada, lo cual es una desafortunada combinaci�n desde
el punto de vista de la comunicaci�n paralela. Podemos mandar perfectamente
un byte (8 bits) de datos al exterior, pero tenemos que recibirlo en trozos.
Direccionamiento del puerto.
Existe un comando para entablar comunicaci�n directa con cualquiera de
los puertos de la PC (no solamente los paralelos). Este comando se llama
"Port" (en lenguaje PASCAL), y para enviar datos a un puerto en particular
se utiliza con el siguiente formato:
Port [ Direcci�n] := Algo;
Y para leer informaci�n de un puerto (y guardarla a su vez en una
variable) se utiliza de la forma:
Variable := Port [ Direcci�n];
"Direcci�n" es un valor tipo "word" (16 bits) que indica una posici�n de
memoria en el mapa de puertos de la PC. A su vez, "Variable" es
(precisamente) una variable tipo byte, y "Algo" es un valor (n�mero o
variable) tipo byte. Esto significa que la direcci�n del puerto puede
ser un n�mero cualquiera de 0 hasta 65535, mientras que los valores
que se leen y escriben en el mismo s�lo pueden ir desde 0 hasta 255.
Ahora bien, �c�mo se obtiene la direcci�n del puerto paralelo?. Pues
esa direcci�n est� colocada en una de las posiciones m�s bajas de
memoria: en la $0040:$0008 El signo de "$" significa que estos n�meros
est�n representados en hexadecimal, y los dos puntos de enmedio
representan la separaci�n de la direcci�n en "segmento" y
"desplazamiento". Esto significa: desde la posici�n de memoria $40,
mu�vete $8 espacios m�s. Y ah� es donde se tienen las direcciones
base de todos los posibles puertos paralelos que haya.
Bytes de "Data", "Status" y "Control".
Debido a la poco com�n configuraci�n de bits de entrada y salida
que tiene, el intercambio de informaci�n con este puerto paralelo
(el est�ndar) y el mundo exterior es ligeramente complicado. Sin
embargo, una vez entendidos los principios b�sicos de funcionamiento
y con la l�gica de programaci�n adecuada, no debe presentar mayores
problemas.
Estos 12 bits de salida y 5 bits de entrada est�n agrupados en 3
bytes, conocidos ampliamente en la literatura computacional como
los bytes "Data, Status y Control". Esto proviene del dise�o original
del puerto que, como ya se mencion�, fue hecho pensando en la impresora
solamente.
El byte llamado "Data" son los 8 bits de datos de salida que mandan el
caracter a la impresora. El byte de "Control" es para darle �rdenes, y
est� formado por los 4 bits de salida solamente (los otro cuatro bits
el byte no se utilizan). Y finalmente, el byte "Status" est� formado
por 5 bits de entrada que leen la condici�n de la impresora (los otros
bits tampoco se usan). Las siguientes figuras muestran c�mo est�n
distribuidos estos bits en sus respectivos bytes. Cada puerto paralelo
que exista en la PC estar� caracterizado por estos tres bytes, aunque
(obviamente) cada uno los tendr� localizados en direcciones diferentes,
seg�n el fabricante de la PC.



Funci�n para investigar las direcciones.
Una vez revisada la teor�a b�sica de funcionamiento del puerto, podemos
ya proceder a su programaci�n. Y la primera rutina a utilizar deber� ser
siempre una rutina que nos d� (al inicio del programa) las direcciones
de esos bytes de "Data", "Status" y "Control". A continuaci�n se muestra
una funci�n (s�, en Pascal) para realizar esta operaci�n.
Function Investiga_Direcciones (Puerto:Byte; Var Data, Status,
Control:Word):Boolean;
Begin
Data := MemW [$0040:(8+2*Puerto)];
Status := Data + 1;
Control := Status + 1;
If (Data <> 0) Then Investiga_Direcciones:= TRUE; { S� se consiguieron
los datos }
Else Investiga_Direcciones:= FALSE; { No se detect� el puerto pedido }
End;
Como datos de entrada, esta funci�n recibe el n�mero de puerto del que
se desea conocer las direcciones. NOTA: Los puertos se numeran partiendo
del cero. Si yo quiero saber las direcciones del �nico puerto paralelo
de una computadora, deber� llamar a la funci�n pidi�ndole los datos del
puerto cero. Si se tienen dos puertos paralelos, el primero ser� el
puerto cero, el segundo ser� el puerto uno, y as� sucesivamente. A
los puertos paralelos generalmente se les nombra con las letras "LPT"
m�s el n�mero que le corresponda: "LPT0", "LPT1", "LPT2", etc...
Si no existe el n�mero de puerto pedido, la rutina regresar� un "FALSE".
En caso de s� existir, regresar� un "TRUE" junto con la direcci�n de los
bytes correspondientes. De ahora en adelante, cada vez que se desee leer
(o escribir) a un grupo de pines particulares del puerto, se utilizar�
la direcci�n del byte correspondiente, como se muestra:
Port [Data] := Variable; { Manda el byte de "Data" }
Variable:= Port [Status]; { Lee el byte de "Status" }
Port [ Control ] := Variable; { Manda el byte de "Control" }
Se debe tener cuidado con la lectura del byte de "Status". Recu�rdese
que siempre se tendr� basura en los tres bits menos significativos,
puesto que no se utilizan. Esto se soluciona f�cilmente mediante un
filtrado l�gico inmediatamente despu�s de la lectura: haciendo un AND
de la variable con el n�mero binario 11111000.
Adem�s, t�mese en cuenta que los bits de ERROR y de ACK se leen INVERTIDOS.
Es decir, si alg�n aparato pone 5 volts en la patita del bit de ACK del
puerto paralelo, nuestra rutina leer� un cero en ese bit, y si el aparato
pone esa patita a tierra (cero volts) la rutina leer� un "uno".
Hardware adicional.
Otro punto importante a considerar cuando se realicen proyectos
electr�nicos que involucren este puerto, es el hecho de que el puerto
paralelo (el est�ndar) tiene muy poca capacidad de corriente, aunque
sus voltajes son perfectamente compatibles con TTL. Debido a esto,
siempre es conveniente colocar un buffer a la salida del puerto para
darle fuerza a la se�al. Puedes usar, por ejemplo, el circuito
integrado 74244, pero cualquier otro buffer puede servir.
|