Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

22/04/2012 #2001


OK jona, seguir estudiando es la única opción, volveré al principio del hilo, en cuanto tenga alguna duda te consulto y lo que descubra lo agrego al hilo.
Cordiales Saludos
HFA

---------- Actualizado después de 2 minutos ----------

en principio el puerto paralelo fue la opcion y la que manejo, pero encontre algunos problemas en la conmutación del puerto lo cual hizo que me decidiera pasar a USB, aunque no funcionaba mal.
22/04/2012 #2002

Avatar de Moyano Jonathan

en principio el puerto paralelo fue la opcion y la que manejo, pero encontre algunos problemas en la conmutación del puerto lo cual hizo que me decidiera pasar a USB, aunque no funcionaba mal.
Entiendo, lo que pasa es que no es como pasarte de un tipo de puerto al otro...el USB es todo un mundo totalmente diferente al puerto paralelo.
Saludos !
23/04/2012 #2003


Finalmente solucione los problemas con el driver y la placa funciona correctamente.

Tengo este codigo metido en el pic:

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CP UDIV1,VREGEN
#use delay(clock=48000000)
#include ".\libreria\usb_cdc.h"
#rom int 0xf00000={1,2,3,4}
#define led PIN_A0
void main() {
int8 x;
set_tris_b(0x0);
output_b(0);
usb_cdc_init();
usb_init();

while(!usb_cdc_connected()) {}
do{usb_task();
if (usb_enumerated()){
if(usb_cdc_kbhit()){
x=usb_cdc_getc();
output_b(x);
output_high(led);

}
}
}while (TRUE); // bucle infinito.
//// jokelnice_cdc_enviar
}


Mediante labview tengo un .vi con unos simples pulsadores de dirección (arriba, abajo...) y por el puerto B sale 0000 0000 sin embargo, al arrancar el labview (run) la combinacion por el puerto B continuamente es (0110 1101) incluso sin haber pulsado nada (tan solo iniciando el labview y RUN). Y no cambia sea cual sea lo que pulsemos.

P.D. el led se enciende al hacer run en el labview.
23/04/2012 #2004

Avatar de piposon

Ayuda para USB HID
Saludos Moyano Jonathan;

Soy nuevo en este foro y estoy tratando de aprender C# + USB HID + PIC. Este tema tiene más de 100 páginas y tomó una semana para leer todo. En primer lugar quiero darle las gracias por su esfuerzo y ejemplos publicados. Ellos son muy buenos y he aprendido de ellos. Ahora puedo enviar bytes al PIC y ver ellos en una pantalla LCD, pero no puedo ver el byte enviado por él para la pantalla del ordenador.

Yo estoy tratando de hacer la comunicación con PIC + USB HID desde su modelo, pero estoy teniendo dificultades para enviar y recibir 'strings' o 'arrays'. Envío de una imagen del programa que estoy trabajando y un archivo rar, que es la modificación de su modelo. Si usted puede pasar el tiempo que muestra cómo debe ser el código para enviar y recibir 'strings' o 'arrays'. Muchas gracias de antemano.

Pido disculpas por lo que escribo porque he usado Google Translator. Sé que tiene errores en la escritura. No puedo escribir en español, pero he leído poco a poco.

Saludos a todos!
Imágenes Adjuntas
Tipo de Archivo: jpg Ajuda C#.JPG (93,6 KB (Kilobytes), 74 visitas)
23/04/2012 #2005

Avatar de dinoelectro

Moyano Jonathan dijo: Ver Mensaje
Si querés enviar los datos de 32 bits por HID podés dividir el dato entre 4 y luego en la aplicación de la PC los volvés a unir. OJO..siempre y cuando sea un entero de 32 bits.
bueno esa seria una de las soluciones... pero ya lo solucione; lo que hice fue convertir el numero en un "string" luego envio al PC

garacis moyano por tu interes!!!
23/04/2012 #2006


Ok Jona, recién termino de construir tu placa USB Trainer, en la pág. 51 de tu manual, ante último párrafo, escribes que el conector ICSP es solo para ser usado con el PicKit2, pero he cotejado los pines del PicKit3 y tienen la misma disposición, es decir, vale lo mismo para los dos, es correcto? mi otra pregunta es respecto del conector ICSP en si, porque es de doble hilera de pines?

Por último, si, tienes razón, son dos mundos diferentes y actualmente estoy en el medio.

leyendo un poco lo de dinoelectro, porque se debe convertir a un String?, siendo esta una variable de cadena consume mas memoria que un Integer

Cordiales Saludos
HFA
23/04/2012 #2007


Jona, no encuentro la versión 4.114 de CCS, tengo la versión 3.249 y la 4.57, con cual me quedo para que sea mas compatible con la que tu usaste.

Cordiales Saludos
HFA
24/04/2012 #2008


Usb
Mushito dijo: Ver Mensaje
Revisa esta pagina tal ves te ayude
http://protonbasic.wordpress.com/usb/usb-hid/
Bueno Moyano y Mushito, muchas gracias por su tiempo y aportes, pues la verdad lamento no haber sido mas concreto con mi aplicación. Es que hasta ahora estaba trabajando con esto y pues cuando uno arranca siempre tiene un universo que va conociendo poco a poco, efectivamente quiero aprender esto de pelos, y estoy lea que lea sobre toda esta aplicacion, ahí he aprendido algunas cosas, la verdad no habia podido ingresar antes pues estaba ocupado con otras cosas pero en este momento voy a retomar lo de USB

Cualquier cosa los seguiré molestando
24/04/2012 #2009

Avatar de piposon

dinoelectro dijo: Ver Mensaje
bueno esa seria una de las soluciones... pero ya lo solucione; lo que hice fue convertir el numero en un "string" luego envio al PC

garacis moyano por tu interes!!!

Hola dinoelectro,
ya que este es el mismo tema, que podría enseñarme cómo almacenar una cadena y enviarlo al microcontrolador? Esto es lo que estoy tratando de hacer y no tengo éxito.
Gracias por su atención, saludos!
26/04/2012 #2010


Hola, hago una simulación con el ordenador (sin conectar el pic ni nada) que me han asignado para el proyecto y me da este error:



Sin embargo en el ordenador del profesor no hay ningun problema, que puede estar fallando? el paquete de visa???

P.D. esta la orden de atras pulsada, pero falla tmb sin ella.
26/04/2012 #2011

Avatar de Moyano Jonathan

Ok Jona, recién termino de construir tu placa USB Trainer, en la pág. 51 de tu manual, ante último párrafo, escribes que el conector ICSP es solo para ser usado con el PicKit2, pero he cotejado los pines del PicKit3 y tienen la misma disposición, es decir, vale lo mismo para los dos, es correcto? mi otra pregunta es respecto del conector ICSP en si, porque es de doble hilera de pines?
Si es correcto podés usarlo con el pickit2 o el pickit3. Lo de la doble hilera de pines vas a tener que hacer un pequeño adaptador...pero es cuestión de ver como están dispuestos los pines. No tiene mucha complicación.

leyendo un poco lo de dinoelectro, porque se debe convertir a un String?, siendo esta una variable de cadena consume mas memoria que un Integer
No siempre es necesario...depende de la aplicación en particular.

Jona, no encuentro la versión 4.114 de CCS, tengo la versión 3.249 y la 4.57, con cual me quedo para que sea mas compatible con la que tu usaste.

Cordiales Saludos
HFA
la 4.57 es la más nueva...pero te recomiendo que te consigas una versión más nueva...el tutorial que hice lo planteé con el 4.114, por lo que vas a tener que hacer algunas modificaciones. Te vas a tener que poner a investigar en los ejemplos de CCS los cambios que te digo.

Hola dinoelectro,
ya que este es el mismo tema, que podría enseñarme cómo almacenar una cadena y enviarlo al microcontrolador? Esto es lo que estoy tratando de hacer y no tengo éxito.
Gracias por su atención, saludos!
En las últimas versiones de CCS se ha incluido en las librerías la posibilidad de enviar paquetes tipo string por USB. Es cuestión de que leas la documentación que te da el fabricante para poder implementar la función en tu proyecto.
26/04/2012 #2012


Hpola Jona, conecte el usb trainer y... Dispositivo Desconocido, te comento, a la aplicación del pic no le modifique nada, es mas, utilizé el .exe y .hex que tu compilaste justamente, encontré que hay diferencias entre los valores de algunos capas que figuran en el esquemático pero que en la serigrafía del lado componentes figuran otros, grabé la aplicación del pic con el pickit3, la verifiqué, desconecte todo, volví a conectar usb trainer al programador he hice una lectura de lo grabado en el pic, aparentemente estaría todo bien, que podrá ser? o algo me está faltando en este nuevo mundo.

Cordiales Saludos
HFA
Imágenes Adjuntas
Tipo de Archivo: jpg Dispositivo Desconocido.jpg (36,4 KB (Kilobytes), 21 visitas)
26/04/2012 #2013

Avatar de Moyano Jonathan

Si cargaste el mismo ejemplo que probé yo el problema está en el hardware. Acabo de revisar mi entrenador y hay un error en el esquemático, pero el PCB está bien.
Si vos mismo diseñaste una placa según el esquemático, los pines D+ Y D- están al revés. Ahora si usaste mi PCB, tiene que estar bien.

Si usaste mi PCB:
- Revisar todas las soldaduras y el montaje en general.
- Los capacitores importante son los del cristal que tienen que ser de 22pf y el de Vusb que tiene que ser de 470nF para arriba.

Por lo demás no entiendo por que te puede estar fallando.

Saludos !
01/05/2012 #2014


venturl dijo: Ver Mensaje
Finalmente solucione los problemas con el driver y la placa funciona correctamente.

Tengo este codigo metido en el pic:

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CP UDIV1,VREGEN
#use delay(clock=48000000)
#include ".\libreria\usb_cdc.h"
#rom int 0xf00000={1,2,3,4}
#define led PIN_A0
void main() {
int8 x;
set_tris_b(0x0);
output_b(0);
usb_cdc_init();
usb_init();

while(!usb_cdc_connected()) {}
do{usb_task();
if (usb_enumerated()){
if(usb_cdc_kbhit()){
x=usb_cdc_getc();
output_b(x);
output_high(led);

}
}
}while (TRUE); // bucle infinito.
//// jokelnice_cdc_enviar
}


Mediante labview tengo un .vi con unos simples pulsadores de dirección (arriba, abajo...) y por el puerto B sale 0000 0000 sin embargo, al arrancar el labview (run) la combinacion por el puerto B continuamente es (0110 1101) incluso sin haber pulsado nada (tan solo iniciando el labview y RUN). Y no cambia sea cual sea lo que pulsemos.

P.D. el led se enciende al hacer run en el labview.

He hecho una simulacion del .vi y los datos que envia por el puerto B son los correctos, sin embargo los puertos que leo en el puerto B con el multimetro no lo son, y siguen siendo 0110 1101. ¿Podria ser que muestre la direccion de la memoria en lugar de lo que hay en ella?


Estoy desesperado, necesito solucionar este problema o mi proyecto de fin de carrera se vera comprometido y con ello mi graduacion. El profesor no nos está ayudando...

MUCHAS GRACIAS
02/05/2012 #2015


Hola a todo el mundo, es increible la capacidad de asimilacion de conceptos que teneis.
Primero dar las gracias a Moyano por los ejercicios y el manual, he sacado algunas cosas en limpio de la enorme cantidad de informacion que hay en este hilo, pero hay cosas que se me escapan que estoy seguro que son superfaciles, pero no logro dar con la tecla para hacerlas funcionar.

Estoy tratando de hacerme un joystick USB con un 18f2550 y que windows lo reconozca como tal y me aparezca como dispositivo de juego.
Esta parte la he conseguido modificando el ejemplo del raton HID que viene con el compilador CCS.
Lo que hago es que con el programa HID Descriptor Tool, abro el ejemplo que trae para joystick y este descriptor es el que uso para la base de mi joystick.

Este joy de ejemplo trae un eje acelerador, analogico, unos ejes X e Y, analogicos, 4 botones y un HAT switch, que basicamente son otros cuatro botones.

Con esta configuracion he conseguido hacer el input analogico del eje acelerador, activando el conversor analogico/digital del pic en el pin AN0 y poniendo este pin como entrada.

Conseguido esto y cuando ya creia que tenia todo mas o menos encaminado, me he atascado completamente, ya que si eleminos elementos del descritor, como por ejemplo el HAT switch, el dispositivo deja de funcionar y la entrada del pin AN0 deja de realizarse correctamente, no recive señal por esta patilla.
Esto me deja bastate limitado, ya que yo lo que quiero es hacer un joy con 4 ejes y ningun boton, por lo menos por ahora.
Tambien he intentado crear mi propio descriptor desde cero con el HID Descriptor Tool, de forma que tenga un eje acelerador, otro freno, otro embrague y otro wheel, pero lo mas que he coseguido es que aparezcan solo los elementos acelerador y freno en las propiedades del dispositivo y ninguno de los dos acepta entradas, no se por que.

Creo que el problema que tengo es en la variacion del tamaño del descriptor, pero no veo mas alla.

Lo tengo montado en una placa de prototipado y no uso programas de simulacion, cada vez que modifico algo, lo compilo, lo grabo en el pic y lo pruebo.

Creo que en este foro encontre las instrucciones para que en el administrador de dispositovos aparezcan los que no estan conectados y cada ver que desenchufo mi dispositivo lo elimino de la lista para que no interfiera en las pruebas, cosa que me paso al pricipio.

Aqui les dejo el codigo que voy probando y que no consigo evolucionar

Joy.c

Código:
  #include <18F2550.h>
  #DEVICE ADC=10
  //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
  //// FULL SPEED
  #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  #use delay(clock=48000000)

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

//turn on EP1 for IN interrupt transfers.  (IN = PIC -> PC)
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8     //max packet size of this endpoint

#include <pic18_usb.h>   //Microchip PIC18Fxx5x hardware layer for usb.c
#include <usb_desc.h>    //USB Config and Device descriptors for this USB device
#include <usb.c>        //handles usb setup tokens and get descriptor reports


/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// When called periodically, displays debugging information over serial
// to display enumeration and connection states.  Also lights LED2 and LED3
// based upon enumeration and connection status.
//
/////////////////////////////////////////////////////////////////////////////
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();


   last_connected=new_connected;
   last_enumerated=new_enumerated;
}

void main(void) 
{

   int8 out_data[4];


   set_tris_a(0b000001);  //Configuro el pin AN0 del puerto A como entrada
   set_tris_b (0b00000000); 
   set_tris_c (0b00000000); 

   SETUP_ADC(ADC_CLOCK_DIV_64 || VSS_VREF);
   SETUP_ADC_PORTS(AN0);
   usb_init_cs();

   while (TRUE) 
   {
      usb_task();
      usb_debug_task();
      if (usb_enumerated()) 
      {
         SET_ADC_CHANNEL(PIN_A0);
         out_data[0]=read_adc();
         out_data[1]=0x00000000;
         out_data[2]=0x00000000;
         out_data[3]=0x00000000;
         usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);
       }
   }
}


usb_desc.h
Código:
#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

///////// config options, although it's best to leave alone for this demo /////
#define  USB_CONFIG_PID       0x0022
#define  USB_CONFIG_VID       0x0461
#define  USB_CONFIG_BUS_POWER 100   //100mA  (range is 0..500)
#define  USB_CONFIG_VERSION   0x0200      //01.00  //range is 00.00 to 99.99
//////// end config ///////////////////////////////////////////////////////////



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

//turn on EP1 for IN interrupt transfers.  (IN = PIC -> PC)
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT 

#define USB_EP1_TX_SIZE 8     //max packet size of this endpoint

#include <usb.h>

   //////////////////////////////////////////////////////////////////
   ///
   ///  HID Report.  Tells HID driver how to handle and deal with
   ///  received data.  HID Reports can be extremely complex,
   ///  see HID specifcation for help on writing your own.
   ///
   ///  This examples configures HID driver to take received data
   ///  as mouse x, y and button data.
   ///
   //////////////////////////////////////////////////////////////////

   const char USB_CLASS_SPECIFIC_DESC[] = 
   {
      0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
      0x15, 0x00,                    // LOGICAL_MINIMUM (0)
      0x09, 0x04,                    // USAGE (Joystick)
      0xa1, 0x01,                    // COLLECTION (Application)
      0x05, 0x02,                    //   USAGE_PAGE (Simulation Controls)
      0x09, 0xbb,                    //   USAGE (Throttle)
      0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
      0x26, 0xff, 0x00,                    //   LOGICAL_MAXIMUM (255)
      0x75, 0x08,                    //   REPORT_SIZE (10)
      0x95, 0x01,                    //   REPORT_COUNT (1)
      0x81, 0x02,                    //   INPUT (Data,Var,Abs)
      0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
      0x09, 0x01,                    //   USAGE (Pointer)
      0xa1, 0x00,                    //   COLLECTION (Physical)
      0x09, 0x30,                    //     USAGE (X)
      0x09, 0x31,                    //     USAGE (Y)
      0x95, 0x02,                    //     REPORT_COUNT (2)
      0x81, 0x02,                    //     INPUT (Data,Var,Abs)
      0xc0,                          //   END_COLLECTION
      0x09, 0x39,                    //   USAGE (Hat switch)
      0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
      0x25, 0x03,                    //   LOGICAL_MAXIMUM (3)
      0x35, 0x00,                    //   PHYSICAL_MINIMUM (0)
      0x46, 0x0e, 0x01,              //   PHYSICAL_MAXIMUM (270)
      0x65, 0x14,                    //   UNIT (Eng Rot:Angular Pos)
      0x75, 0x04,                    //   REPORT_SIZE (4)
      0x95, 0x01,                    //   REPORT_COUNT (1)
      0x81, 0x02,                    //   INPUT (Data,Var,Abs)
      0x05, 0x09,                    //   USAGE_PAGE (Button)
      0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
      0x29, 0x04,                    //   USAGE_MAXIMUM (Button 4)
      0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
      0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
      0x75, 0x01,                    //   REPORT_SIZE (1)
      0x95, 0x04,                    //   REPORT_COUNT (4)
      0x55, 0x00,                    //   UNIT_EXPONENT (0)
      0x65, 0x00,                    //   UNIT (None)
      0x81, 0x02,                    //   INPUT (Data,Var,Abs)
      0xc0                           // END_COLLECTION 
    };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines where to look for it in the const
   // USB_CLASS_SPECIFIC_DESC[] array.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         0
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines the size of that descriptor.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
      sizeof(USB_CLASS_SPECIFIC_DESC)
   };



//////////////////////////////////////////////////////////////////
///
///   start config descriptor
///   right now we only support one configuration descriptor.
///   the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////

   #DEFINE USB_TOTAL_CONFIG_LEN      34 //config+interface+class+endpoint

   const char USB_CONFIG_DESC[] = {
   //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
      //    config(s)
      //    interface(s)
      //    class(es)
      //    endpoint(s)

   //config_descriptor for config index 1
         USB_DESC_CONFIG_LEN, //length of descriptor size          ==1
         USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02)     ==2
         USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config      ==3,4
         1, //number of interfaces this device supports       ==5
         0x01, //identifier for this configuration.  (IF we had more than one configurations)      ==6
         0x00, //index of string descriptor for this configuration      ==7
        #if USB_CONFIG_BUS_POWER
         0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==8
        #else
         0x80, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==8
        #endif
         USB_CONFIG_BUS_POWER/2, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)   ==9

   //interface descriptor 1
         USB_DESC_INTERFACE_LEN, //length of descriptor      =10
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)       =11
         0x00, //number defining this interface (IF we had more than one interface)    ==12
         0x00, //alternate setting     ==13
         1, //number of endpoints, except 0     ==14
         0x03, //class code, 03 = HID     ==15
         0x01, //subclass code //boot     ==16
         0x02, //protocol code      ==17
         0x00, //index of string descriptor for interface      ==18

   //class descriptor 1  (HID)
         USB_DESC_CLASS_LEN, //length of descriptor    ==19
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)      ==20
         0x00,0x01, //hid class release number (1.0) (try 1.10)      ==21,22
         0x00, //localized country code (0 = none)       ==23
         0x01, //number of hid class descrptors that follow (1)      ==24
         0x22, //report descriptor type (0x22 == HID)                ==25
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, //length of report descriptor            ==26,27

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==28
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==29
         0x81, //endpoint number and direction (0x81 = EP1 IN)       ==30
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)         ==31
         USB_EP1_TX_SIZE,0x00, //maximum packet size supported                  ==32,33
         10  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices)     ==34
   };


   //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
   //since we can't make pointers to constants in certain pic16s, this is an offset table to find
   //  a specific descriptor in the above table.

   //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
   //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
   #define USB_NUM_HID_INTERFACES   1

   //the maximum number of interfaces seen on any config
   //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
   #define USB_MAX_NUM_INTERFACES   1

   //define how many interfaces there are per config.  [0] is the first config, etc.
   const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};

   //define where to find class descriptors
   //first dimension is the config number
   //second dimension specifies which interface
   //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
   //if a class descriptor is not valid, set the value to 0xFFFF
   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_NUM_HID_INTERFACES][1]=
   {
   //config 1
      //interface 0
         //class 1
         18
   };


   #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
      #error USB_TOTAL_CONFIG_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start device descriptors
///
//////////////////////////////////////////////////////////////////

   const char USB_DEVICE_DESC[] = {
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==1
         0x01, //the constant DEVICE (DEVICE 0x01)  ==2
         0x10,0x01, //usb version in bcd (pic167xx is 1.1) ==3,4
         0x00, //class code ==5
         0x00, //subclass code ==6
         0x00, //protocol code ==7
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==8
         USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id       ==9, 10
         USB_CONFIG_PID & 0xFF, ((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff       ==11, 12
         USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==15
         0x02, //index of string descriptor of the product  ==16
         0x00, //index of string descriptor of serial number  ==17
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==18
   };

   #if (sizeof(USB_DEVICE_DESC) != USB_DESC_DEVICE_LEN)
      #error USB_DESC_DEVICE_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start string descriptors
///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
///
//////////////////////////////////////////////////////////////////

//the offset of the starting location of each string.  offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
const char USB_STRING_DESC_OFFSET[]={0,4,12};

//number of strings you have, including string 0.
#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)

// Here is where the "CCS" Manufacturer string and "CCS USB Mouse" are stored.
// Strings are saved as unicode.
char const USB_STRING_DESC[]={
   //string 0
         4, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         0x09,0x04,   //Microsoft Defined for US-English
   //string 1
         8, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'C',0,
         'S',0,
   //string 2
         28, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'C',0,
         'S',0,
         ' ',0,
         'U',0,
         'S',0,
         'B',0,
         ' ',0,
         'M',0,
         'o',0,
         'u',0,
         's',0,
         'e',0
};


Como podeis ve el archivo descriptor es practicamente igual que el del ejemplo del ratin que viene con el compilador, por que como he dicho solo he modificado la parte de la descripcion del despositivo, pero no se si me falta por modificar mas cosas, ni que cosas deberia modificar cuadno le añado mas ejes y le quito los botones a la descripcion des dispositivo.

Esta parte de la modificacion de los desciptores y todo lo que conlleva, por desgracias no esta explicado en el gran manual de moyano sobre este pic y el USB
02/05/2012 #2016

Avatar de Moyano Jonathan

Hola como estás kyle. En el foro hay varios hilos que tratan sobre el tema..es cuestión de que los busques para poder analizar mejor el tema...tu problema está en los descriptores...vas a tener que investigar más sobre como es su estructura para poder crear tu programa.

Saludos !
03/05/2012 #2017


Hola Moyano:
Necesito de tus sabios consejos…Estoy haciendo un medidor de distancia según la siguiente pagina.
http://www.rentron.com/Micro-Bot/IR_Sonar.htm
La variable es….
Distance VAR WORD
¿Cómo podría enviar este valor a la PC (laptop) por USB HID (mejor si lo hago con easyDriver y VB60)
Gracias de antemano.
Saludos
03/05/2012 #2018

Avatar de Moyano Jonathan

Si lo que necesitas es enviar una variables de 16 bits...podés dividir en dato por 2 enviarlo por USB y luego en una aplicación en la PC lo armas nuevamente.
15/05/2012 #2019


Hola mis amigos!
Les consulto por un problemita que tal vez le haya sucedido a alguien.
Hace unos meses pude hacer funcionar el proyecto que publicó Moyano para comunicar
una tarjeta entrenadora de la comunicación USB HID en visual basic.net usando el PIC
18F2550 y fue todo un éxito!
El ejecutable de la aplicación .NET fue compilado en Windows7 de 32 bits.
Ahora bien, al copiar ese ejecutable .exe y la dll que tiene las funciones HID en una carpeta aparte
en otra máquina con Windows7 de 64 bits, no funcionó, me arroja una excepción...
Pregunto que debería hacer para que funcione bajo 64 bits y si la dll puede funcionar también bajo 64 bits.
Muchísimas gracias y espero ansioso alguna ayudita.
Elflamen.
15/05/2012 #2020

Avatar de Moyano Jonathan

Pregunto que debería hacer para que funcione bajo 64 bits y si la dll puede funcionar también bajo 64 bits.
Muchísimas gracias y espero ansioso alguna ayudita.
Elflamen.
Probá con 2 cosas:

- Copiando la DLL a la carpeta WOW64 de windows.
- Recompilando el proyecto en la máquina con windows de 64 bits.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.