Autor Tema: no se reconoce dispositivo hid con 18f4550  (Leído 6114 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gio013

  • PIC10
  • *
  • Mensajes: 27
no se reconoce dispositivo hid con 18f4550
« en: 18 de Mayo de 2010, 23:17:32 »
XD vuelvo yo .. jejeje...


bueno el problema es el siguiente ando programando un sw para un usb hid con un micro 18f4550, el compilador pic c no registra ningun error pero cuando lo quemo el dispositivo usb no lo reconoce el pc, ni siquiera dice que ay un dispositivo en el puerto.....
si alguna persona puede colaborar se lo agradecería mucho...

Código: [Seleccionar]
#include <18F4550.H>
#device ADC=10
#build(reset=0x1000)
#build(interrupt=0x1008)
#org 0,0x0FFF void arranque() {}

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN

#use delay(clock=48000000)

#use fast_io(b)

//Utilizamos todas las directivas para un dispositivo HID.
#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    8  //allocate 8 bytes in the hardware for transmission

//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    8  //allocate 8 bytes in the hardware for reception

///////////////////////////////////////////////////////////////////////////////////////////
//
// Tamaño de los paquetes
#define PAQUETE_TX_PIC     27 //Tamaño del paquete de transmision del PIC o RX del PC
#define PAQUETE_RX_PIC     2  //Tamaño del paquete de recepcion   del PIC o TX del PC
//
///////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
#include <mi_descriptor3.h> //USB Configuration and Device descriptors for this UBS device
#include <usb.c>         //handles usb setup tokens and get descriptor reports


/////////////////////////////////////////////////////////////////////////////


#define Boton1 INPUT(PIN_A2)
#define Boton2 INPUT(PIN_A4)


void main(void) {
   int envia[PAQUETE_TX_PIC];
   int recibe[PAQUETE_RX_PIC];
   int contador=0;
   set_tris_c(0xF0);
   output_a(0b1);


   usb_init();                      //Se inicializa el USB
   //usb_init_cs();

   usb_task();                      //Se habilita el usb e interrupciones
   usb_wait_for_enumeration();      //Se espera hasta que el dispositivo sea configurado por el host


   while (TRUE) {
      usb_task();
      if (usb_enumerated()) {       //Si el dispositivo HID se encuentra configurado


                envia[0]=input(PIN_B0);
                envia[1]=input(PIN_B1);
                envia[2]=input(PIN_B2);
               ....
               ...
               ..
               .
               .

                  usb_put_packet(1, envia, PAQUETE_TX_PIC, USB_DTS_TOGGLE);

            }

         delay_ms(1);
      }
   }



este es mi descriptor
Código: [Seleccionar]

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#include <usb.h>


   const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,    // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,       // Collection = Application
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum

      0x15, 0x80,        // Logical minimum (-128)
      0x25, 0x7F,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, PAQUETE_TX_PIC,   // Tamaño Paquete Recepcion del PC
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, PAQUETE_RX_PIC,     //Tamaño Paquete Transmision del PC
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection
   };

   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         0
   };

 
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         32
   };



   #DEFINE USB_TOTAL_CONFIG_LEN      41  //config+interface+class+endpoint+endpoint (2 endpoints)

   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, //00 index of string descriptor for this configuration      ==7
         0x80, //OxC0  bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==8
         0x32, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)

   //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
         2, //number of endpoins, except 0 (pic167xx has 3, but we dont have to use all).       ==14
         0x03, //class code, 03 = HID     ==15
         0x00, //subclass code //boot     ==16
         0x00, //protocol code      ==17
         0x00, //00 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
         0x03, //transfer type supported (0x03 is interrupt)         ==31
         USB_EP1_TX_SIZE,0x00, //maximum packet size supported                  ==32,33
         20,  //250 polling interval, in ms.  (cant be smaller than 10)      ==34

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==35
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==36
         0x01, //endpoint number and direction (0x01 = EP1 OUT)      ==37
         0x03, //transfer type supported (0x03 is interrupt)         ==38
         USB_EP1_RX_SIZE,0x00, //maximum packet size supported                  ==39,40
         10 //polling interval, in ms.  (cant be smaller than 10)    ==41
   };

   //****** 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};

   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][1][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[USB_DESC_DEVICE_LEN] ={
      //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
         0xD8,0x04, //vendor id (0x04D8 is Microchip)
         0x34,0x12, //product id is 0x1234  //don't use ffff says usb-by-example guy.  oops
         0x00,0x01, //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
   };




char USB_STRING_DESC_OFFSET[]={0,4,12};//0 mas primer string,1er +2do string

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)
         'G',0,
         'i',0,
         'o',0,

   //string 2
         12, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'R',0,
         'a',0,
         'm',0,
         's',0,
         'e',0,
         'r',0,



};

#ENDIF







gracias por su atención.........


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: no se reconoce dispositivo hid con 18f4550
« Respuesta #1 en: 19 de Mayo de 2010, 01:57:01 »
¿Puedes poner el esquema que has usado?

Desconectado gio013

  • PIC10
  • *
  • Mensajes: 27
Re: no se reconoce dispositivo hid con 18f4550
« Respuesta #2 en: 19 de Mayo de 2010, 02:41:45 »
que  es lo podría fallar con el circuito??¿....
es que se que el circuito sirve....por que probé otro programa que yo no hice pero hecho en basic. y funcionaba perfectamente....= mañana temprano dibujare el esquema,, y pus por ahora quería saber si existe algún problema con el sw, es decir la ausencia de alguna linea de código.., el oscilador que uso es uno de 20Mhz....


gracias por leer.

Desconectado gio013

  • PIC10
  • *
  • Mensajes: 27
Re: no se reconoce dispositivo hid con 18f4550
« Respuesta #3 en: 19 de Mayo de 2010, 22:40:25 »
bueno ya solucione el problema..... era algo en el descriptor.....XD  -después coloco detalles es que ando un poco colgado con el tiempo...-
ahora me surge otra duda....
para que es el External USB transceiver VMO output, que funcion cumple?
cuando coloco ese pin en cero (pin 32 del 18f4550), se me resetea el micro.....
y se supone que debo usarlo como entrada...:S no de reset.


gracias por leer...

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: no se reconoce dispositivo hid con 18f4550
« Respuesta #4 en: 20 de Mayo de 2010, 02:11:46 »
la respuesta está en la datasheet, específicamente en la section 17.2.2.2 aunque yo no me imagino una aplicación que necesite usar un modulo usb externo, tal vez sea para ahorrar RAM o vaya usted a saber para que  :D

y en cuanto a VMO creo que es el pin 35


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado gio013

  • PIC10
  • *
  • Mensajes: 27
Re: no se reconoce dispositivo hid con 18f4550
« Respuesta #5 en: 23 de Mayo de 2010, 00:12:19 »
muchas gracias a todos por leer y contestar...
la verdad me alegra mucho que sean tan atentos
 :-/


Desconectado EdoVdd

  • PIC10
  • *
  • Mensajes: 3
Re: no se reconoce dispositivo hid con 18f4550
« Respuesta #6 en: 11 de Junio de 2010, 12:16:36 »
Esta es la primera vez que participo en un foro...
Espero no incumplir las normas  :?


No tengo mucha idea de como se deben escribir los descriptors de un HID con el CCS pero me parece que donde pones "ramser"(string2) juraria que la longitud es de 14 y no de 12.

Por lo que tengo entendido seria 14 = (numero de letras + 1)*2 = (6+1) *2
de todas formas el problema no creo que este ahi, ¡suerte! a ver si te funciona.