Usb Hid
Usb Hid
Usb Hid
Para
utilizar el modo de trabajo HID es necesario actualizar nuestro compilador a una versin ms reciente, en nuestro caso esa versin es la 4.114. carpeta, contiene dos archivos:
La
Ideutilsupd pcwhdupd
Primero
ejecutamos el archivo pcwhdupd, recordando que si trabajamos en un sistema Vista, 7 u 8 debemos hacerlo como modo administrador. Ahora ejecutamos el otro archivo y listo, tendremos nuestro compilador instalado.
este modo de trabajo tenemos que escoger cual de los 2 pics vamos a manejar, pueden ser el 4550 o el 2550. La palabra e configuracin ser la misma que en el CDC
frecuencia de reloj tambien ser de 48 MHz, agregamos la siguiente librera: <pic18_usb.h> la cual contiene todos los registros y arquitectura de los pics de la familia 18 para poder manejar los drivers de usb internos que cada computadora trae.
#include
<Descriptor_easyHID.h> Esta librera contiene toda la informacin acerca del envo y recepcin de datos as como tambin el tamao de los buffers de envo y rececpcin y los VID y PID para los pics, que en nuestro caso no modificaremos ya nada de esa librera.
USB_CONFIG_HID_TX_SIZE 32 #define USB_CONFIG_HID_RX_SIZE 32 dos lneas crean unas macros para definir dentro de mi programa principal el tamao de la palabra que se va a enviar y recibir. Cada dato enviado no puede exceder este tamao, en este caso son 32 bits a enviar y recibir
Estas
Inicia el USB usb_task(); Habilita las interrupciones por USB USB_debug(); Muestra el estado de la conexin USB
Flujo Principal
Al igual que la comunicacin CDC, este modo de trabajo necesita un bucle principal donde recibe y enva informacin: if (usb_kbhit(1)) { usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); }
El
bucle anterior, est diseado para poder recibir una instruccin a traves del bus USB por medio de la interrupcion kbhit y guardarlo en una buffer denominado EndPoint1. Una vez almacenado lo sacamos utilizando la instruccin usb_get_packet y lo guardamos en la variable recibe indicando el buffer por el cual vamos a sacar el dato, que en este caso es un arreglo creado anteriormente por la variable recibe.
Ejemplo
Crear
un programa HID que permita encender y apagar 4 leds por medio de una interfaz en Visual C#
Programa Ejemplo
#include
<18F2550.h>
#fuses
#use
#include
#define
#define
#define
void {
USB_debug()
void {
main(void)
int8 int8
recibe[USB_EP1_RX_SIZE]; envia[USB_EP1_TX_SIZE];
output_b(0x00);
while (TRUE) { if(usb_enumerated()) { if (usb_kbhit(1)) { usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); switch(recibe[1]) { . case LED_1: output_toggle(PIN_B7); break; case LED_2: output_toggle(PIN_B6); break; case LED_3: output_toggle(PIN_B5); break; case LED_4: output_toggle(PIN_B4); break; } } } } }