control de puertos paralelos con visual basic

Upload: roberto-salguero

Post on 07-Jul-2015

3.529 views

Category:

Documents


1 download

TRANSCRIPT

VISUAL BASIC

Curso Bsico

CONTROL DE PUERTOS DE COMPUTADORAUSANDO

LEONARDO MEJIA R.

VISUAL BASICUNIVERSIDAD DE PAMPLONA 2007

ING. EN MECATRONICA

VISUAL BASICPUERTO PARALELO 1. &H378 8 BIT INPUT/OUTPUT I / O = d 888 (A0 - A7) 2. &H37A 4 BIT I/O = d 890 (B0 - B3) 3. &H379 5 BIT INPUT = d 889 (C3 - C7)LEONARDO MEJIA R. ING. EN MECATRONICA

Curso Bsico

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASIC

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASIC

Curso Bsico

LIBRERIAS DE ENLACE DINAMICOBiblioteca de vnculos dinmicos. Para enviar y recibir datos al puerto v din paralelo de comunicaciones del computador es necesario disponer de un grupo de instrucciones en lenguaje assembler (ensamblador) los cuales suelen ) implementarse en una clase especial de archivos compilados denominados dll. dll. Dll es la sigla de biblioteca de vnculos dinmicos (dynamic link library). v dinmicos Es un archivo con extensin dll el cual contiene una o ms funciones que son compiladas, vinculadas y cargadas independientes al proceso que la ha invocado. Usualmente se guardan en el directorio Windows/System, de tal forma que el sistema conozca de antemano la ubicacin donde buscarla.LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPROGRAMA PARA CONTROL LPT

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPROGRAMA PARA CONTROL LPT

Curso Bsico

DECALRACION DE INSTRUCCIONES IO.DLL

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPROGRAMA PARA CONTROL LPT

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

VISUAL BASICPUERTO SERIAL

Curso Bsico

LEONARDO MEJIA R. ING. EN MECATRONICA

UNIVERSIDAD DE PAMPLONA 2007

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERA Y CIENCIAS SOCIALES Y ADMINISTRATIVAS INGENIERA EN INFORMTICA

Control Por Puerto Paralelo Con Visual BasicAntes que otra cosa, cabe aclarar que el objetivo de este articulo es implementar una interfaz en Visual Basic 6 para el manejo del puerto paralelo, ya que lidiar con el modo consola es engorroso, ademas de que en el curso de Aplicaciones De Adquisicin De Datos que se imparte a los alumnos de la Ingeniera En Informtica de la UPIICSA se ensea a programar el puerto paralelo con lenguaje C. El lenguaje C fue diseado para acceder al hardware de la computadora en forma directa, es por eso que cuenta con instrucciones para la comunicacin con los puertos a muy bajo nivel, algo que no ocurre en el caso de Visual Basic, sin embargo existen varios mecanismos para poder controlar el puerto paralelo desde VB, uno de ellos podria ser el generar un ejecutable de C para cada operacin especifica sobre el puerto, por ejemplo un ejecutable que encienda el bit 1 del paralelo, otro que lo apague, y as para cada bit del puerto, si bien esto no es lo ms apropiado, podriamos facilmente invocar al ejecutable desde VB utilizando la sentencia SHELL, por ejemplo, Shell enviar_un_1_al_bit_1.exe y as para cada operacin sobre los bits del puerto, esto tambien funciona para Macromedia Flash, ya que en ActionScript, tampoco existen sentencias para el control del puerto paralelo, sin embargo con la misma idea podriamos tener un impresionante desfile multimedia con la posibilidad de controlar el puerto paralelo. Existe tambien la posibilidad de accesar al puerto paralelo por medio del DEBUG de Windows, sencillamente se crearia un archivo de procesamiento por lotes, y se invocaria desde VB. Una de las formas ms sencillas y ms limpia de controlar el puerto paralelo es con una librera de enlace dinmico (DLL) escrita en lenguaje C en la que se implementen las funciones necesarias para la comunicacin con el puerto paralelo, posteriormente se declararia dicha librera en VB, y entonces ya podriamos tener acceso desde VB a las funciones que controlen el puerto previamente escritas en C. Sin embargo existe aun una forma ms sencilla y ordenada de controlar el puerto paralelo con VB, y es mediante un control ActiveX, que encapsule todas las declaraciones y funciones importadas y nos presente una forma ms amigable de controlar el puerto, esto lo abordaremos al final, pues primero explicare como se importan las funciones de C a VB por medio de una DLL, la literatura necesaria para crear una DLL se encuentra ms que difundida en internet, y en realidad nos tomaria otro articulo sobre programacin de DLLs en C, as que no nos interesa profundizar en ello, porque en realidad ya existen muchas librerias listas para utilizarse en VB. En conjunto con este articulo se anexan varias librerias, que nos permitiran utilizar sus funciones desde VB de varias maneras. Sin embargo en este articulo unicamente describire las funciones de una de ellas, que es quizs la ms elaborada, ya que no requerimos de enviar o recibir los datos de la funcin en numeracin hexadecimal como sucede con otras. Antes de continuar, es conveniente echar un vistazo al puerto paralelo. La siguiente figura muestra el diagrama de un puerto paralelo estndar, el dibujo muestra la salida del puerto tal y como se ve al estar viendo a la computadora desde atrs, como puedes ver, est especficamente diseado para la impresora. Las flechas que salen del puerto son los comandos que se envan a sta (salto de hoja, inicializacin, seleccin, habilitacin), y tiene una entrada para cada seal que la impresora puede mandar: error, impresora no seleccionada, impresora ocupada, sin papel, y "reconocimiento" (ACK). Esto nos da un total de doce bits de salida y cinco bits de entrada, as como 8 conexiones a tierra.

Registro de estado

Lineas de datos

Tierras

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERA Y CIENCIAS SOCIALES Y ADMINISTRATIVAS INGENIERA EN INFORMTICA

Para conocer la direccin del puerto paralelo de tu computadora ve a : Panel de control>Sistema>Hardware>Administradir de dispositivos>Puertos(COM & LPT1>Puerto de impresora>Recursos

Generalmente la direccin es 378 hexadecimal y 888 decimal, aunque puede variar de computadora a computadora, quizas sea 273 o 3BC.

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERA Y CIENCIAS SOCIALES Y ADMINISTRATIVAS INGENIERA EN INFORMTICA

Ahora que ya conocemos el puerto paralelo podemos pasar a las instrucciones en lenguaje C para el control del puerto. Para establecer el valor se utiliza outportb(Direccin, valor); Para leer el valor del puerto se utiliza inportb(Direccin); Estas funciones estan definidas en la librera dos.h /* Ejemplo de E/S digital mediante el puerto paralelo, en mi computadora la direccin es 0x378 pero esto puede variar */ #include /* Funciones de E/S directa por puertos */ #include void main () { /* Aqu se guardar el valor de las lineas de estado */ int byte; /* Enciende el LED al activar la primera lnea de datos (pin n 2) */ outportb(0x378, 1); /* Bucle que lee un byte de las lneas de estado */ do { byte = inportb(0x379); printf ("El valor ledo es %i\n", byte); } /* Repite hasta que se pulsa una tecla */ while( !kbhit() ); /* Apaga el LED */ outportb(0x378, 0); } En Win 2000, NT, y XP no se permite acceder al puerto paralelo, por lo cual se requiere de despreteger el puerto antes de probar este programa, esto se puede hacer con algunos programas como AllowIO que se pueden encontrar libremente en internet. Ahora es el momento de utilizar estas funciones de C en VB. Ahora bien, nos evitamos todo el rollo para crear DLLs, lo que haremos sera utilizar las funciones de una de las librerias incluidas en esta descarga, la IO.DLL, hay otras, pero esta es la que ms prestaciones tiene. Lo que haremos sera declarar la librera en un modulo de VB, y despues ya podremos utilizarla en algun formulario, siempre hay que tratar de meter todo el cdigo dentro de un modulo, ya que un programa con el codigo directamente en el formulario es mucho ms lento que un programa con el codigo en uno o varios modulos, sobre todo cuando se trata de vectores, matrices y grficos. Aqu menciono la descripcin de cada una de las funciones de esta librera, aunque en realidad no no ser necesario utilizar todas.PortOut PortWordOut PortDWordOut PortIn PortWordIn PortDWordIn SetPortBit ClrPortBit NotPortBit GetPortBit IsDriverInstalled Envia un byte por el puerto indicado Envia una palabra de 16 bits al puerto indicado Envia una palabra de 32 bits al puerto indicado Lee un byte del puerto indicado Lee una palabra de 16 bits del puerto indicado Lee una palabra de 32 bits del puerto indicado Envia un 1 lgico por el bit del puerto indicado Envia un 0 lgico por el bit del puerto indicado Invierte el estado del bit del puerto indicado Regresa el estado del bit del puerto indicado Regresa un 0 si la librera IO.DLL esta instalada y funcionando.

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERA Y CIENCIAS SOCIALES Y ADMINISTRATIVAS INGENIERA EN INFORMTICA

Aqu muestro como se declaran estas funciones para ser accesibles desde VB:Option ExplicitPublic Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer) Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long) Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean ' La siguientes 2 variables pueden tomar cualquier nombre, no son parte de la DLL. Public Dir_Lectura As Integer ' En esta variable se almacena la direccin de lectura del puerto Public Dir_Escritura As Integer ' En esta varibale se almacena la direccion de escritura del puerto

Esto debe ir en un modulo, el nombre del modulo no importa, ya que pudes mandar a llamar las funciones directamente por su nombre, sin embargo la primera vez sera conveniente que las mandaras a llamar haciendo referencia al modulo de esta forma Module1. asi VB te mostrar todas las funciones de esta librera, adems de los parametros que requiere.

Hasta aqu de esta DLL, para entender como funciona por completo solo hace falta ver el ejemplo que se anexa junto con la DLL, pero con esto ya no tendran problemas, solo recuerden tener la IO.DLL en el mismo directorio donde esta el ejecutable de VB. Comentaba que la forma ms sencilla de controlar el puerto paralelo es con un control ActiveX, un control ActiveX es un pedazo de software reutilizable, algo as como una version primitiva de una clase, ya que se puede instanciar y utilizar sus propiedades y mtodos en un formulario e incluso en paginas web. Para que quede ms claro un ejemplo de un control ActiveX es el TEXTBOX, o un LABEL, un PICTUREBOX de VB. Es decir, son componentes que podemos agregar a un formulario y ya podremos utilizarlos sin preocuparnos de todo el cdigo que hay adentro del control. En realidad estoy seguro de que el control por puerto paralelo es un medio y no un fin, creo que les seria util un control ActiveX que nos permitiera enviar datos por el puerto y realizar lecturas de los bits de estado incluso a una velocidad de 50 milisegundos por lectura, esto me parece ms sencillo, porque es un control que podemos insertar en cualquier formulario, no importando de que proyecto se trate, no hace falta hacer declaraciones de funciones, unicamente lo insertamos y comenzamos a utilizarlo, aunque obviamente si se requiere de la DLL instalada en el equipo. Me di a la tarea de construir un ActiveX para el control del puerto paralelo, y me parece que logre simplificar la tarea, veamos un ejemplo. Si aun no lo has hecho, bajate el archivo SWF (zip) que acompaa a esta descarga, en el encontraras una carpeta llamada ActiveX, entra y vers un archivo llamado PuertoParalelo.ocx, y un archivo llamado UPIICSA_VB.DLL, el OCX es nuestro control del puerto paralelo y la DLL es la librera con funciones en C, copia la DLL a la raiz de tu unidad C, la ruta del archivo debe ser C:\UPIICSA_VB.dll. Copia el archivo PuertoParalelo.OCX a tu directorio de sistema, generalmente System32. Ahora ya puedes utilizar el control del paralelo desde cualquier proyecto de visual basic, esto de copiar los archivos obviamente solo es necesario hacerse una vez por mquina.

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERA Y CIENCIAS SOCIALES Y ADMINISTRATIVAS INGENIERA EN INFORMTICA

Abrimos el Visual Basic y escogemos un EXE estandar. Cuando ya se muestre el formulario entonces vamos al menu PROYECTO y escogemos la opcin COMPONENTES, se nos mostrara un dialogo, da clic en el boton EXAMINAR y busca el archivo PuertoParalelo.ocx, si me has hecho caso debe estar en tu directorio de sistema, localizalo, abrelo y acepta, ahora el control UPIICSAPP se encuentra al final de tu barra de controles.

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERA Y CIENCIAS SOCIALES Y ADMINISTRATIVAS INGENIERA EN INFORMTICA

Agrega al formulario un par de botones, un label y un UPIICSAPP, no importa donde los coloques, esto solo es una demostracin.

Nuestro control de puerto paralelo

El Boton 1 (command1) es el que manipulara el bit 2 del paralelo, el boton2 (command2) lo que hara es realizar una lectura del bit 2 del registro de estado. Por ahora copia el siguiente texto, es lo que hace funcionar nuestro control, como veras es muy sencillo.Option Explicit 'Cuando presionamos el boton se envia un 1 al bit 2 del puerto paralelo Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) UPIICSAPP1.Encender_Bit (2) End Sub 'Cuando liberamos el boton se envia un 0 al bit 2 del puerto paralelo Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) UPIICSAPP1.Apagar_Bit (2) End Sub ' Cuando hacemos clic sobre el boton 2 se hace una lectura y se muestra en el label el valor del bit 1 del registro de estado Private Sub Command2_Click() UPIICSAPP1.Realizar_lectura Label1.Caption = UPIICSAPP1.Leer_Estado_Bit1 End Sub ' Cuando se carga el formulario se establece que la direccin de nuestro puerto paralelo es la 378 Private Sub Form_Load() UPIICSAPP1.Establecer_Direccin_0x378 End Sub

Debes conectar un led al puerto al que vayas a enviar el 1 lgico para poder ver que realmente funciona, o de lo contrario usa un multimetro. Si no pasa nada quizas en tu mquina la direccin sea otra, no te preocupes ya me he encargado de eso, solo debes cambiar esta instruccin :UPIICSAPP1.Establecer_Direccin_0x378 por alguna de estas dos : UPIICSAPP1.Establecer_Direccin_0x278 UPIICSAPP1.Establecer_Direccin_0x3BC

Para ver todas la funciones que trae el control recuerda el punto, osea UPIICSAPP1. y VB te mostrara todo lo que te ofrece este control, por supuesto si detestas la UPIICSA o a tu servidor, puedes poner la propiedad visible del control a false. Sientete libre de usar este control y redistribuirlo, ojal que te haya servido, si tienes alguna duda o comentario este es mi mail [email protected]

Indicindose en la Programacin y simulacin con el Puerto Paralelo

Comenzando con el Puerto Paralelo Uso, Aplicacin y SimulacinDescripcin:Bueno, este es el primer tutorial que escribo de cmo usar el Puerto Paralelo. En casi todas las Pcs 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 usara fcilmente 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. Adems aqu voy a usar 3 tipos de codificacin: Assembler, C++ y Visual Basic.

TERMINOLOGIA:

A lo largo de este tutorial, voy a ser uso de ciertos trminos 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 : Significa que este dato es negado. Registro: Arreglos de 8 Bits, que sirven para la configuracin del Puerto Paralelo

Un Poco de Teora.

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 continuacin:

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 tendramos que hacer es: Result=Byte And 10110000b;// Result = Byte & B0; Y nos quedaria: Byte = Result = D7 1 D7 D6 0 0 D5 1 D5 D4 1 D4 D3 0 0 D2 0 0 D1 0 0 D0 0 0 Operador & = And //Muy interesante

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

Yoel Ocmn http://Yoelocmin.tk

FIE-UNMSM Lima-Per 1 http://proyectosfie.tk [email protected]

Indicindose en la Programacin y simulacin 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 tendramos que hacer: Result=Byte or 11010100b;// Result= Byte | 0xD4 Y nos quedara: Byte = Result = D7 1 1 D6 1 1 D5 0 D5 D4 1 1 D3 0 D3 D2 1 1 D1 0 D1 D0 0 D0 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 tendramos que hacer es: Result = Byte Xor 10110000b;// Result = Byte ^ B0 Y nos quedaria: Byte = Result = D7 1 ~D7 D6 0 D6 D5 1 ~D5 D4 1 ~D4 D3 0 D3 D2 0 D2 D1 0 D1 D0 0 D0 Operador ^ =Xor //Muy interesante

Es decir, nos permite invertir el Bit donde esta con 1 Bueno, Espero que este claro lo de las operaciones lgicas. 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 numeracin, por que de eso ya hay bastante en la Web, y ya he puerto informacin en la seccin 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 direccin de la mayora de Pcs q conozco, esta en 378h. Aunque puede variar dependiendo del SO q uses. Yo lo voy ha usar como un Estndar para este tutorial.

Yoel Ocmn http://Yoelocmin.tk

FIE-UNMSM Lima-Per 2 http://proyectosfie.tk [email protected]

Indicindose en la Programacin y simulacin con el Puerto Paralelo

Descripcin de Registros:Registro de Datos. (Su direccin es 378h = Direccin Base).D7 D6 D5 D4 D3 D2 D1 D0

Este registro es de 8 bits. Es por aqu q enviamos la informacin hacia el exterior. Ejm Activamos un Led, un Rel, Motores DC, Motores a pasos. Una Alarma. Lo q nos imaginemos. O tambin recibimos datos. Ejm: Seal de un ADC para digitalizar una seal 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 programacin q uses, la sintaxis es : Outxxx (378h,Dato). Ejemplo en C++ Usando la Librera 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