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



## albertoxx (Nov 20, 2010)

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 


```
#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);
   }
}
```


----------



## Moyano Jonathan (Nov 20, 2010)

Y el programa para el host donde está ?


----------



## albertoxx (Nov 21, 2010)

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 


```
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;
```


----------



## Deego (Abr 14, 2011)

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??


----------



## albertoxx (Sep 19, 2011)

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


----------



## hanjoca (Oct 8, 2011)

me podrias pasar tu executable para probar el hid , se agradece de todas formas


----------



## albertoxx (Oct 10, 2011)

Solo lo ejecutas y conectas tu dispositivo si te lo recooce te va decir que conectaste

suerte y saludos


----------



## Sinkins (Feb 12, 2012)

Hola, me pregunto si con tu ejemplo puedo enviarle datos al pic desde la pc, como para prender un led pero que siga siendo HID?


----------



## albertoxx (Feb 16, 2012)

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!


----------



## Propie (Sep 24, 2012)

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


----------



## albertoxx (Sep 27, 2012)

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


----------



## ronaldluna (Nov 13, 2012)

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


----------



## robertosebastian92 (Jun 10, 2013)

Me encanta el tema siempre me resulto de extrema curiosidad la coneccion de pic via USB, Hago una consulta inocente, de que frequencia es el cristal externo para este proyecto? Saludos!


----------



## albertoxx (Jun 10, 2013)

El cristal es de 20Mhz


----------



## SabonJuan (Jun 25, 2013)

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!


----------



## SabonJuan (Jun 27, 2013)

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.


----------



## SabonJuan (Jul 15, 2013)

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


----------



## albertoxx (Jul 23, 2013)

Que bueno que te funciono, no has tenido problema con el reconocimiento que a veces le cuesta a windows reconocer lo que se ha conectado. 
Saludos


----------



## Byrger (Ago 26, 2013)

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


----------



## joshuerm (Ago 27, 2013)

Buena tarde Sabonjuan,

si puedes subir los archivos te lo agradeceria

saludos


----------



## dmitrov (Sep 9, 2013)

Que version usaste inves de la 4.105 ???? Tengo el mismo problema uso la 4.107...





sabonjuan dijo:


> 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!




que version usaste inves de la 4.105?? Tengo el mismo problema con los id...  Lo llegaste a implementar fisicamente'????? Yo lo tengo en fisico y uso la 4.107 y aun no puedo establecer la comunicacion en winxp ni en win7


----------



## SabonJuan (Sep 9, 2013)

Empece con esa versión, finalmente lo hice funcionar en cualquier otra versión, tanto la 4.023 (creo que la 4.06X no recuerdo exactamente) y en versiones posteriores estoy probando.


----------



## SabonJuan (Sep 30, 2013)

Buenas, ahi subo los archivos, perdon por la demora, pero he estado complicado con el trabajo y mi bendita tesis:
 ese es el codigo del microcontrolador, basicamente recive datos para mostrarlos en un display serial

despues subo con tiempo los codigos en delphi, no los tengo a mano ahora, pero para subir algo. De todos modos en delphi buscando se encuentran unas librerias interesantes en USB, pero la verdad son medias complicadas de hacerlas funcionar, veo si en estos dias subo los archivos que restan.


----------



## Azlan (Ene 13, 2014)

Hola a todos, viendo todos los aportes que han dado logre hacer que el usb HID me funcionara en proteus, pero cuando lo pruebo físicamente no funciona, el único inconveniente que se me presenta en proteus es que me toca darle correr dos veces  para que empiece a funcionar, el HOST lo hice en C# 2008 y el código del pic esta hecho en ccs. El programa consiste en enviar un numero de celular de 10 dígitos. para iniciar se debe correr la simulación en proteus una ves aparezca en la lcd  "presionar iniciar" en la interfaz de C# se presiona conectar y luego iniciar, una ves hecho esto en la lcd se nos pide el numero de celular una ves ingresado este a través del teclado se presiona le tecla "A" para enviarlo al campo de texto de la interfaz. en el archivo adjunto la librería modificada para el manejo del teclado4X4 y la libreria usb_desc_hid2 que de igual forma modifique. cualquier colaboración acerca de porque no funciona físicamente  les agradeceré.

Ps: el cristal externo que uso es de 20MHZ y el problema es que el computador ni siquiera  reconoce el dispositivo ya que cuando este es reconocido enciendo 2 leds


----------



## Azlan (Ene 15, 2014)

Hola todos de nuevo bueno el problema que tenia ya lo solucione, use  el ejemplo ex_usb_hid.c que viene con el ccs y de ahi me guie y ya el computador lo reconoce y envio datos desde el micro al computador. Pero ahora tengo una duda *quiero saber si se puede usar en el mismo micro USB HID y la lcd al tiempo*, ya que estoy usando el pic 18f4550 y apenas inicializo la lcd  ( lcd_init() el computador no  reconoce el micro


----------



## ByAxel (Ene 15, 2014)

Azlan dijo:


> *quiero saber si se puede usar en el mismo micro USB HID y la lcd al tiempo*, ya que estoy usando el pic 18f4550 y apenas inicializo la lcd  ( lcd_init() el computador no  reconoce el micro


Intenta cambiando el órden, primero inicia el LCD luego el USB.
Otra también es que está trabajando por poleo, es decir que si el PIC no se comunica con la PC cada cierto tiempo, ésta pierde conexión. Una solución a ésto es activar interrupción por USB, averigua sobre eso para configurar en el CCS.

Saludos.


----------



## Azlan (Ene 15, 2014)

ByAxel gracias por responder. He cambiado el lcd_init(); el usb_init_cs(); de posicion e incluso el #include <lcd.c>  pero nada en el proteus funciona perfecto pero físicamente no y como dije si quito el lcd_ini(); si funciona físicamente, aquí coloco el  código a ver si me pueden ayudar, con respecto a lo del usb por interrupciones si me pueden colaborar con información ya que no he trabajado antes con esto.


```
//set to 1 to use a PIC's internal USB Peripheral
//set to 0 to use a National USBN960x peripheral
#define __USB_PIC_PERIF__ 1
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48MHZ)

#DEFINE LED1  PIN_A0
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)



//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE  TRUE

//the following defines needed for the CCS USB PIC driver to enable the TX endpoint 1
// and allocate buffer space on the peripheral
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    11 //allocate 8 bytes in the hardware for transmission
#define USB_CONFIG_HID_TX_SIZE 11

#define USB_CONFIG_HID_RX_SIZE 11
//the following defines needed for the CCS USB PIC driver to enable the RX endpoint 1
// and allocate buffer space on the peripheral
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    11 //allocate 8 bytes in the hardware for reception


///only the 18F4550 development kit has this pin
#if __USB_PIC_PERIF__ && defined(__PCH__)
 #define USB_CON_SENSE_PIN PIN_C2
#endif




#if __USB_PIC_PERIF__
#if defined(__PCM__)
#include <pic_usb.h>   //Microchip PIC16C765 hardware layer for usb.c
#else
#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
#endif
#else
#include <usbn960x.c>   //National 960x hardware layer for usb.c
#endif
#include <usb_desc_hid.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>        //handles usb setup tokens and get descriptor reports


#define LED_ON output_low
#define LED_OFF output_high


#include <lcd.c> //libreria manejo lcd 4 bits

void usb_debug_task(void) {
   static int8 last_connected;
   static int8 last_enumerated;
   int8 new_connected;
   int8 new_enumerated;

   new_connected=usb_attached();
   new_enumerated=usb_enumerated();

   if (new_enumerated)
      LED_ON(LED1);
   else
      LED_OFF(LED1);

   if (new_connected && !last_connected)
      printf("\r\n\nUSB connected, waiting for enumaration...");
   if (!new_connected && last_connected)
      printf("\r\n\nUSB disconnected, waiting for connection...");
   if (new_enumerated && !last_enumerated)
      printf("\r\n\nUSB enumerated by PC/HOST");
   if (!new_enumerated && last_enumerated)
      printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");

   last_connected=new_connected;
   last_enumerated=new_enumerated;
}

void main() {
char Mensaje[4]={'H','O', 'L', 'A'};

   

   printf("\r\n\nCCS Vendor Specific HID Example");

  #ifdef __PCH__
   printf("\r\nPCH: v");
   printf(__PCH__);
  #else
   printf("\r\n\PCM: v");
   printf(__PCM__);
  #endif

   usb_init_cs();
   lcd_init();                   // inicializo la LCD
   lcd_gotoxy(1,1);
   printf(lcd_putc, "PIC 18f4550"); //Imprimo mensaje en la LCD

   while (TRUE) {
      usb_task();
      usb_debug_task();
 
        
      if (usb_enumerated()) {
        usb_put_packet(1, Mensaje, 4, USB_DTS_TOGGLE); //envio la palabra HOLA por el puerto usb
        delay_ms(500);
       }
      
   }
}
```


----------



## ByAxel (Ene 15, 2014)

Intenta con iniciar 1ro el LCD:


```
lcd_init();       // 1ro inicializo la LCD, dura unos 15ms a más según la libreria que uses
usb_init_cs();  // 2do
```

Usar Delays grandes (delay_ms(500)) es una mala práctica cuando se trabaja con USB Polling, como ya mencioné el PC y el PIC deben de comunicarse cada cierto tiempo, constantemente y este tiempo es reducido.

Adjunto un archivo que es para un teclado USB HID, no es de mi autoria pero te puede guiar.
Saludos.


----------



## Azlan (Ene 16, 2014)

Gracias ByAxel por tu ayuda ya solucione el inconveniente lo que pasaba era que como estaba usando una tarjeta de desarrollo de prueba donde ya viene cableado la LCD, el teclado la conexión USB y todas esas cosas que evitan el uso de la protoboar esta tarjeta el pin RW de la LCD esta cableado a tierra y revisando en  la librería de LCD.c me encontre con esta linea de código  " while(bit_test(lcd_read_byte(),7)) "  lo que hace es leer la LCD en otras palabras es como detectarla y al estar el RW a tierra el pic no la podía leer y se quedaba en ese ciclo, entonces solo la comente y listo! esto pasaría  igualmente si  se hacen pruebas sin tener la LCD conectada.

En todo caso muchas gracias, cuando termine el trabajo completo se los estaré compartiendo con detalles.


----------



## JHON FER (Mar 6, 2014)

muy buenos días a todos, soy nuevo en este tema y me gustaría me pudiesen ayudar, he logrado hacer comunicación usb atraes del puerto con cdc pero ahora lo estoy intentando por HID y es aquí donde estoy teniendo problemas, he estado probando con el ejemplo que subió el compañero que no es de su autoria el archivo "RRUSB_HID", el cual lo que hace es en cuanto se conecta el pic empieza a enviar todo el abecedario  de la "a" a la "z" y luego los números del 0 al 9, pero el problema que tengo es que para poder que funcione físicamente debo tocar con mi dedo el pin B0
de resto el micro no envía los ¡¡datos!!! se que es algo raro y dentro del programa el configura el puerto B  así 
   port_b_pullups(true);
   set_tris_b(0b00000001);
   output_high(PIN_SOURCE);

y no se con que fin lo hace, viendo otros programas también encontré en los mismo que también configuraban el pin B0 como high, al momento de enviar un dato, ademas intente aterrizar este pin con resistencia 220 ohm, pero nada, luego conecte la resistencia a 5v y nada, pero al tocar el pin funciona inmediatamente el envió de datos, en este momento estoy probando el programa que subieron inicialmente en este foro del envió del "HOLA" y no me quiere funcionar, agradecería su ayuda, gracias


----------



## JHON FER (Mar 14, 2014)

muy buenas a todos, deseo por favor me puedan dar solución a los inconvenientes y dudas que se me vienen presentando, he hecho también el programa  que envía un HOLA y tampoco funciona, aun después de haber seguido los pasos que allí se indican, les agradecería una pronta respuesta.
mi correo es *políticas@delforo.com*
les deseo a todos un feliz día.


*Como no cumplo las Políticas del Foro. Me editaron el mensaje.*​


----------



## SabonJuan (Mar 14, 2014)

Bueno, antes que anda probé el programa del PIC que subí, anda bien en Proteuss 8, pero a la hora de probarlo en la realidad, es decir, "FISICAMENTE" no funciona correctamente.
Lo que hubo que hacer es modificar los fuses, estos están en la mayoría de los ejemplos que hay dando vueltas.
Además el programa que tenía de ejemplo no hay manera de que funcione en delphi xe4, por este motivo no lo he subido.
Igual, ahora abandoné el USB por un tiempo hasta que termine con otros inconvenientes que tengo encima.
Estoy terminando mi tesis de grado y estoy haciendo un programa que comanda un horno de inducción, por lo qué hasta que no termine con eso no podré verme con esto.
Aun así, cualquier consulta háganla por acá.


----------



## rodivan (Abr 9, 2014)

Hola buenas! una pregunta, cuando compilo cualquier programa o ejemplo me dice que no encuentra el archivo usb.c la verdad lo busque por toda la pc y no lo encuentro. alguien me puede ayudar? Gracias! Saludos!


----------



## IxMagoxI (Abr 12, 2014)

Hola buen dia a todos, soy nuevo en esto de conexion usb-pic, resulta que quiero simular con proteus la conexion, me reconoce la conexion usb, instala el dispositivo como HID, pero pone el "vid_0000&pid_0000" como esta configurado en el pic "vid_04D8&pid_00E0", supongo que no soy el unico que le paso esto , espero que alguien me pueda dar una mano , muchas gracias,Saludos.


----------



## rodivan (Abr 18, 2014)

Hola que tal, tengo un problema con un programa de USB HID.
Conecto el pic a la pc y lo reconoce y el pic puede recibir los datos de la pc.
El problema es cuando uso el comando usb_put_packet, envía siempre el mismo dato, no es que solo lo envía una ves y listo.
Acá dejo el código, espero alguien me pueda ayudar.
Saludos.

```
#include <18f2550.h>           //archivo de cabecera
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN // fuses  configurados
#use delay(clock=20000000)     // 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
#define USB_CONFIG_HID_TX_SIZE 8
//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
#define USB_CONFIG_HID_RX_SIZE 8

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

   #define LCD_ENABLE_PIN  PIN_B5                                    ////
     #define LCD_RS_PIN      PIN_B6                                    ////
     #define LCD_RW_PIN      PIN_B7                                    ////
     #define LCD_DATA4       PIN_B0                                   ////
     #define LCD_DATA5       PIN_B1                                   ////
     #define LCD_DATA6       PIN_B2                                   ////
     #define LCD_DATA7       PIN_B3 

#include <lcd.c>


  

void main() {
   int8    datai[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
   int8    datao[USB_EP1_TX_SIZE]={'E','n','u','m',' ',' ','O','K'};                               // Declaramos la variable envía  de 32 bytes.

   char Mensaje[8]={'R','E','C','I','B','I','D','O'};

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

 
    lcd_init();
    lcd_putc("\fConectando\n");


    usb_init(); //inicializa y espera a ser encendido  
      

   usb_wait_for_enumeration(); //ahora espera hasta ser enumerado (reconocido por la PC)    
               



    lcd_putc("\fEsperando orden\n");
    
usb_task();
//usb_puts(1,datao,8,0);


    usb_put_packet(1,datao,USB_EP1_TX_SIZE ,USB_DTS_TOGGLE);
delay_ms(50);

   while(TRUE){
    
            if (usb_kbhit(1))                                           // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
            {

                usb_get_packet(1, datai, USB_CONFIG_HID_RX_SIZE);      // En el buffer lo tomamos del EP1 y lo guardamos en la variable datai....
        
               
            if (datai[0]==1){
    
                 lcd_putc ("\f Recibido 1 \n"); }      
        if (datai[0]==2){
                 lcd_putc ("\f Recibido 2 \n"); } 
        if (datai[0]==3){
                 lcd_putc ("\f Recibido 3 \n"); }  
        if (datai[0]==4){
                 lcd_putc ("\f Recibido 4 \n"); }  
        if (datai[0]==5){
                 lcd_putc ("\f Recibido 5 \n"); }     

            }
              
   }
}
```


----------

