top of page

CONECTA TUS PROYECTOS A LA PC CON PIC18F4550 Y VISUAL BASIC

Actualizado: 13 jun 2019


Figura 1

El dispositivo de clase HID, esta clase se utiliza para dispositivos controlados por humanos, como el teclado o el ratón. La ventaja de los dispositivos HID es que, no requieren la instalación de los controladores, en la mayoría de los sistemas operativos modernos, es detectado el dispositivo sin ningún problema. MikroC proporciona la librería USB HID que hacen que hace fácil que un host en este caso un PC pueda comunicarse con un dispositivo USB.

Descriptores

Cuando un dispositivo es conectado al bus USB, el HOST utiliza la dirección 0 para pedir información básica del dispositivo. A continuación, el HOST le asigna una dirección única al dispositivo. Después de que el HOST solicita y recibe más información sobre el dispositivo, como el nombre del fabricante, las capacidades, y el ID de producto, entonces comienza la comunicación.

Todos los dispositivos USB tienen una jerarquía de descriptores que describen diversas características del dispositivo como el ID de fabricante, la versión del dispositivo, la versión de USB que soporta, que tipo de dispositivo es, sus requisitos de potencia, y así sucesivamente.

El protocolo USB HID permite que un PC reconozca un dispositivo HID USB conectado a él sin necesidad de crear un controlador. El sistema operativo Windows cargará los controladores necesarios, todo lo que se necesita es que programa que va a controlar el dispositivo desde el PC tenga la información del dispositivo como Vendor ID (VID), identificador de producto (PID), nombre del Fabricante etc.


Figura 2

Creación del archivo con los descriptores en MikroC


Para crear el archivo de descriptores en mikroC, abra su proyecto mikroC vaya al menú Tools y haga click en HID Terminal a continuación haga click en la pestaña y llene los datos como se ve muestra en la figura 2.

ID (vendor ID) and PID (product ID): Cada dispositivo USB debe tener un conjunto único de códigos PID y VID.

Input and Output data length: Este es el tamaño de los buffers de entrada y salida. el valor predeterminado es de 64 caracteres.

Vendor Name and Product Name: aquí se pone el nombre del vendedor y el del producto.

Bus power: Marcar esta opción para dar permiso al PIC que se energise desde el PC.

Seleccione el lenguaje usado: Mikroc en este caso

Haga click en Save descriptor y guárdenlo en el lugar deseado, es recomendable guardarlo en el mismo directorio que el proyecto y se puede guardar con el nombre que quiera en este caso será USBdsc.c por defecto.


Como escribir el código en MikroC

Ahora solo queda escribir el código e incluir el archivo del descriptor para que pueda funcionar a continuación se explicará como hacer el código:

Lo primero que debemos analizar es el espacio de la RAM de la USB, en la figura 3, notamos que el espacio de memoria que va desde la dirección 400h hasta 4FFh está destinado al Descriptor que creamos anteriormente con el HID Terminal.


Figura 3


Posteriormente desde la posición 500h hasta 7FFh se utilizarían para datos, es decir, lectura y escritura en la USB. A partir de la dirección 500h escribimos la instrucción para leer de la USB, y quedaría de la siguiente manera:


unsigned char LeerUsb[64] absolute 0x500;


Como el tamaño del buffer es de 64, arrancamos desde 540h para la instrucción escribir en la USB y quedaría de la siguiente manera:


unsigned char EscribirUsb[64] absolute 0x540;


Ahora hay que reservar la es espacio del Descriptor que como vemos en la Figura 3 va desde la dirección 400h a 4FF por lo que el tamaño es de 256 decimal, si lo declaramos queda de la siguiente manera:


unsigned char DescriptorUsb[256] absolute 0x400;

Posteriormente hay que hacer una función de interrupción para mantener activa la comunicación entre nuestro proyecto con la PC. Debe quedar de la siguiente manera:


void interrupt(){

Usb_Interrupt_Proc();

}


Dentro del viod main, se debe declarar una variable tipo char para control y saber si se están intercambiando datos, de esta manera:


char dato;


Posteriormente se habilita la comunicación HID , y dentro de ella se declara en que buffer se van a almacenar los datos enviados y recibidos.


HID_Enable(&LeerUsb,&EscribirUsb);


Por último, dentro el while se verifica cuando se han recibido datos mediante el siguiente arreglo:


dato = HID_Read();

if(dato != 0) {

dato = 0;

PORTD = LeerUsb[0];

}


Hasta aquí es el código necesario para que el Microcontrolador PIC 18F4550 se comunique con éxito.


 

A continuación agregaremos un código adicional para leer 2 entradas analógicas, 2 entradas digitales, activar 2 salidas digitales y 2 salidas PWM.


Enviar datos digitales:

Para enviar datos del proyecto a la PC basta con hacer una función:

void EntradaDigital()

{

EscribirUsb[4] = PORTB;

while(!Hid_write(&EscribirUsb, 64));

}


Enviar datos Analógicos

Si los datos que se van a enviar son analógicos, se escribiría así:


void EntradaAnalogica()

{

unsigned analogVal;


analogVal = ADC_get_sample(0);

VAL_ALTO0 = Hi(analogVal);

VAL_BAJO0 = Lo(analogVal);

EscribirUsb[11] = VAL_ALTO0;

EscribirUsb[12] = VAL_BAJO0;

ANALOGICO0 = ((VAL_ALTO0 * 255) + VAL_BAJO0)*0.09765625;

analogVal = ADC_get_sample(1);

VAL_ALTO1 = Hi(analogVal);

VAL_BAJO1 = Lo(analogVal);

EscribirUsb[13] = VAL_ALTO1;

EscribirUsb[14] = VAL_BAJO1;

ANALOGICO1 = ((VAL_ALTO1 * 255) + VAL_BAJO1)*0.09765625;

while(!HID_Write(&EscribirUsb, 64));

}


En esta función se lee el valor del puerto analógico 0 y 1 y lo guarda en la variable analogVal, como es de tamaño 1024 se guarda en dos bytes para poder enviarlos por el buffera la PC, Hi(analogVal) la parte Alta y Lo(analogVal) la parte Baja y por último se hace una pequeña ecuación para pasar de 0-1024 a 0-100 y poderlo mostrar en la pantalla lcd 4x 20.


 

Rutinas incorporadas


El compilador mikroC PRO for PIC proporciona un conjunto de funciones útiles de utilidad incorporadas.

El Lo, Hi, Higher, Highest son rutinas se implementan como macros. Si desea usar estas funciones, debe incluir el built_in.h, como archivo de encabezado (ubicado en la carpeta del compilador) en su proyecto.


 

Recibir DatosPara recibir datos tanto digitales como analógicos basta con modificar la subrutina dato = HID_Read(); mostrada anteriormente, quedaria de la siguiente manera:


dato = HID_Read();

if(dato != 0){

dato = 0;

PORTE = LeerUsb[0];

PWM1=LeerUsb[2];

PWM2=LeerUsb[3];

PWM1_Set_Duty(LeerUsb[2]);

PWM2_Set_Duty(LeerUsb[3]);

}

Primero lee el buffer, y lo guarda en la variable dato, si dato es diferente de cero quiere decir que hay información recibida y se procede a verificar cual fue, lo que esta en el buffer 0 lo muestro en el puerto E, lo que esta en el buffer 2 en el PWM1 y lo que esta en el buffer 3 en el PWM2.


Adicionalmente a este ejemplo se les agregaron leds, pantalla lcd 4x16, y se hizo un programita en viasual studio, con el lenguaje Visual Basic.


 

IMPORTANTE

Deben descargar los archivos:

mcHID.dll : Que es el que permite la comunicación USB HID entre el PIC y Visual Basic, Esta es una pequeña aplicación utilizada para comunicarse con dispositivos USB de clase HID. Y se puede descargar fácilmente en Internet.

MfgControl.AdvancedHMI.Controls.dll: Es una solución centrada en software para crear un HMI para un sistema de control industrial. Lo extraje de de forma gratuita de la página advancedhmi.


Copien los archivos mcHID.dll y MfgControl.AdvancedHMI.Controls.dll

en la carpeta system32 de windows.


 

Aquí le dejo un vídeo para que puedan detallar mejor el ejemplo :



 

Referencias:

De estas páginas tome la información presentada en esta entrada:


 

Link de Descarga de los Códigos hecho en MikroC , Proteus


Aplicación en Visual Basic: http://bit.ly/2RdZb6U

Código en MikroC y Proteus: http://bit.ly/2MMFhRO

MfgControl.AdvancedHMI.Controls.dll: http://bit.ly/2WGfA56

 

Gracias por ver este Artículo, Cualquier sugerencia no duden en escribir.

23 commenti


Jorge Chavez
Jorge Chavez
24 lug 2019

jorge_luis050@hotmail.com

Mi piace

Jorge Chavez
Jorge Chavez
21 lug 2019

Amigo que buen tutorial, serías tan amable de facilitarme el código de visual por favor

Mi piace

Pablo Cedeño
Pablo Cedeño
22 giu 2019

De donde eres??

Mi piace

Pablo Cedeño
Pablo Cedeño
22 giu 2019

Un cable normal USB. asi como aparace en proteus

Mi piace

maricarmen Solano
maricarmen Solano
22 giu 2019

tiene que ser un cable especial?

Mi piace

© 2019 BY Cdno Didactic - Profesor Pablo Cedeño

bottom of page