PDF de programación - Indiciándose en la Programación y simulación con el Puerto Paralelo

Imágen de pdf Indiciándose en la Programación y simulación con el Puerto Paralelo

Indiciándose en la Programación y simulación con el Puerto Paralelográfica de visualizaciones

Actualizado el 14 de Julio del 2017 (Publicado el 14 de Enero del 2017)
864 visualizaciones desde el 14 de Enero del 2017
269,6 KB
10 paginas
Creado hace 19a (30/10/2004)
Indiciándose en la Programación y simulación con el Puerto Paralelo

Comenzando con el Puerto Paralelo

Uso, Aplicación y Simulación

Descripción:
Bueno, este es el primer tutorial que escribo de cómo usar el Puerto Paralelo. En
casi todas las Pc’s que conozco hay un solo puerto y tiene como Registro Base 378H
(Así q por ahora lo tomaré como un Standard). Para poder acceder al Puerto, se
usaría fácilmente en C o en Asm Inxx(Port) y Outxx(Port,Dato). Pero actualmente
los sistemas operativos son mezquinos así q para poder acceder a ellos debemos
hacerlo mediante Drivers. (ver Aquí)
Pero para no preocuparnos por eso. Yo voy a usar la DLL InpOut32.Dll que
mediante 2 rutinas Inp32 y Out32, Resuelve el problema.
Además aquí voy a usar 3 tipos de codificación: Assembler, C++ y Visual Basic.

TERMINOLOGIA:
A lo largo de este tutorial, voy a ser uso de ciertos términos que considero que
seria muy bueno que se conocieran antes.
Bit ‘1’ : Significa que la salida de esta puerta es 5V.
Bit ‘0’ : Significa que la salida es 0v.
Bit ‘X’ : Significa que no importa el valor de este bit, puede ser ‘1’ o ‘0’
Bit ‘~X’
Registro: Arreglos de 8 Bits, que sirven para la configuración del Puerto Paralelo

Un Poco de Teoría.
Algo de Logica: And, Or, Xor:
Para comenzar, Estas operaciones son muy importantes, ya que nos permiten el
manejo del Puerto, cambiar Bits, invertirlos, enmascaralos. Como se vera a
continuación:

And: Dato = Op1 And Op2 = Op1 & Op2
En pocas palabras, si Op2=’1’, no importa como sea Op1=’X’, la respuesta seria
Dato=’X’ ; Ahora si Op2=’0’ el dato=’0’
Es decir que si tenemos un Byte=(D7) (D6) (D5) (D4) (D3) (D2) (D1) (D0). Y
queremos quedarnos con el dato D7, D5, y D4. y que el resto sea ‘0’. Lo que
tendríamos que hacer es:

: Significa que este dato es negado.

Result=Byte And 10110000b;// Result = Byte & B0;

Y nos quedaria:


Byte =

0
Result = D7 0 D5 D4 0

D7 D6 D5 D4 D3 D2 D1 D0
0
1
0

0
0

0
0

0



1

1

Operador
& = And

//Muy interesante


Es decir que nos sirve para colocar los bits que deseamos a ‘0’


Yoel Ocmín

http://Yoelocmin.tk



http://proyectosfie.tk

FIE-UNMSM –Lima-Perú

1
[email protected]



Indiciándose en la Programación y simulación con el Puerto Paralelo

Or: Dato = Op1 Or Op2 = Op1 | Op2
En pocas palabras, si Op2=’1’ , no importa como sea Op1=’X’, la respuesta seria
Dato=’1’ ; Ahora si Op2=’0’ el dato=’X’
Es decir que si tenemos un Byte=(D7) (D6) (D5) (D4) (D3) (D2) (D1) (D0). Y
queremos que D7,D6, D4,D2 sean ‘1’ y el resto quede igual tendríamos que hacer:

Result=Byte or 11010100b;// Result= Byte | 0xD4

Y nos quedaría:


Byte =



Result =

D7 D6 D5 D4 D3 D2 D1 D0
1
1
0
1
1 D5 1 D3 1 D1 D0

0

1

0

1

0

Operador

| = or

//Muy interesante


Es decir, que mediante una Or podemos obligar a que la respuesta sea ‘1’.

Xor: Dato = Op1 Xor Op2 = Op1 ^ Op2
En pocas palabras, si Op2=’1’ , no importa como sea Op1=’X’, la respuesta seria
Dato=’~X’ ; Ahora si Op2=’0’ el dato=’X’. Es decir que invierte el Bit donde
encuentra Op=’1’
Es decir que si tenemos un Byte=(D7) (D6) (D5) (D4) (D3) (D2) (D1) (D0). Y
queremos invertir D7, D5, y D4. lo que tendríamos que hacer es:

Result = Byte Xor 10110000b;// Result = Byte ^ B0

Y nos quedaria:


Byte =

D7 D6 D5 D4 D3 D2 D1 D0
0
1
Result = ~D7 D6 ~D5 ~D4 D3 D2 D1 D0

1

0

1

0

0

0



Operador
^ =Xor

//Muy interesante


Es decir, nos permite invertir el Bit donde esta con ‘1’

Bueno, Espero que este claro lo de las operaciones lógicas. Si no revisen su libro de
principios de sistemas digitales. :D ;)

Aprendiendo como funciona mi Puerto Paralelo:
Aquí, no voy a redundar en los pines, es decir, no voy a detallar cuales son y su
numeración, por que de eso ya hay bastante en la Web, y ya he puerto información
en la sección Puertos de mi web.

Bueno, para manejar el puerto paralelo, hay q saber acerca de sus registros. Que
Son 3 Base, Estado y Control.

La dirección de la mayoría de Pc’s q conozco, esta en 378h. Aunque puede variar
dependiendo del SO q uses. Yo lo voy ha usar como un Estándar para este tutorial.



Yoel Ocmín

http://Yoelocmin.tk



http://proyectosfie.tk

FIE-UNMSM –Lima-Perú

2
[email protected]



Indiciándose en la Programación y simulación con el Puerto Paralelo

Descripción de Registros:

Registro de Datos. (Su dirección es 378h = Dirección Base).


D7 D6 D5 D4 D3 D2 D1 D0



Este registro es de 8 bits. Es por aquí q enviamos la información hacia el exterior.
Ejm Activamos un Led, un Relé, Motores DC, Motores a pasos.
Una Alarma. Lo q nos imaginemos. O también recibimos datos. Ejm: Señal de un
ADC para digitalizar una señal externa.
Por defecto, solo funciona como Salidas, pero es posible Hacerla funcionar como
entrada. Para esto hay q modificar en Bit 5 del Registro de Control.
Esto se explica mas abajo con mucho mas cuidado

Dependiendo del lenguaje de programación q uses, la sintaxis es :
Outxxx (378h,Dato).
Ejemplo en C++ Usando la Librería InpOut32.dll
#include "stdafx.h"
#include "Iostream.h"
//Definimos los prototipos de nuestras funciones
//Recuerdese q se debe agregar a la etapa de Link, el archivo InpOut32.lib
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);
void main(void)
{ short data;
data=Inp32(0x378);
cout<<"El Registro Estado es: "<<data<<"\n";
return; }

Ejemplo en Assembler – Para DOS
.model small
.code



end


Registro de Estado (Su dirección es 379h) (Dirección Base +1).


mov al,11111111b; Mandamos q todas las salidas sean ‘1’
mov dx,378h
in dx,al
mov ah,4ch
int 21h



~S7 S6 S5 S4 S3 X X X



Este registro es de solo Entradas, pero solo es de 5 Bits.
Donde:
~S7
X
Yoel Ocmín

http://Yoelocmin.tk

:Significa que este dato esta invertido.
:Significa que su valor es indeterminado.


http://proyectosfie.tk



FIE-UNMSM –Lima-Perú

3
[email protected]

Indiciándose en la Programación y simulación con el Puerto Paralelo

Para obtener el Valor Real de Este registro, tenemos que enmascarlo, Haciendo un
Xor con 128 o su equivalente 80h ó 0x80 para C o &H80 en Basic o en binario
10000000b , donde se observa q el bit a cambiar debe ser el 8vo. Y luego un And
por 248=0xF80=11111000b (En este ultimo se observa que los valores con los que
te debes quedar son los 5 ultimos).
Este Registro lo podemos usar por ejemplo para ver la entrada de sensores.
Donde para obtener el valor Real su Sintaxis seria:
Estado = Inxxx(379H) Xor 0x80 And 0xF8.

En C: Estado = (Inp32(0x379) ^ 0x80) & 0xF8

Ejemplo en C para obtener: Valor Real del Registro de Datos
#include "stdafx.h"
#include "Iostream.h"
//observar que se debe agregar al Link el archivo InpOut32.lib
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);
void main(void)
{ short estado;
estado=Inp32(0x379);
//Este codigo es el Equivalente en Asm para
// Estado = (Inp32(0x379) ^ 0x80) & 0xF8
_asm xor estado,10000000b
_asm and estado,0xF8
cout<<"El Registro Estado es: "<<estado<<"\n";
return; }


Registro de Control. (37Ah) (Dirección Base +2)

Este registro, es bidireccional. Sus datos son



X X X X ~C3 C2 C1 C0



Ahora para invertir las señales C3, C1 y C0
Tenemos que hacerle un xor con 00001011b y para quedarnos con el dato valido, le
hacemos un And con 0xF=00001111b
Ejm:
control = (Outxx(37AH) Xor 1011b ) And 0xF.
En C: control = (Out32(37AH) ^0x0B ) & 0xF.

Este Registro es muy importante, ya nos permite colocar al puerto paralelo en
modo Bidireccional. Es decir se puede tambien recibir datos por el Registro de
Datos. Por ahora siempre lo mandare a 0, es decir q sea Salida. Pero si quisiera
hacerlo entrada, tendría q colocar el Bit5 equivalente a C5 en ‘1’.
La Sintaxis para hacerlo Bidireccional es:

Int Caso=1 o 0 ;Según quiera 1=Input, 0=Output

control= Outxx(0x37A,((caso <<5) or (Inxxx(0x37A) And 11011111)

En C: control =Out32(0x37A,((caso<<5) | (Inp32(0x37A) & 0xDF
Con caso<<5, significa rotamos 5 veces a la Izq a caso .
Yoel Ocmín

http://Yoelocmin.tk


http://proyectosfie.tk



FIE-UNMSM –Lima-Perú

4
[email protected]



Indiciándose en la Programación y simulación con el Puerto Paralelo

//Ejemplo en C para Obtener el Valor, que tiene el Registro de Control.
#include "stdafx.h"
#include "Iostream.h"
//observar que se debe agregar al Link el archivo InpOut32.lib
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);
void main(void)
{
short control;
control=Inp32(0x37A);
//El codigo que viene es Equivalente
// control = (Out32(37AH) ^0x0B ) & 0xF
_asm xor control,1011b
_asm and control,0xF //Para Quedarnos con los 4 Primeros Bits
cout<<"El Registro Control es: "<<control<<"\n";
return;
}

Prueba del Puerto de cómo hacerlo Bidireccional, este programa te mostrara
como queda el control si lo pones en modo Bidireccional. No hace el cambio por
obvios motivos. Pero si lo quieres probar, al final coloca Out32(0x37A,control);
Y ya estara en modo Bidireccional:
// bidire.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Iostream.h"
//observar que se debe agregar al Link el archivo InpOut32.lib
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);
void main(void)
{
short caso,control;
caso=1;//Suponiendo q lo quiero hacer Bidireccional
// Dato= Outxx(0x37A,((caso <<5) or (Inxxx(0x37A) And 11011111)
control=Inp32(0x37A);
cout<<"Tenemos en Control: "<<control<<"\n";
_asm and control,11011111b
_asm rol caso,5 //caso=caso>>5; //Roto caso 5 bits
_asm mov ax,caso //control =control or caso
_asm or control,ax
cout<<"Lo que enviariamos seria: "<<control<<"\
  • Links de descarga
http://lwp-l.com/pdf658

Comentarios de: Indiciándose en la Programación y simulación con el Puerto Paralelo (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad