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:

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:

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.
CONTROL IRQEN
-
--
Flag que habilita o inhibe la generación de la interrupción IRQ7 cuando se activa la señal ACK#.
  SELECT#
S
17
Activa a nivel bajo. Indica a la impresora que se ha seleccionado la impresora.
  INIT#
S
16
A nivel bajo, envía un RESET a la impresora.
  AUTOFD#
S
14
A nivel bajo, la impresora se encarga de hacer un salto de línea al recibir el carácter "retorno de carro".
  STROBE#
S
1
Validación de datos. Cuando la impresora detecta un nivel bajo, acepta el dato.

El carácter # indica que la señal es activa a nivel bajo

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

Direcciones útiles en Internet:

http://www.doc.ic.ac.uk/~ih/doc/par/ : Interfacing to the IBM-PC Parallel Printer Port. Información general. Bastantes ejemplos de control de periféricos a través del puerto paralelo.

http://www.nmsu.edu/Academic_Progs/Colleges/Engineering/ET/public_html/ETTI/review/phajun96/PRINTER.HTM: Use of a PC Printer Port for Control and Data Acquisition. Muy completo. Ejemplos en C. Manejo de la interrupción del puerto paralelo.

http://www.sandybay.com/pc-web/parallel_port.htm: Es una página de likns relacionados todos con el puerto paralelo.

http://www.lvr.com/parport.htm: Parallel Port Central. Colección de ficheros y links acerca del puerto paralelo del PC, incluyendo los modos ECP, EPP, bidireccional y IEEE-1284.

http://www.fapo.com/1284int.htm/: Colección de ficheros acerca del puerto paralelo del PC, incluyendo los modos SPP,ECP, EPP, bidireccional y IEEE-1284. Protocolo de impresión.