12.10. - EL PUERTO DE LA IMPRESORA.

     La impresora se controla desde el DOS referenciándola como dispositivo LPT1 (PRN) ó LPT2. La BIOS utiliza la INT 17h para los servicios de impresora. En ambos casos, el funcionamiento es realmente trivial y la dificultad estriba en el modelo de impresora que se trate (IBM, Epson, HP-III, PostScript, etc.) de cara al lenguaje que soporta. Eso no lo trataremos aquí, ya que todas las impresoras vienen acompañadas de un manual técnico de programación (o en su defecto se puede adquirir opcionalmente). Lo que veremos a continuación son los registros a bajo nivel del puerto paralelo, así como pistas para una utilización algo más allá de la impresora: la comunicación entre ordenadores.

12.10.1. - LOS REGISTROS DEL PUERTO PARALELO.

     La dirección base del puerto paralelo en los ordenadores compatibles depende del tipo de adaptador que incorporen. Las primeras máquinas traían un puerto paralelo en el adaptador de vídeo monocromo, cuya dirección base es 3BCh. Sin embargo, otros adaptadores utilizan la dirección base 378h para LPT1 y 278h para LPT2. Por fortuna, la BIOS tiene en el área de datos una tabla con las direcciones base de los 4 posibles puertos paralelos. Dicha tabla comienza en 40h:8 y consta de 1 palabra por puerto (a 0 si ese puerto no existe). La asignación que realizan diversas BIOS puede ser un tanto discutible, pero si el usuario no ve salir los datos por la impresora que desea, siempre puede cambiar los cables o configurar su programa...

     Los registros de que consta el puerto paralelo son 3: el primero es el registro de datos, de 8 bits, ubicado en la dirección base (3BCh, 378h, 278h, etc.). Este registro es de sólo escritura, para enviar los caracteres a la impresora. El siguiente registro, de sólo lectura, es el registro de estado, inmediatamente a continuación del anterior (3BDh, 379h, 279h). Finalmente, tras ellos hay un registro de sólo escritura, el registro de control (en 3BEh, 37Ah, 27Ah). Aunque en los tres casos he indicado la dirección, hay que tener en cuenta que lo correcto es consultar la variable de la BIOS y tomarla como punto de partida.

     Los registros de estado y control están asociados a unas líneas físicas del puerto paralelo estándar, y poseen un significado concreto que resumimos a continuación. En el valor pin se hace referencia al pin del puerto paralelo del ordenador y al correspondiente en la impresora (ordenador/impresora). Las líneas o pines que no aparecen aquí son las de datos (líneas 2 a la 9, conectadas también con las líneas 2 a la 9 del lado de la impresora; las restantes están a masa).

  • Registro de estado:
    - Bits 0-2:no utilizados.
    - Bit 3:pin 15/32 (-ERROR). A 0 si hay un error gordo (a revisar los cables).
    - Bit 4:pin 13/13 (SLCT). A 1 si la impresora está ON LINE.
    - Bit 5:pin 12/12 (PE). A 1 si la impresora no tiene papel (PAPER ERROR).
    - Bit 6:pin 10/10 (-ACK). A 0 si la impresora confirma la recepción del carácter.
    - Bit 7:pin 11/11 (-BUSY). A 0 si la impresora está ocupada.

  • Registro de control:
    - Bit 0:pin 1/1 (-STROBE). A 0 si hay un carácter en el registro de datos.
    - Bit 1:pin 14/14 (-AUTO FEED). A 1 si la impresora debe saltar línea tras cada código 13 (CR).
    - Bit 2:pin 16/31 (-INIT). A 0 para resetear la impresora.
    - Bit 3:pin 17/36 (SLCT IN). A 1 para seleccionar la impresora (0 para OFF-LINE).
    - Bit 4:no conectado al puerto de impresora. A 1 activa la interrupción de la impresora.
    - Bits 5-7:no utilizados.

         La posibilidad de emplear interrupciones es realmente interesante: cuando la señal -ACK se pone a nivel 0 (esto es, se activa) viene una IRQ7 ó una IRQ5 (según cómo esté configurada la tarjeta). De todos modos, habrá que mandar primero un carácter por el método tradicional para iniciar la transmisión. La BIOS, sin embargo, no utiliza la interrupción de la impresora.

    12.10.2. - ENVÍO DE CARACTERES.

         Ante todo dejar claro que cuando digamos 0 ó 1 nos referimos al valor del bit en el registro del PC, olvidando ya cuestiones como el nivel al que son activas las señales, para evitar lios: los nombres de las señales les tomaremos como referencia, sin considerar su polaridad. Para enviar un carácter, primero se le coloca en el registro de datos. A continuación se pone a 0 en el registro de control el bit de STROBE. Este bit debe estar muy poco tiempo activo, para evitar que la impresora lea dos veces el mismo carácter (del orden de un microsegundo). Como la impresora no tiene una capacidad de aguante ilimitada, se puede defender poniendo el bit de BUSY en el registro de estado a 0 para poder leer con tranquilidad el STROBE que le llega. Cuando lo haya leído, pondrá un 0 en ACK para indicar que ya ha recibido el carácter.

         Este es el esquema básico del envío de caracteres. Sin embargo, hay que tener en cuenta que la impresora puede devolver ciertas condiciones de error, tanto leves (falta de papel) como más graves, como el caso de ERROR. También el ordenador puede provocar ciertos efectos en la impresora, a través del registro de control, como vimos anteriormente. Quizá el más curioso es el del AUTO FEED: ya se podían haber puesto de acuerdo el primer día, resulta triste que además de perder horas configurando impresoras y programas, hasta el propio puerto pueda meter las narices en el control del salto de línea...

    12.10.3. - CABLE NULL-MODEM PARA CONECTAR DOS ORDENADORES.

         Anteriormente hemos visto una descripción de patillas del puerto paralelo suficiente para que cualquiera se pueda construir su propio cable centronics. De todas formas, estos cables afortunadamente se venden ya construidos por un precio poco aceptable. Los que no se venden, aunque sí acompañan a ciertas aplicaciones software e incluso hardware (como disqueteras externas vía puerto de impresora) permiten una comunicación bidireccional. El truco consiste en utilizar las líneas del registro de estado para recibir datos, aunque esto limita la transferencia a 5 bits (realmente 4, más otro para el protocolo de transferencia).

         Se toman dos conectores centronic 25-pin machos. Se unen los pins de la siguiente forma:

         El motivo de emplear esta asignación y no otra se debe a que es la ya utilizada por ciertas aplicaciones comerciales, como LAPLINK. Es por razones de compatibilidad, para que no pase como con los saltos de línea. La línea común (18) es masa, aunque valdría cualquier patilla entre la 18 y la 25; si se emplea un cable de 10 hilos más malla, esta última es la más adecuada para hacer de masa.

         Con este cable, para enviar datos se utilizan las líneas D0 a D4 del registro de datos y para recibirlos las 5 líneas útiles del registro de estado. Como D0-D1-D2-D3-D4 están conectados en este mismo orden a ERROR-SLCT-PE-ACK-BUSY, lo ideal es utilizar D0-D3 para transmitir datos y ERROR-SLCT-PE-ACK para recibirlos. Las señales BUSY y D4 sirven para establecer el protocolo de transmisión. La transferencia puede ser bidireccional y además de forma simultánea. En realidad, cuando se mande un dato y el ordenador remoto indique con BUSY que ya lo tiene (a través de su línea D4), de paso nos puede haber reenviado el dato en D0-D3 para que veamos si es correcto: un control de errores bastante fiable y rápido. Sin embargo, se podría aprovechar quizá para enviar otro medio byte en sentido contrario en el caso de que las dos máquinas se estén pasando información simultáneamente la una a la otra; el control de errores ya se haría de otra manera, a nivel de bloques con checksum, etc. Conviene aprovechar y mandar otros 4 bits de datos cada vez que se envía un reconocimiento (al informar al receptor de que ya se ha recibido su señal de "dato recibido"), lo que permite transferir un byte completo en cada ciclo del protocolo de transferencia. Ah, no hay que olvidar la polaridad de las líneas: al poner un 0 en D4 aparece un 1 en el -BUSY del otro extremo...

         Si el cable no rebasa los 3 metros o poco más la transmisión será fiable, y además bastante rápida: 4 bits en paralelo, a la velocidad que pueda alcanzar la CPU del ordenador más lento. No emplear el ensamblador sería un acto imperdonable.

  • Volver al Índice