Você está na página 1de 6

Tema 4.4 Programacin del puerto paralelo.

Los ordenadores PC han estandarizado un tipo de interfaz para la comunicacin con la impresora, conocida
normalmente como CENTRONICS. Esta interfaz es capaz de enviar caracteres a la impresora de forma paralelo.
Cada carcter est codificado en un byte, del cul cada bit se transmite por un terminal diferente. Existen otros
terminales que conectan ordenador e impresora, que sirven para intercambiar informacin de control y de
estado, a fin de implementar un sencillo protocolo.
Para realizar esta interfaz, los PCs disponen de unos elementos hardware especficos, denominados puertos de
impresora o tambin 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 tambin LPT4). Todos ellos son idnticos, 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 envan 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 slo 5 de los 8 bits.
Puerto de Control: Registro de 8 bits donde la CPU puede escribir diversas seales que reconoce la
impresora (validacin de datos, inicializacin, 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, estn 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 nmero
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 cunto 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

El puerto paralelo, utilizado en general para el control de la impresin, maneja las seales que se muestran en
la tabla siguiente. De todas ellas, las que normalmente intervienen en el protocolo de comunicacin entre el PC
y la impresora son BUSY y STROBE#. Algunas impresoras pueden no utilizar alguna de las seales descritas
en la tabla.

PUERTO

NOMBRE

Dir

Pin DB25

DESCRIPCIN

DATOS

D0..D7

2-9

8 terminales de datos. Desde D0 a D7.

ESTADO

BUSY

11

Un nivel alto indica que la impresora est ocupada y no


puede recibir datos nuevos. Tambin se pone a 1 en
situaciones de error.

ACK#

10

Un nivel bajo indica que la impresora ha recibido un


dato y est disponible para recibir uno nuevo.

PE

12

Un nivel alto indica que la impresora no tiene papel.

SLCT IN

13

Un nivel alto indica que la impresora est on-line.

ERROR#

15

Un nivel bajo indica que se ha producido un error en la


impresora. No hay papel, mal funcionamiento, etc.

IRQEN

--

Flag que habilita o inhibe la generacin de la


interrupcin IRQ7 cuando se activa la seal ACK#.

SELECT#

17

Activa a nivel bajo. Indica a la impresora que se ha


seleccionado la impresora.

INIT#

16

A nivel bajo, enva un RESET a la impresora.

AUTOFD#

14

A nivel bajo, la impresora se encarga de hacer un salto


de lnea al recibir el carcter "retorno de carro".

STROBE#

Validacin de datos. Cuando la impresora detecta un


nivel bajo, acepta el dato.

CONTROL

El carcter # indica que la seal es activa a nivel bajo.


El puerto de Datos
Generalmente es slo 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 seales presentes en el conector
DB25 del exterior es:
BIT

FUNCIN

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 lneas de interfaz con la impresora. La

seal BUSY es invertida antes de llegar al registro. La correspondencia entre los bits del registro de estado y las
seales presentes en el conector DB25 del exterior es:
BIT

FUNCIN

BUSY

ACK#

PE

SLCT

ERROR#

--

--

--

(inv.)

IN
Tabla 4

El puerto de Control
Es un puerto de salida destinado a la escritura de comandos sobre la impresora. Las seales SLCT#,
AUTOFD# y STROB# son invertidas antes de llegar a los correspondientes terminales de conector externo. El
bit 4 (IRQEN) no es una seal que corresponda a alguno de los terminales de la interfaz Centronics. Se trata de
un flag que habilita o prohibe la generacin de la interrupcin IRQ7 cuando se activa la seal ACK#. Las rutinas
del BIOS que se ocupan de la impresora no utilizan esta interrupcin. La correspondencia entre los bits del
registro de control y las seales presentes en el conector DB25 del exterior es:
BIT

FUNCIN

--

--

--

IRQEN

SELECT#

INIT#

AUTOFD#

STROBE#

(inv.)

(inv.)

(inv.)
Tabla 5

EL PUERTO DE IMPRESORA COMO CONTROL Y ADQUISICIN 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 seal desde un dispositivo de entrada y enva una seal 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, estn situadas en un mapa diferente de entrada/salida.
Todo lo descrito en el apartado anterior define el funcionamiento del manejo de la impresora, a travs 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 comunicacin con los puertos se utilizan las instrucciones IN y OUT de ensamblador.
IN transfiere informacin 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 informacin 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 propsito que nosotros decidamos, conociendo las direcciones que ocupan.
Recordar el significado de las seales marcadas con "(inv)". Esto quiere decir que estn invertida por hardware.
Es decir, si se ejecuta la instruccin
OUT 037AH, 0FFh
se estn poniendo a 1 todos los bits del registro del puerto de control, pero en el conector externo del puerto, el
DB25, aparecera un 1 slo en el pin 16 (INIT#), en los pines 1, 14 y 17 aparecera un cero (STROBE#,
AUTOFD# y SELECT respectivamente).
La distribucin de seales en los pines del conector de salida del PC (hembra) se muestran a continuacin:

Manejo de la interrupcin del puerto paralelo.


El bit 4 del puerto de control, segn la tabla 5, se denomina IRQEN. Este bit habilita o permite que se produzca
la interrupcin asociada a la entrada ACK#. Cuando este bit est a 1 y la seal ACK# pasa del nivel lgico 1 al
nivel 0 se produce una peticin de interrupcin, que es la IRQ7.
En el diseo original del PC, IBM reserv 8 interrupciones hardware, comenzando por la interrupcin 08h, para
expansin de interrupciones, que son comnmente conocidas como IRQ0 a IRQ7. As la IRQ0 se corresponde
con la interrupcin 08h, la IRQ1 con la 09h, etc. La IRQ7 se corresponde pues con la 0Fh, estando sus vectores
a partir de la direccin 0000:003Ch.

Para que una peticin de una IRQ llegue a la CPU, sta debe estar permitida, no enmascarada. El puerto 021h
est asociado con la mscara de interrupciones de las IRQ. Para habilitar una determinada interrupcin se
deber escribir un cero en la posicin correspondiente, sin modificar el resto. As, si lo que se quiere es permitir
la IRQ7 habr que poner a cero el bit ms significativo del puerto 021h, como muestra el cdigo siguiente:
in al,021h ; lee la mscara de las IRQ
and al, 01111111b ; impone un 0 en el bit ms significativo, IRQ7. No modifica el resto
out 021h, al ; escribe la mscara
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 interrupcin 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 slo queda por activar el bit que permite que la seal ACK# genere una peticin 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 slo se deben restablecer los vectores de interrupcin modificados, sino que
tambin se debe inhibir la IRQ7, dejando la mscara del puerto 021h como estaba.
Un programa que utilice la interrupcin del puerto paralelo puede tener esta estructura, en lo que se refiere al
manejo de dicha interrupcin:
Al comienzo:
modificar vectores de la interrupcin 0Fh (IRQ7)
permitir la interrupcin IRQ7, poner a 0 el bit 7 del puerto 021h
Durante la ejecucin, siempre que haga falta:
habilitar la interrupcin en el puerto de control, bit 4
repetir
procesar la interrupcin
escribir 020h en el puerto 020h
hasta que se deba inhibir
inhibir la interrupcin, 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 interrupcin anteriores

Bibliografa:
Los microprocesadores xx86 y la arquitectura del PC. Antonio Garca Guerra. Ed. Sistemas y Servicios de
Comunicacin. Madrid 1995.

Lenguaje ensamblador y programacin 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

Você também pode gostar