Sei sulla pagina 1di 4

GUIA DE USO DEL PUERTO PARALELO

Jesús Manuel Olivares Ceja


Apdo. Postal M-8799, Admon. Palacio Postal No. 1, C.P. 06002, México, D.F.
e-mail: jesuso@acm.org
México, D.F. 7 enero 1997, actualizado 23 abril 2000

INTRODUCCIÓN y la dirección del puerto paralelo se accesa


En muchas aplicaciones informáticas se requiere con:
de extraer y recibir señales a través del puerto Paralelo = *Direccion;
paralelo de una computadora, para aplicaciones
como robótica, control de aparatos, monitoreo de El puerto puede estar en direcciones
señales, etc. como 378h, 3BCh u otra que depende de la
Este trabajo explica como usar el puerto configuración particular de la PC. La
paralelo para enviar y recibir datos desde y hacia dirección de la variable Paralelo corresponde
una computadora personal (PC). con la salida del puerto, la de entrada es uno
más que la de salida. Esto es que si la de
salida es 378h, la de entrada de datos es
1 CARACTERÍSTICAS EN UNA PC DEL PUERTO 379h. En lenguaje C la dirección se escribe
PARALELO 0x378, donde 0x significa número en
En una computadora personal (PC), se hexadecimal.
tienen varios puertos que pueden funcionar Para enviar datos en lenguaje C se utiliza
como entrada, salida o entrada/salida. Cada la instrucción:
puerto físico puede tener varios puertos
lógicos asociados. Las funciones típicas en outportb(Paralelo, dato);
un puerto son: leer datos, enviar datos,
programar el puerto y conocer el estado del
por lo que un programa para enviar datos es:
puerto.
#include <dos.h>
El puerto paralelo de una PC (figura 1) void main(void)
utiliza los pines 2 al 9 como salida, del 10 al {
outportb(0x378, 1);
15 excepto el 14 como entrada y el 25 como }
tierra. Los otros pines se usan para
programar el puerto o conocer su estado, se para recibir datos se usa la instrucción:
sugiere no tocarlos si no sabe su uso.
dato = inportb(Paralelo + 1);

13 • 12• 11• 10• 9• 8• 7• 6• 5• 4• 3• 2• 1•


25• 24• 23• 22• 21• 20• 19• 18• 17• 16• 15• 14• 2 USO DEL PUERTO PARALELO
Los pines de salida dan un número binario
Figura 1. Pines del Puerto Paralelo de hasta ocho bits (figura 2).
PIN 9 8 7 6 5 4 3 2
La dirección del puerto de salida se puede
conocer usando el programa MSD del BIT 128 64 32 16 8 4 2 1
sistema operativo DOS® o leyendo la
dirección absoluta 408h, lo cual en lenguaje Figura 2. Pines de salida
C se hace declarando un apuntador a esa
dirección, como: En los pines de entrada dan un número
unsigned int far *Direccion = 0x408;
binario que se encuentra recorrido tres
posiciones a la izquierda (figura 3), como se
ve los pines no son consecutivos. Otra
observación es que el pin 11 tiene lógica printf("\nDIRECCION DE SALIDA: %x\n"
,Salida);
inversa (cuando recibe 1, reporta 0; cuando for( Valor = 0; Valor < 32; Valor++
recibe 0, reporta 1) por lo que debe )
considerarse esto. {
printf("Envio%d\n",Valor);
outportb(Salida ,Valor);
PIN 11 10 12 13 15 delay(1000);//ESPERA UN SEGUNDO
X X X }
BIT 128 64 32 16 8 4 2 1
}
Figura 5. Programa que envía números 0 al 31
Figura 3. Pines de entrada
Para comunicar dos PCs los pines de
La salida puede visualizarse utilizando un salida deben conectarse con los de entrada
conjunto de LEDs (diodos emisores de luz, (figura 6) de un DB25 con los de salida de
Light Emision Diode) (figura 4), los que otro DB25 y viceversa.
tienen una pata larga que es donde se
conecta la corriente y en la otra se conecta PIN DE PIN DE
la tierra. SALIDA ENTRADA
2 15
3 13
4 12
5 10
VCC GND
corriente tierra 6 11
25 25
Figura 4. Un LED
Figura 6. Interconexión de pines
Para probar la salida de señales se
pueden conectar la pata larga de LEDs en En una PC se ejecuta el programa de envío
cada pin de salida y la pata corta a tierra (pin de datos de la figura 5 y en la otra un
25). programa de recepción de datos como el
que se muestra en la figura 7, si se quiere
Se utiliza el programa de la figura 5 para enviar y recibir datos simultáneamente
generar los números del cero al 31 que se utilizar el programa de la figura 8, el cual
visualizarían en binario si se tuvieran 5 LEDs envía y recibe datos usando el bit más
conectados en los pines de salida, cada LED significativo (15 de entrada) para sincronizar
se enciende un segundo (ver el delay(1000) la recepción de datos, esto significa que
en el programa. Se pueden utilizar hasta 8 cada vez que se envía un dato cambia a
LEDs. cero o uno dependiendo de si antes tenia un
Se puede utilizar un cable con un conector uno o un cero; si tenia cero pone uno, si
macho DB25, o hacerlo soldando cable tenia uno pone cero para el dato siguiente.
telefónico en los pines de salida y en los
#include <stdio.h>
pines de entrada. #include <dos.h>
#include <stdio.h> #include <stdlib.h>
#include <dos.h>
unsigned int far *Donde = 0x408;
unsigned int far *Donde = 0x408; unsigned int Entrada ,Salida ;
unsigned int Entrada ,Salida; int Valor ;
int Valor ;
void main(void)
void main(void) {
{ int intento ,intentos ;
Salida = *Donde; unsigned int recibo ,corrido ;
char linea[50] ; if( (valor & 0x10) == 0x10 )
valor = valor & 0x0f;
printf("Intentos: "); else
gets(linea); valor += 0x10;
intentos = atof(linea); outportb(direccion ,valor);
Salida = *Donde; }
Entrada = Salida + 1; void main(void)
printf("\nENTRADA:%x DE SALIDA:%x\n" {
,Entrada ,Salida); int sigue ,esta ;
printf("Espero 5 segundos antes de unsigned tecla ,numero ;
recibir...");
delay(5000); Salida = *Donde;
printf("RECIBIENDO\n"); Entrada = Salida + 1;
for( intento = 0; intento < printf("Maquina A o B: ");
intentos; intento++ ) gets(Linea);
{ strupr(Linea);
recibo = inportb(Entrada); if( (strcmp(Linea ,"B") != 0) &&
corrido = recibo >> 3; (strcmp(Linea ,"A") != 0) )
Valor = corrido & 0x1F; {
printf("Recibí: %d [%x]\n",Valor printf("Maquina equivocada, debe
,Valor); ser A o B\n");
delay(1000);//ESPERA 1 SEGUNDO exit(0);
} }
} if( strcmp(Linea ,"A") == 0 )
Figura 7. Programa que recibe datos {
MascaraLee = 0x10;
MascaraEscribe = 0x8;
}
#include <stdio.h> if( strcmp(Linea ,"B") == 0 )
#include <dos.h> {
#include <stdlib.h> MascaraLee = 0x8;
#include <string.h> MascaraEscribe = 0x10;
#include <bios.h> }
#include <conio.h> printf("Espero 3 segundos antes de
conectarme...");
#define SI 1 delay(3000);
#define NO 0 printf("INICIO\nProtocolo de
#define ENTER 0x1c0d conexion...\n");
#define BKSPACE 0x0e08 esta = NO;
#define ESCAPE 0x011b while( esta == NO )
{
unsigned int far *Donde = if( bioskey(1) != 0 )
(unsigned int *)0x0408; {
unsigned int Entrada ,Salida ; tecla = bioskey(0);
int ValorSalida ,ValorEntrada ; if( tecla == ESCAPE )
char Linea[80] ; exit(0);
int ULinea ; }
unsigned int MascaraLee ,MascaraEscribe; outportb(Salida ,0x10);
unsigned int CapaLee ,CapaEscribe LeePuerto(Entrada
,CapaDato ; ,&ValorEntrada);
int Quiere ; if( ValorEntrada == 0x00 )
esta = SI;
void LeePuerto(unsigned direccion ,int }
*valor) printf("CONECTADO\n\n=");
{ sigue = SI;
unsigned int recibo ,corrido ; ValorEntrada = 0;
ValorSalida = 0;
recibo = inportb(direccion); while( sigue == SI )
corrido = recibo >> 3; {
*valor = corrido & 0x1F; if( bioskey(1) != 0 )
} {
void EnviaPuerto(unsigned direccion ,int tecla = bioskey(0);
valor) if( tecla == ESCAPE )
{ {
sigue = NO;
continue;
} 3 INSTRUCCIONES EN C++BUILDER
numero = (tecla & 0x00FF) -
(unsigned)'0'; La información anterior se ha presentado
®
Quiere = SI; para el sistema operativo DOS , para
®
} Windows 95, dado que el compilador
// SI PUEDE ESCRIBIR carece de outportb e inportb, aquí se indica
if( (ValorEntrada &
MascaraEscribe) == (ValorSalida & el código que las obtiene[Ocaña 1999]:
MascaraEscribe) ) void outportb(unsigned short puerto
{ ,unsigned char valor)
if( Quiere == SI ) {
{ _DX = puerto;
CapaLee = ValorSalida & _AL = valor;
MascaraLee; __emit__(0xEE);
CapaEscribe = }
(ValorSalida & MascaraEscribe) ==
MascaraEscribe ? 0 : MascaraEscribe; unsigned char inportb(unsigned short
CapaDato = numero & 0x3; puerto)
ValorSalida = CapaLee + {
CapaEscribe + CapaDato; _DX = puerto ;
EnviaPuerto(Salida __emit__(0xEC);
,ValorSalida); return _AL;
Quiere = NO; }
}
} CONCLUSIONES
// LEE EL PUERTO DE ENTRADA
LeePuerto(Entrada Se ha expuesto las características y uso del
,&ValorEntrada); puerto paralelo de una PC para enviar y
// REVISA SI QUIERE LEER TOMA EL recibir datos.
DATO Y DESPLEGALO
if( (ValorEntrada & MascaraLee) Los datos de salida pueden utilizarse para
!= (ValorSalida & MascaraLee) )
{
controlar el movimiento de motores en un
CapaDato = ValorEntrada & brazo robot, alguna grúa, etc. para controlar
0x3; el encendido y apagado de luces o aparatos
printf("%d ",CapaDato); u otras aplicaciones que el lector pueda
CapaLee = (ValorSalida &
MascaraLee) == MascaraLee ? 0 : idear. Para esto conviene utilizar un
MascaraLee; optoacoplador que aisla los circuitos de la
CapaEscribe = ValorSalida & computadora de los de potencia.
MascaraEscribe;
CapaDato = ValorSalida & Por la entrada se pueden recibir señales
0x3;
ValorSalida = CapaLee +
las que deben fijarse en 5V (cinco volts) para
CapaEscribe + CapaDato; el 1 y cero volts para el 0.
EnviaPuerto(Salida
,ValorSalida); REFERENCIAS BIBLIOGRAFICAS
} [Galindo 1996] Galindo Soria, Fernando, DE LA
} COMPUTACION A LA INFORMÁTICA PASANDO
printf("FIN.\n"); POR LA INTERACTIVIDAD, ESCOM-IPN, México,
} D.F., 1996
Figura 8. Envía y recibe con sincronía
[Galindo 1996] Galindo Soria, Fernando, USO Y
APLIACIONES DEL PUERTO PARALELO
(comunicación personal), Diciembre 1996
[Ocaña 1999] Ocaña Izquierdo, Karina, INSTRUCCIONES
PARA USAR EL PUERTO PARALELO EN
WINDOWS 95 (comunicación personal), Octubre,
1999

Potrebbero piacerti anche