Envio de un Hola en CCS por USB atraves de HID y 18F2550

Aqui les va un resumen de mis primeros pasos con la comunicacion del pic 18F2550 y la PC por USB(HID) si me equivoco en algo les agradeceria que me corrigieran.

Requerimientos :
Compilador CCS
Programa(HOST) en windows que pueda abrir una conexion a un VendorID,ProductID

Descripcion :
Enviar un "hola" cada 500 ms y pueda ser recibido por un programa en windows

Para empezar el compilador CCS ya trae la mayor parte del trabajo echo solo hay que modificar ciertos parametros muy puntualmente para que funcione, elegi HID en vez de CDC por que no quiero ninguna instalacion de drivers en especifico para emular un puerto Serial, por que cuando uno compra un mouse usb solo lo conecta y listo no tiene que instalar ningun driver ademas creo que con HID se obtiene mas velocidad de transmision.

Saquemos una copia del archivo usb_desc_hid.h que esta en el directorio de drivers alli tendremos que modificar varias cosas primero aqui en
const char USB_CLASS_SPECIFIC_DESC[]
las 2 lineas que dicen cambiar el 2 por la cantidad de bytes a enviar o recibir en cada envio
en este caso como hola tiene 4 caracteres ponemos 4 en vez del 2
0x95, 2, // Report count = 16 bits (2 bytes)
en
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
0x20,0x00, //product id ==11,12 //don't use ffff says usb-by-example guy. oops
cambiar o dejar asi las lineas esto nos servira para que desde la compu nos comuniquemos con el dispositivo
aqui ira el nombre con el que windows detectara el dispositivo
char const USB_STRING_DESC[]={

con estos simples cambios ya nos podremos dedicar al programa principal aqui se los pongo con sus respectivas descripciones

Código:
#include <18f2550.h>           //archivo de cabecera
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN,NOPBADEN // fuses  configurados
#use delay(clock=48000000)     // el clock que tendremos a la entrada del CPU compatible con USB 2.0
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8) //para debuguear las salidas del printf,puts etc.

#DEFINE USB_HID_DEVICE  TRUE // Si usar HID 

//Habilitar la Transferencia
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //Activa el punto final 1 para transferencias por bloque 
#define USB_EP1_TX_SIZE    8                      //8 bytes  para envio
//Habilitar la Recepcion
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //Activa el punto final 1 para recepcion por bloque 
#define USB_EP1_RX_SIZE    8                      //8 bytes para recepcion

#include <pic18_usb.h>      //Funciones de bajo nivel(hardware) para la serie PIC 18Fxx5x que serviran en usb.c
#include <usb_desc_hid.h>    //Aqui es donde van las descripciones de este dispositivo (como lo reconocera windows)
#include <usb.c>            //libreria para el manejo del usb

//funciones en pic18_usb.h
//Posibles estados del USB
// USB_STATE_DETACHED=0, USB_STATE_ATTACHED=1, USB_STATE_POWERED=2, USB_STATE_DEFAULT=3,
// USB_STATE_ADDRESS=4, USB_STATE_CONFIGURED=5
//usb_init()
//             se desconecta usando usb_init_cs y luego entra en un ciclo infinito monitoriado por
//             usb_task hasta que el estado del usb sea POWERED 
//usb_init_cs()
//             es un alias de usb_detach()
//usb_put_packet()
//             envia un paquete al HOST
//usb_kbhit()
//             devuelve TRUE si hay datos enviados por HOST(PC)
//usb_rx_packet_size()
//             devuelve el tamano del paquete enviado por el HOST(PC)
//usb_get_packet()
//             realiza la recepcion de la informacion enviada por el HOST(PC)
//usb_detach()
//             Se Desconecta y se pone en estado DETACHED
//usb_attach()
//             Se Conecta
//usb_attached() 
//             Para dispositivos que no tienen este pin simpre devuelve TRUE como el 18F2550
//             devuelve TRUE si USB_CON_SENSE_PIN = TRUE el pin que indica si esta conectado o no
//usb_task()
//             Monitorea el estado de la coneccion conectandose y desconectandose automaticamente


//funciones en usb.c necesita de la libreria de hardware
//usb_enumerated()
//             devuelve TRUE si el HOST(PC) ya enumero el dispositivo o sea si windows ya lo detecto
//usb_wait_for_enumeration()
//             espera infinitamente hasta que el dispositivo fue enumerado 
//usb_kbhit()
//             devuelve TRUE si hay datos enviados por HOST(PC)
//usb_puts()
//             como el puts serial solo que este es USB usa la funcion put packet 
//usb_gets()    
//             como el gets serial solo que este es USB usa la funcion get packet 

void main() {
   int8 out_data[20];
   int8 in_data[2];
   int8 send_timer=0;
   int8 contador=0;
   char Mensaje[4]={'H','O','L','A'};

   setup_adc_ports(NO_ANALOGS);  // desactivando puertos analogicos   
   set_tris_b(0x0);              // configurando los puertos como salidas
   output_b (0);                 // saca un nivel bajo de salida en los puertos

   usb_init(); //inicializa y espera a ser encendido
   output_high(PIN_B0);
   usb_wait_for_enumeration(); //ahora espera hasta ser enumerado (reconocido por la PC)    
   output_high(PIN_B1);
   while(TRUE){
      usb_puts(1,Mensaje,4,100);
      delay_ms(500);
   }
}
 
A si perdon faltaba el host no lo habia puesto por que la recepcion si depende de gustos a mi en lo particular prefiero delphi para programar asi que aqui va el codigo en delphi

Código:
procedure TMainForm.HidCtlArrival(HidDev: TJvHidDevice);
begin
  Memo1.lines.add('Se conecto el siguiente dispositivo HID = '+ DeviceName(HidDev));
end;

procedure TMainForm.HidCtlRemoval(HidDev: TJvHidDevice);
begin
  Memo1.lines.add('Se desconecto el siguiente dispositivo HID = ' + DeviceName(HidDev));
end;

procedure TMainForm.HidCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);
var
  I: Integer;
  Str: string;
begin
  Str := DeviceName(HidDev)+' Ha Enviado : '+Format(' ReportId %.2x  ', [ReportID]);
  for I := 0 to Size - 1 do
    Str := Str + PChar(Data)[I];
  Memo1.lines.add(Str);
end;
 
Que tal, otra vez yo, ahora por aca. Me pregunto si se necesita algún driver para que reconozca el PIC, porque en proteus si me lo reconoce, tal vez por el driver que toca instalar, pero ya utilizando el PIC real, dice que el dispositivo no ha sido reconocido. En system32 ya puse el dll mcHID pero no se que más tocará realizar, para que el computador reconozca el PIC, probe en todos los puertos, en varios computadores y sigue saliendo el mismo mensaje, que el dispositivo no es reconocido por el HOST. Alguna sugerencia amigos??
 
La tecnologia HID es universal tal y como lo es conectar un mouse no necesitas los drivers del fabricante por eso se usa el ID del dispositivo para que tu programa sepa que en realidad conectaste tu HID
 
Si claro que se puede solo que es un poco mas complicado del lado de windows que del lado del pic en el pic unicamente se usa la funcion usb_gets que es lo mismo que usb_puts pero a la inversa uno lee y el otro escribe, ahora del lado de windows cuando detectes que el dispositivo se conecto se te enviara como parametro el dispositivo si es el tuyo entonces creas una variable tipo TJvHidDevice y la asignas luego pones un boton o alguna cosa para que cuando lo presiones ejecute el codigo para enviar que seria mas o menos asi : Dispositivo.WriteFile(Buffer,Dispositivo.Caps.OutputReportByteLength,CuantosEnvio)
OutputReportByteLength te dice cuando es lo maximo que puede llevar lo que le mandes en buffer
de alli lo cachas con el hid y si la data recibida por el hid digamos q es ON pues prendes el led de lo contrario lo apagas y listo, no es tan complicado suerte!
 
Hola,

Pues yo estoy intentando hacer una aplicación tambien en modo HID basandome en tu codigo. Para debuggear activo unos pines de forma que puedo saber en que parte del codigo esta el PIC. Sin embargo noto que el PIC no esta logrando pasar de la función usb_init();


Que puede ser?


Propie
 
Donde regularmente se quedan trabados en el usb_wait_for_enumeration() por que es alli donde windows tiene que instalarlo por asi decir y la primera vez que los conectas se demora un poco, revisa si no es alli por que si no fuera alli, pega el codigo para echarle una vista
 
hola yo estoy en bolas en comunicacion pic usb con la pc pero quiero aprender y no se si podrian colgar un archivo en el cual explique como manejar. se los agradezdo de antemano GRACIAS :)
 
Última edición:
Buenas, excelente aporte, mi consulta es la siguiente:
Segui los pasos al pie de la letra (o eso creo) y me figura Vendor_ID 0x0000 y product_ID 0x0000 tengo la version 4.105 de sofware y además estoy usando proteuss 8 con el driver para usb, es decir, lo utilizo desde un puerto virtual. Alguna sugerencia? gracias!
 
Finalmente lo solucione, era un problema de las librerías de CCS, instale otra version por las dudas y funciono bien.
Ahora estoy tratando de hacer un display USB manejado desde delphi 2006, si interesa, cuando termine lo subo.
 
Finalmente logre enviar y recibir datos a travez de USB-HID entre un PIC18F2550 y Delphi 2006 para la interfaz de la PC, solo tuve que utilizar unas librerias llamadas HID_Library__.dll donde no recuerdo donde consegui el ejemplo. Si alguien lo necesita lo subo
 
hola acabo de entrar y estoy en un pryecto ya hace mucho tiempo con conectar el pic 18f4550 con mi pc para manejarlo desde java. ya lo intente de modo cdc y bulk..... y falle con hacerlo reconocer con mi pc (windows 7 x 64bits) asi que solo me queda hacerlo en modo hid. asi que esta seria mi ultima oportunidad.
me gustaria que me explicaras mas detalladamente las funciones que pones de comentario mas que todo las que me sirven para que el pic reciva informacion de la pc. y si alguien ya a intentado unirlo con java que me comente como le fue. yo intentare ustilizar la libreria JpicUSB que es el que me parece entendible para manejar al pic desde java
 
Atrás
Arriba