El Puerto Paralelo del PC

 

Introducción

Hace años, IBM diseñó el puerto paralelo para manejar impresoras desde su gama de microcomputadores PC/XT/AT. Un conector estándar macho de 25 pines aparecía en la parte trasera del PC con el solo propósito de servir de interfaz con la impresora. El sistema operativo DOS cargado en dichos PC soporta hasta tres puertos paralelos asignados a los identificadores LPT1, LPT2 y LPT3, y cada puerto requiere tres direcciones consecutivas del espacio de E/S (entrada-salida) del procesador para seleccionar todas sus posibilidades.

Desde el punto de vista del hardware, el puerto consta de un conector hembra DB25 con doce salidas latch (poseen memoria/buffer intermedio) y cinco entradas, con ocho líneas de tierra.

Desde el punto de vista del software, el puerto paralelo consta de tres registros (datos, estado y control) de 8 bits cada uno, que ocupan tres direcciones de E/S (I/O) consecutivas de la arquitectura x86.

La función normal del puerto consiste en transferir datos a una impresora mediante 8 líneas de salida de datos, usando las señales restantes como control de flujo. Sin embrago, puede ser usado como un puerto E/S de propósito general por cualquier dispositivo o aplicación que se ajuste a sus posibilidades de entrada/salida.

Volver al principio de página

 

Descripción del conector físico

La conexión del puerto paralelo al mundo exterior se realiza mediante un conector hembra DB25. Observando el conector de frente y con la parte que tiene mayor número de pines hacia arriba, se numera de derecha a izquierda y de arriba a abajo, del 1 al 13 (arriba) y del 14 al 25 (abajo).

En este conector:

En la siguiente tabla se detallan la nomenclatura y descripción de cada línea. La columna "Centronics pin" se refiere a las líneas del conector tipo Centronics usado en las impresoras. La columna E/S se refiere al dato visto desde el lado del PC.

DB25
pin
Centronics
pin
Tipo
(E/S)
Señal Descripción
1 1 S Strobe Si está bajo más de 0.5 µs, habilita a la impresora para que reciba los datos enviados.
2 2 S D0 Bit 0 de datos, bit menos significativo (LSB)
3 3 S D1 Bit 1 de datos
4 4 S D2 Bit 2 de datos
5 5 S D3 Bit 3 de datos
6 6 S D4 Bit 4 de datos
7 7 S D5 Bit 5 de datos
8 8 S D6 Bit 6 de datos
9 9 S D7 Bit 7 de datos, bit más significativo (MSB)
10 10 E Ack Un pulso bajo de ~11µs indica que se han recibido datos en la impresora y que la misma está preparada para recibir más datos.
11 11 E Busy En alto indica que la impresora está ocupada.
12 12 E PaperEnd En alto indica que no hay papel.
13 13 E SelectIn En alto para impresora seleccionada.
14 14 S AutoFeed Si está bajo, el papel se mueve una línea tras la impresión.
15 32 E Error En bajo indica error (no hay papel, está fuera de línea, error no det.).
16 31 S Init Si se envía un pulso en bajo > 50 µs la impresora se reinicia.
17 36 S Select En bajo selecciona impresora (en gral. no se usa, ya que SelectIn se fija a alto).
18-25 19-30,33   GND Masa retorno del par trenzado.
18-25 16     Masa lógica
18-25 17     Masa chasis

El nombre de cada señal corresponde a la misión que cumple cada línea con relación a la impresora, el periférico para el que fue diseñado el puerto paralelo. Las señales activas a nivel bajo aparecen con la barra de negación (por ejemplo, Strobe). Cuando se indica alto o bajo se refiere a la tensión en el pin del conector. Alto equivale a ~5V en TTL y bajo a ~0V en TTL.

Volver al principio de página

 

Acceso al puerto

El puerto paralelo se identifica por su dirección de E/S (entrada/salida, I/O) base y se reconoce en sistemas MS-DOS por el número LPT (lp en Unix/Linux). Cuando arranca la máquina, la BIOS (Basic Input Output System) chequea direcciones específicas de E/S en busca de puertos paralelos y construye una tabla de las direcciones halladas en la posición de memoria 40h:8h (o 0h:0408h) (véase direccionamiento segmentado).

Esta tabla contiene hasta tres palabras de 16 bits, cada palabra con el byte bajo primero seguido por el byte alto. Cada palabra es la dirección de E/S base del puerto paralelo (que denominaremos LPT_BASE en lo sucesivo). La primera corresponde a LPT1, la segunda a LPT2 y la tercera a LPT3. Hay que agregar que, en MS-DOS tenemos el dispositivo PRN que es un alias a uno de los dispositivos LPT (generalmente es LPT1, pero se puede cambiar con la orden MODE).

Las direcciones base estándar para los puertos paralelos son:

chequeadas en este orden.

La siguiente tabla muestra, como ejemplo, la memoria en un PC con dos puertos paralelo instalados en las direcciones hexadecimales 378 y 278.

 

Identificador DOS Dirección Byte bajo Byte alto Hexadecimal Decimal
LPT1 0000:0408/9 78 03 378 888
LPT2 0000:040A/B 78 02 278 632
LPT3 (no instalado) 0000:040C/D 00 00 0 0

Volver al principio de página

 

Registros

El puerto paralelo estándar (SPP) consta, como se mencionó antes, de tres registros de 8 bits localizados en direcciones adyacentes del espacio de E/S del PC. Los registros se definen relativos a la dirección de E/S base (LPT_BASE) y son:

 

REGISTROS

Nombre habitual

DATOS ESTADO CONTROL
DIRECCIÓN
E/S
Puerto 378h 379h 37Ah LPT1
Puerto 278h 279h 27Ah LPT2
Puerto 3BCh 3BDh 3BEh MDA con p. paralelo

Se hará referencia a cada bit de los registros como una inicial que identifica el registro seguido de un número que identifica el número de bit, siendo 0 el LSB (bit menos significativo) y 7 el MSB (bit más significativo). Por ejemplo, D0 es el bit 0 del reg. de datos, S7 es el bit 7 del reg. de estado y C2 es el bit 2 del reg. de control.

Se indican con una barra de negación los bits que utilizan lógica negativa. En lógica positiva un 1 lógico equivale a alto (~5 V TTL) y un 0 lógico a bajo (~0 V TTL). En lógica negativa 1 equivale a bajo (~0 V) y 0 equivale a alto (~5 V).

Es preciso no confundir la lógica que sigue el puerto con la lógica que mantiene la impresora. Por ejemplo, la impresora pone a alto Busy (pin 11) para indicar que está ocupada. Pero en realidad, al leer el registro de estado, Busy la interpretamos como 0 (puesto que el pin 11 se corresponde con S7). Es decir, es como si fuera activa en bajo (Busy).

 

Registro de datos (D)

El registro de estado se halla en LPT_BASE. Se puede leer y escribir. Escribir un dato en el registro causa que dicho dato aparezca en los pines 2 a 9 del conector del puerto. Al leer el registro, se lee el último dato escrito (NO lee el estado de los pines; para ello hay que usar un puerto bidireccional).

El estándar es que las salidas sean LS TTL (low schottky TTL), aunque las hay que son de tipo OC (colector abierto). La corriente que pueden entregar (modo source) es de 2,6 mA máximo y pueden absorber (modo sink) un máximo de 24 mA. n el puerto original de IBM hay condensadores de 2,2 nF a masa. Las tensiones para el nivel bajo son entre 0 y 0,8V y el nivel alto entre 2,4V y 5V.

Volver a registros

Registro de estado (S)

El registro de estado está en LPT_BASE+1. Es de sólo lectura (las escrituras serán ignoradas). La lectura da el estado de los cinco pines de entrada al momento de la lectura.

En la tabla siguiente los nombres de los pines se dejaron en inglés porque es como generalmente se identifican.

 

 La línea Busy tiene, generalmente, una resistencia de pull-up interna. El estándar es que sean entradas tipo LS TTL.

Volver a registros

Registro de control (C)

El registro de control se encuentra en LPT_BASE+2. Es de lectura/escritura.

Los cuatro bits inferiores son salidas. La lectura devuelve lo último que se escribió a dichos bits. Son TTL a colector abierto con resistencias de pull-up de 4.7 kW, por lo que un dispositivo externo puede forzar el estado de los pines sin dañar el driver. Esto permite utilizar estas cuatro líneas como entradas. Para ello, se ponen en alto las cuatro salidas (escribiendo 0100b, es decir, 4h, en LPT_BASE+2) lo que hace que las salidas "floten". Ahora, un dispositivo externo puede forzar a bajo alguna de las salidas con lo que, leyendo el puerto, sabemos si esto sucedió o no.

Es posible realizar esta técnica en salidas totem-pole (como D0-D7) pero no se recomienda su uso porque habría que tener un conocimiento preciso de la corriente, ya que se puede sobrecargar los transistores de salida y dañar el driver (especialmente en puertos integrados LSI).

Bit de puerto bidireccional (compatible PS/2)

El bit C5, está disponible sólo si se trata de un puerto bidireccional; en los puertos comunes no se utiliza, al igual que los bits C6 y C7. Si C5=1, el buffer de los datos de salida se pone en alta impedancia, "desconectando" dicho buffer de los pines 2 a 9 del conector del puerto (D0 a D7). Si se escribe al registro de datos, se escribe al buffer pero no a la salida. Esto permite que al leer el puerto, se lea el estado de las entradas y no lo que hay en buffer. Cuando C5=0 el puerto retorna al modo salida, su estado por defecto. 

En las computadoras IBM PS/2, para habilitar el puerto paralelo bidireccional, además de lo antes descrito, se debe poner a 1 el bit 7 del registro del puerto 102h (opciones de configuración).

En computadoras que no tengan puerto paralelo bidireccional compatible PS/2 hay que modificar uno o más bits de algún puerto específico correspondiente al chipset de la placa. A veces se habilita por el Setup o por jumper en la placa del puerto.

Bit de interrupción

En trabajos normales de impresión ni el BIOS ni el DOS hacen uso de la interrupción. El hecho de poseer una línea de interrupción que está conectada directamente al PIC (Programmable Interrupt Controller), lo hace muy útil para experimentación en data-loggers por ejemplo. El bit de interrupción está conectado al control de un buffer de tres estados. Cuando C4=1, se activa el buffer y su entrada, S6, se conecta a la línea IRQ (en general es IRQ7 o IRQ5). La lectura del bit, nos devuelve el estado del mismo (es decir si el buffer está en alta impedancia o no).

Se producirá una interrupción, cuando haya un flanco descendente en el pin correspondiente a S6. A continuación, se describen los pasos para poder utilizar interrupciones.

Volver a registros

 

Finalmente, se muestra una tabla que reúne las características hardware y software del puerto paralelo.

DB25
pin
Centronics
pin
Registro bit Tipo
(E/S)
Activo Señal Descripción
1 1 C0 Control 0 S bajo Strobe Si está bajo más de 0.5 µs, habilita a la impresora para que reciba los datos enviados.
2 2 DO Dato 0 S alto D0 Bit 0 de datos, bit menos significativo (LSB)
3 3 D1 Dato 1 S alto D1 Bit 1 de datos
4 4 D2 Dato 2 S alto D2 Bit 2 de datos
5 5 D3 Dato 3 S alto D3 Bit 3 de datos
6 6 D4 Dato 4 S alto D4 Bit 4 de datos
7 7 D5 Dato 5 S alto D5 Bit 5 de datos
8 8 D6 Dato 6 S alto D6 Bit 6 de datos
9 9 D7 Dato 7 S alto D7 Bit 7 de datos, bit más significativo (MSB)
10 10 S6
IRQ
Estado 6 E alto Ack Un pulso bajo de ~11µs indica que se han recibido datos en la impresora y que la misma está preparada para recibir más datos.
11 11 S7 Estado 7 E bajo Busy En alto indica que la impresora está ocupada.
12 12 S5 Estado 5 E alto PaperEnd En alto indica que no hay papel.
13 13 S4 Estado 4 E alto SelectIn En alto para impresora seleccionada.
14 14 C1 Control 1 S bajo AutoFeed Si está bajo, el papel se mueve una línea tras la impresión.
15 32 S3 Estado 3 E alto Error En bajo indica error (no hay papel, está fuera de línea, error no det.).
16 31 C2 Control 2 S alto Init Si se envía un pulso en bajo > 50 µs la impresora se reinicia.
17 36 C3 Control 3 S bajo Select En bajo selecciona impresora (en gral. no se usa, ya que SelectIn se fija a alto).
18-25 19-30,33         GND Masa retorno del par trenzado.
18-25 16           Masa lógica
18-25 17           Masa chasis

Volver al principio de página

 

Miscelánea

 

Protocolo del puerto con la impresora

El handshaking ("apretón de manos" o protocolo) es un conjunto de reglas que ambos extremos de un sistema de comunicación tienen que seguir para que la comunicación sea correcta. El puerto paralelo, usado con una impresora, transmite datos y transmite/recibe las señales de protocolo. Las principales son Strobe, Ack y Busy. La secuencia a seguir para enviar datos sería:

  1. Colocar el byte a enviar en el registro de datos.

  2. Verificar que la impresora no esté ocupada (Busy = bajo, S7 = 1).

  3. Indicarle a la impresora que acepte los datos (Strobe = bajo , C0 = 1, pulso >5us).

  4. En ese instante la impresora indica que está ocupada recibiendo los datos (Busy = alto, S7 = 0).

  5. Finalmente, la impresora envía un pulso de aceptación indicando que se recibieron los datos y que se puede volver al paso 1 (Ack = bajo, S6 = 0, pulso de entre 5 ms y 15 ms según impresora).

Las otras señales sirven para verificar el estado de la impresora (Error, PaperEnd), para reiniciarla (Init) y para configurarla (AutoFeed, Select).

En los nuevos puertos, estas señales adquieren otra función, a veces parecida y otras totalmente distintas.

 

Interrupciones con el puerto paralelo

En primer lugar, se debe habilitar el buffer que conecta la línea ACK con la línea IRQ. Esto lo hacemos poniendo a 1 el bit 4 del registro de control (LPT_BASE+2). Luego se debe preparar una ISR (Interrupt Service Routine) que atienda la interrupción recordando enviar la señal EOI (20h) al registro de control del PIC (puerto 20h) al salir de la rutina. La interrupción software corresponde a la número 0Dh para IRQ5 y 0Fh para IRQ7. Finalmente se habilita con 0 la interrupción IRQ5 (o IRQ7) escribiendo al bit 5 (o 7) del registro de interrupciones del PIC (puerto 21h).

Para desinstalar la ISR, se deshabilita la IRQ5 (o IRQ7) escribiendo un 1 al bit 5 (o 7) del registro de interrupciones del PIC (puerto 21h). Luego se hace que C4=0.

 

Velocidad

Un puerto paralelo ISA normal toma un ciclo-ISA para leer o escribir. En un sistema cuya velocidad de bus sea 1,3 Mhz, se puede decir que la lectura se puede hacer cada 1 ms (idealmente, ya que siempre existen otras instrucciones software, etc; En la práctica pueden ser desde 1.2 ms a 2 ms). Algunos puertos soportan un modo "turbo" que elimina los 3 estados de espera de la CPU, con lo que la velocidad de lectura/escritura del puerto se duplica (2,7 MHz).

Volver al principio de página

volver a Inicio