Sie sind auf Seite 1von 8

El Puerto Paralelo del PC

Introduccin
El puerto paralelo se dise, en un principio, para manejar la impresora y es un conector estndar de 25 pines en la parte trasera del PC. El sistema operativo DOS cargado en el 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 lneas 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.

Descripcin del conector fsico


La conexin del puerto paralelo al exterior del PC se realiza mediante un conector hembra DB25. Observando el conector de frente y con la parte que tiene mayor nmero 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: y 8 lneas (pines) son para salida de datos (bits de DATOS). Sus valores son nicamente modificables a travs de software, y van del pin 2 (dato 0, D0) al pin 9 (dato 7, D7). y 5 lneas son de entrada de datos (bits de ESTADO), nicamente modificables a travs del hardware externo. Estos pines son: 11, 10, 12, 13 y 15, del ms al menos significativo. y 4 lneas son de control (bits de CONTROL), numerados del ms significativo al menos: 17, 16, 14 y 1. Habitualmente son salidas, aunque se pueden utilizar tambin como entradas y, por tanto, se pueden modificar tanto por software como por hardware. y las lneas de la 18 a la 25 son la tierra. En la siguiente tabla se detallan la nomenclatura y descripcin de cada lnea. La columna "Centronics pin" se refiere a las lneas del conector tipo Centronics usado en las impresoras. La columna E/S se refiere al dato visto desde el lado del PC.
DB25 Centronics pin pin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18-25 18-25 18-25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 32 31 36 19-30,33 16 17

Tipo (E/S)
S S S S S S S S S E E E E S E S S

Seal
Strobe D0 D1 D2 D3 D4 D5 D6 D7 Ack Busy PaperEnd SelectIn AutoFeed Error Init Select GND

Descripcin
Si est bajo ms de 0.5 s, habilita a la impresora para que reciba los datos enviados. Bit 0 de datos, bit menos significativo (LSB) Bit 1 de datos Bit 2 de datos Bit 3 de datos Bit 4 de datos Bit 5 de datos Bit 6 de datos Bit 7 de datos, bit ms significativo (MSB) Un pulso bajo de ~11s indica que se han recibido datos en la impresora y que la misma est preparada para recibir ms datos. En alto indica que la impresora est ocupada. En alto indica que no hay papel. En alto para impresora seleccionada. Si est bajo, el papel se mueve una lnea tras la impresin. En bajo indica error (no hay papel, est fuera de lnea, error no det.). Si se enva un pulso en bajo > 50 s la impresora se reinicia. En bajo selecciona impresora (en gral. no se usa, ya que SelectIn se fija a alto). Masa retorno del par trenzado. Masa lgica Masa chasis

El nombre de cada seal corresponde a la misin que cumple cada lnea con relacin a la impresora, el perifrico para el que fue diseado el puerto paralelo. Las seales activas a nivel bajo aparecen con la barra de negacin (por ejemplo, Strobe). Cuando se indica alto o bajo se refiere a la tensin en el pin del conector. Alto equivale a ~5V en TTL y bajo a ~0V en TTL.

Registros
El puerto paralelo estndar (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 direccin de E/S base (LPT_BASE) y son: y LPT_BASE + 0: registro de DATOS y LPT_BASE + 1: registro de ESTADO y LPT_BASE + 2: registro de CONTROL

REGISTROS DATOS ESTADO CONTROL DIRECCIN Puerto E/S Puerto


Puerto 378h 278h 3BCh 379h 279h 3BDh 37Ah 27Ah 3BEh

Nombre habitual
LPT1 LPT2 MDA con p. paralelo

Se har referencia a cada bit de los registros como una inicial que identifica el registro seguido de un nmero que identifica el nmero de bit, siendo 0 el LSB (bit menos significativo) y 7 el MSB (bit ms 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 negacin los bits que utilizan lgica negativa. En lgica positiva un 1 lgico equivale a alto (~5 V TTL) y un 0 lgico a bajo (~0 V TTL). En lgica negativa 1 equivale a bajo (~0 V) y 0 equivale a alto (~5 V).

Es preciso no confundir la lgica que sigue impresora. Por ejemplo, la impresora pone a ocupada. Pero en realidad, al leer el registro (puesto que el pin 11 se corresponde con S7). (Busy).

el puerto con la lgica que mantiene la alto Busy (pin 11) para indicar que est de estado, Busy la interpretamos como 0 Es decir, es como si fuera activa en bajo

Programacin bsica de la E/S en TurboC Para realizar el control de dispositivos mediante el puerto paralelo debemos hacer uso de las funciones de C que permiten acceder a los puertos hardware: y outp(dirpuerto,dato) enva un byte a direccin del puerto. y inp(dirpuerto) lee un byte de la direccin del puerto.
/*PORT01.C puerto estndar en la direccin 0x378*/ #include <stdio.h> #include <conio.h> main() { int dirport = 0x378; unsigned char byte; int i; byte=01;

for (i=0;i<=7;i++) { outp(dirport, byte); byte= byte<<1; getchar(); } } /*PPL01.C

puerto estndar en la direccin 0x378*/


#include <stdio.h> #include <conio.h> main() { int port = 0x378; unsigned char byte; int i; byte=00; outp(port, byte); for (i=0;i<=7;i++) { printf("Escribe en hexadecimal los leds a encender: "); scanf("%x",&byte); outp(port, byte); } }

/*PPL02.C*/ /*Lee el dato del registro de estado del puerto paralelo*/ #include <stdio.h> #include <conio.h> main() { int port = 0x379; unsigned char byte; int i;

for (i=0;i<=7;i++) { printf("Lee la combinacion binaria en hexadecimal: "); getchar(); byte=inp(port); printf("%x\n",byte); } }
/*PPL03.C*/ /*Lee el dato que ponemos en bianrio en los microinterruptores por el registro de estado del puerto paralelo*/ #include <stdio.h> #include <conio.h> main() { int port = 0x379; unsigned char byte; int i;

for (i=0;i<=7;i++) { printf("Lee la combinacion bianaria en hexadecimal: "); getchar(); byte=inp(port); byte=byte&0x78; byte=byte>>3; printf("%x\n",byte); } }

/*RETARDO2.C*/ /*Programa que explica las instrucciones para implementarun reatrdo de tiempo*/ #include <stdio.h> #include <dos.h> #include <time.h> main() { int seg=20; int retardo; clock_t Tinicio; printf("Introducir el retardo: "); scanf("%d",&retardo); /*Las siguientes instrucciones realizan un retardo. Recibe un entero como parmetro, que ser proporcional al retardo esperado. */ Tinicio=clock (); /*Recogemos la marca de tiempo del reloj del sistema. */ // BUCLE DE RETARDO. while( (clock() - Tinicio) < retardo*seg); printf("Final del bucle retardo\n"); }

/*PORT05.C*/ /*Aplicacion del retardo a recorrido de los led's*/ #include <stdio.h> #include <conio.h> #include <time.h> main() { int port = 0x378; unsigned char byte; int i,j; int ret; clock_t Tinicio; byte=01; ret=20; for (i=0;i<=6;i++) { outp(port, byte); byte= byte<<1; printf("i= %d\n",i); Tinicio=clock (); while( (clock() - Tinicio) < ret); } ret=60 for (j=0;j<=7;j++) { outp(port, byte); byte= byte>>1; printf("j= %d\n",j); Tinicio=clock (); while( (clock() - Tinicio) < ret); } }

/*SEMAF01.C*/ /*Programa que simula un semaforo utilizando el registro de datos del puerto paralelo*/ #include <stdio.h> #include <conio.h> #include <time.h> main() { int port = 0x378; unsigned char byte; int i,j; int ret; clock_t Tinicio; printf("Pulsar una tecla para terminar."); while(1) { byte=04; outp(port, byte); ret=200; Tinicio=clock (); while( (clock() - Tinicio) < ret); for(i=0;i<5;i++) { byte=02; outp(port, byte); ret=10; Tinicio=clock (); while( (clock() - Tinicio) < ret); byte=00; outp(port, byte); ret=10; Tinicio=clock (); while( (clock() - Tinicio) < ret); } byte=01; outp(port, byte); ret=200; Tinicio=clock (); while( (clock() - Tinicio) < ret); if (kbhit()) break; }

Das könnte Ihnen auch gefallen