PUERTO PARALELO PC

    El puerto paralelo del PC, a diferencia de los puertos serie o USB, transmite los datos en paralelo mediante un bus de 8 líneas, además, posee una líneas de control del protocolo y del estado de la impresora, esto nos permite disponer de varias líneas digitales de entrada/ salida que podremos utilizar independientemente.

    Por claridad he dividido la página en los siguientes puntos:

 

DESCRIPCION FISICA DEL CONECTOR.

    El puerto paralelo del pc dispone de un conector subD de 25 pines hembra al que normalmente conectamos un cable Centronics de impresora que en un extremo tiene el conector SubD 25 pines macho y por el otro un conector Centronics de 36 pines. La asignación de pines, tanto en el conector D-25 como en el Centronics es la siguiente:

Pin Nº (D-25) Pin Nº(Centronics) Línea Puerto SPP Dirección Registro(bit)
1 1 -Strobe Entrada/ Salida Control(0)
2 2 D0 Salida Datos(0)
3 3 D1 Salida Datos(1)
4 4 D2 Salida Datos(2)
5 5 D3 Salida Datos(3)
6 6 D4 Salida Datos(4)
7 7 D5 Salida Datos(5)
8 8 D6 Salida Datos(6)
9 9 D7 Salida Datos(7)
10 10 -Ack Entrada Estado(6)
11 11 Busy Entrada Estado(7)
12 12 Paper-out Entrada Estado(5)
13 13 Select Entrada Estado(4)
14 14 -Auto-Linefeed Entrada/ Salida Control(1)
15 32 -Error Entrada Estado(3)
16 31 -Initialize Entrada/ Salida Control(2)
17 36 -SelecPrinter Entrada/ Salida Control(3)
18-25 19-30 GND    

 

ACCESO A LOS PUERTOS.

    Para el control de estas líneas utilizamos tres puertos que están direccionados según la siguiente tabla:

Puerto Dirección LPT1 Dirección LPT2
Datos 378H 278H
Estado 379H 279H
Control 37AH 27AH

    Con estas dos tablas podemos modificar o leer cualquiera de las líneas del puerto paralelo mediante el uso de las instrucciones de acceso a puerto, para C++ estas son outportb e inportb, para Delphi no hay, por lo que tendrás que usar los dos procedimientos siguientes:

// Envia el valor almacenado en num a puerto.
Procedure EnviaByte(puerto:word;num:Byte);
    begin
        asm
            Mov DX,puerto
            Mov AL,num
            Out DX,AL
        end;
    end;


// Lee el valor actual de puerto.
Function RecibeByte(puerto:word):Byte;
    begin
        asm
            Mov DX,puerto
            IN Al,DX
            Mov @Result,Al
        end;
    end;

 

EJEMPLO.

    En este apartado vamos a estudiar distintas formas de conectar el puerto paralelo a diversos dispositivos de una forma muy sencilla.

    Para trabajar con el puerto paralelo, lo primero que tienes que hacer, es comprobar que la configuración de la BIOS este modo SPP ( salvo que tengas algún dispositivo, que no sea una impresora, conectado al puerto paralelo que haya variado la configuración por defecto, el puerto estará en modo SPP)

    Primero necesitamos un cable centronics, preferiblemente con la carcasa desmontable ( como la de la foto ) para saber cada cable a que pin esta conectado, si no dispones de carcasa desmontable, puedes cortarle el conector y con el tester ir midiendo la continuidad para saber cada cable a que pin corresponde o comprar un conector centronics para enchufarlo al cable y disponer así del acceso a los pines.

    Como ejemplo de control con el puerto paralelo haremos un circuito muy simple que nos permitirá estudiar, tanto las funciones de entrada, como de salida. En las siguientes imágenes se puede ver los esquemas del circuito de entrada y del de salida y una foto del circuito en el que están integrados los dos esquemas .

    Como se aprecia en el esquema, el circuito utiliza una línea de salida ( D0 ) para encender/ apagar el diodo LED y utiliza una de las líneas de entrada ( Busy ) para leer el estado de un pulsador ( en el esquema también se utiliza la línea de salida D1 para poder alimentar la resistencia de pull-up del pulsador, esto lo hacemos para no tener que utilizar una fuente externa de 5v solo para alimentar dicha resistencia). Vamos a estudiar el esquema de control de la línea de salida y el de control de la línea de entrada por separado.

    Control de una línea de salida: Primero tenemos que determinar que línea del puerto paralelo vamos a utilizar. Como la señal es de salida, buscamos en la tabla superior una línea que sea de este tipo ( lo mejor es utilizar las líneas del bus mientras tengamos ), por ejemplo, utilizamos la línea D0 que corresponde al pin 2 del conector D-25. Cogemos esta línea y la conectamos a un diodo LED ( los LED tienen polaridad, si no lo pones en la posición correcta no se encenderá ) y este, a través de una resistencia para limitar la intensidad de 330 oh, lo conectaremos a GND que es el pin 18 del conector D-25 ( GND son de la línea 18 a la 25. Cojo la 18 por azar ).

    Una vez el circuito esta montado conectamos el cable al puerto paralelo y encendemos el PC.

    Mirando la tabla superior sabemos que D0 es el bit 0 del registro de Datos cuya dirección, según usemos lpt1 o lpt2, esta en la tabla de puertos. Si utilizamos lpt1, solo hace falta hacer outportb(0x378,1) o EnviaByte($378,1) para encender el Led y  outportb(0x378,0) o EnviaByte($378,0) para apagarlo desde un compilador de C, o Delphi.

    De la misma forma que hemos controlado este led podríamos controlar, por ejemplo, un micro relé, un transistor, un optoacoplador o cualquier tipo de dispositivo que se pueda controlar mediante una señal digital de tipo TTL con una corriente de salida máxima de 20mA ( este dato no es muy fiable aunque, en principio, la mayoría de los puertos paralelos pueden suministrar esta corriente por cada línea ).

    Detección del estado de una línea de entrada: Primero, como en el caso de la línea de salida, determinaremos que línea utilizaremos como señal de entrada, por lo que miraremos la  tabla superior y buscaremos una línea que sea de este tipo, por ejemplo Busy (esta línea tiene la peculiaridad de que esta internamente invertida por hardware, es decir, si conectamos 5v en esta señal leeremos un 0 en vez de un 1  y si conectamos la línea a GND leeremos un 1 en vez de un 0. En todas las demás líneas, esto no ocurre y 5v se lee como 1 y 0v se lee como 0). 

    Una vez el circuito esta montado conectamos el cable al puerto paralelo y encendemos el PC.

    Mirando la tabla superior sabemos que Busy es el bit 7 del registro de Estados cuya dirección, según usemos lpt1 o lpt2, esta en la tabla de puertos. Si utilizamos lpt1, solo hace falta crear una variable de tipo byte, por ejemplo, DatoEntrada y asignarle el  valor del puerto mediante las funciones  inportb(0x379) o RecibeByte($379) desde un compilador de C, o delphi. El estado del pulsador lo determinara el estado del bit 7 de la variable DatoEntrada.

    Programa de control: Como hemos visto para controlar las líneas utilizaremos un compilar de en un lenguaje de alto nivel (C++, VB, Delphi, etc..), lo mejor para que sea compatible con todas las versiones del windows ( ver drivers del puerto paralelo ), es utilizar un driver que nos permita el acceso a los puertos aunque estemos utilizando XP, NT o 2000, para ello descargaremos e instalaremos el driver WinIO ( ver sección drivers del puerto paralelo ) y copiaremos los ficheros WinIO.sys, WinIO.dll y WinIO.dvx ( ficheros del directorio "Release" ) en el mismo directorio que  nuestro exe. En nuestro programa tenemos que incluir las siguientes funciones:

    Solo con la inserción de estas dos llamas en nuestro programa podremos hacer llamadas a las funciones de acceso a puerto libremente.

    En el zip del driver vienen ejemplos de utilización en C++ y VB. En el siguiente link tienes los fuentes y el exe del programa de control del ejemplo anterior para delphi.

    Ejemplo de control del puerto paralelo en delphi ( *.zip).

    Aislamiento del PC: Para evitar que un fallo en el diseño de nuestro circuito pueda estropearnos el ordenador es muy importante aislar las líneas del puerto paralelo. La forma más inmediata de realizar esto es mediante el uso de un buffer de tipo 74LS244, pero si queremos un aislamiento mayor, aunque perdamos algo de prestaciones en velocidad de conmutación, utilizaremos optoacopladores. En la imagen siguiente hay un esquema de como quedaría un circuito optoacoplado para una línea de salida y otro para una línea de entrada.

 

DRIVERS DEL PUERTO PARALELO PARA WINDOWS NT, XP Y 2000.

    Si trabajas en windows 95/98 no encontrarás ningún problema en acceder a los puertos, pero si estas bajo window NT, XP o 2000 necesitarás un driver que habilite el acceso a puertos, Para solucionar este inconveniente te doy dos opciones:


Inicio de página  |  Pagina Principal

MCB es una empresa dedicada al desarrollo tecnológico.

© 2004-2007  www.mcbtec.com.