TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kaki en 16 de Septiembre de 2010, 17:21:56

Título: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 16 de Septiembre de 2010, 17:21:56
Bueno la verdad que me lei todos los temas de este foro, campio todos los capacitoere, etc. no se cual es el problema que tengo que cuendo conectecto el USB me dice que no reconoce el Dispositivo. que el dispositivo se tubo que cerrar por un mal funcionamiento.

El programa que utiliso esta en CCS y es un ejemplo que saque de este foto.
La conexion que utiliso es HID.
El SO del la PC es Win7.

en el protoboar tengo el Capacitor de 47uF electrolitico en la pata Vbus y tengo el D+ D- conectados a la para 2 y 3 de des conector USB, tengo un capacito 104 entre el + y - del micro, y uso un cristal de 20Mhz(puede ser un error que en el codigo le puse XTPLL como fuce. a lo mejor va HS).

Codigo:

Código: [Seleccionar]
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#DEVICE ADC=8 // CAD con 8 bits de resolución , justificación a la derecha.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// NOVREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT // Definición del tamaño del buffer de salida.
#define USB_EP1_TX_SIZE 1

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT // Definición del tamaño del buffer de entrada.
#define USB_EP1_RX_SIZE 1

/*********************************************************************************************************/

 #define use_portb_lcd TRUE // Puerto B usado para el LCD.

// Librerías utilizadas.
#include <LCD.c>
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <usb_desc_hid.h> // Descriptores USB.

#include <usb.c> // Funciones del USB.
/*********************************************************************************************************/

// Variables globales.
long valor; // Variable que guarda el valor del ADC.


void main() {
int8 dato[1];  // Variable que va a guardar el valor del ADC.
OUTPUT_A(0);  // todos salidas
OUTPUT_B(0) ;            
OUTPUT_C(0);

  
   set_tris_a(0x3);  // ra0=entradas, los demas=salida
   set_tris_b(0x0);  
   set_tris_c(0x0);                      
   setup_adc_ports( AN0 || VSS_VDD );  // canal AN0, Vref+ = Vdd, Vref- = Vss
   setup_adc(ADC_CLOCK_DIV_64);
   set_adc_channel(0);
  
   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
   while(1){ // bucle infinito
      valor = read_adc();
      dato[0] = valor;
      usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
                    usb_put_packet(1,dato,1,USB_DTS_TOGGLE); // Mando el valor del adc por USB.
                  
                  }
   }
}

Libreria usb_desc_hid.h:

Código: [Seleccionar]
//////////////////////////////////////////////////////////////////
///
///   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 ==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
         0x04,0xD8, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
0x00,0x01, //product id ==11,12 //don't use ffff says usb-by-example guy. oops
    0x06,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
   };
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: ALE1973 en 16 de Septiembre de 2010, 18:35:57
Hola, para los fuses yo tengo estos en un joystick que hice USB.

Código: C
  1. #include <18F2550.h>
  2. #device ADC = 10
  3. #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  4. #use delay(clock=48000000)

Casi seguro que XTPLL esta mal, proba cambiando a los fuses que te pase, yo lo uso con un xtal de 20mhz y funciona sin dramas

Saludos.
Alejandro.
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: migsantiago en 16 de Septiembre de 2010, 19:08:04
Hola, XTPLL está bien ya que es un XTAL de 4MHz con PLLx1 y CPUDIVx1.  ;-)
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 16 de Septiembre de 2010, 19:18:28
Yo uso 20Mhz. Para mi va  HSPLL,PLL5,CPUDIV1

Bueno ya probe u igual sigue pasando lo mismo!! gracias igual.

Dejo una imagaen de lo que me pasa en pa pc!! saludos
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: migsantiago en 16 de Septiembre de 2010, 20:20:08
Yo uso 20Mhz. Para mi va  HSPLL,PLL5,CPUDIV1

Bueno ya probe u igual sigue pasando lo mismo!! gracias igual.

Dejo una imagaen de lo que me pasa en pa pc!! saludos

Ah es que tu primer mensaje dice otra cosa.

Código: [Seleccionar]
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 16 de Septiembre de 2010, 20:29:44
veo que no comprendiste mi mensaje.... dise eso en el codigo pero yo dije que para mi eso estaba mal ya que uso un cristal de 20Mhs.Saludos
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: migsantiago en 16 de Septiembre de 2010, 22:50:53
Entendido y anotado.  ;-)
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 16 de Septiembre de 2010, 23:05:48
jajaa!! dame un respuesta pero jejeje :D
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: migsantiago en 17 de Septiembre de 2010, 10:46:33
jajaa!! dame un respuesta pero jejeje :D

Hay como 5 temas activos en el foro con el mismo problema de que el USB no les responde. Han habido muchos más temas con la misma temática.

Con ayuda del buscador visitaría cada uno de ellos y aplicaría las soluciones ahí propuestas.
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: BrunoF en 17 de Septiembre de 2010, 11:05:49
Mal funcionamiento del dispositivo??? Mmm...me hace acordar a cuando tenía  los cables de D+ y D- del USB cruzados...
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 17 de Septiembre de 2010, 11:15:17
ya los lei todos los temas pero todos....

Si mal funcionamiento...los cables ya los inverti hice 500 mil pruevas!!

 Saludos...
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: migsantiago en 17 de Septiembre de 2010, 12:53:29
¿Y si tu pic ya se dañó? ¿Puedes probar con otro?

¿Tu puerto es USB 2.0?
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 17 de Septiembre de 2010, 13:08:41
no creo por que el pic es nuevo. y con respecto a lo otro si es 2.0...la verda no probe con otro puerto
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: Felixls en 17 de Septiembre de 2010, 13:28:35
Hola, podrías realizar las siguientes verificaciones

1. Prueba con otro cristal
2. Cambia el condensador electrolítico de 47uF por un condensador cerámico de 470nF
3. Prueba un código más simple, ejemplo encender/apagar un led al enumerarse el dispositivo
4. El protoboard es viejo? revisa las conecciones.
5. Verifica si hay comunicación con algún software de snifeo de usb.
6. Verifica los voltajes en la pata VBUS, D+ D- y 5V
7. etc.

saludos
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: MLO__ en 20 de Septiembre de 2010, 11:30:04
Hola.

Puedes subir un esquemático de tu diseño?

Saludos
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 20 de Septiembre de 2010, 23:09:14
Bueno modifique un poco el codigo para que me ponga en un lcd cuando esta enumerado el puerto y cuando no. El problema es que me aparece que no esta Enumerdao y del lado de la pc no me aparece nada. no se si es bueno o malo que no aparesca nada de lado de la pc, El error que tenia eran los capacitores ceramicos del oscilador ahora le puse uno de 18pf.

Aca les dejo el codigo:

Código: [Seleccionar]
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOLVP,NOPROTECT,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(oscillator=48M)


//LCD
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS   PIN_B1
#define LCD_E   PIN_B2
//#define LCD_RW  PIN_C1

//USB
#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT // Definición del tamaño del buffer de salida.
#define USB_EP1_TX_SIZE 1
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT // Definición del tamaño del buffer de entrada.
#define USB_EP1_RX_SIZE 1

#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <USB_easyHID_descriptores.h>
//#include <usb_desc_mouse.h> // Descriptores USB.
#include <usb.c> // Funciones del USB.
#include "LCD.lib"


void main()
{
   int dato=0;
   lcd_init();
   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
   for(;;){
      usb_task(); // Configuramos el puerto USB.
      if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
      {
       lcd_gotoxy(1,1);   
       printf(lcd_putc,"USB Enumerado  \n"); 
      }else{
      lcd_gotoxy(1,1);   
       printf(lcd_putc,"USB NO Enumerado  \n");   
     }
   }
}

Si ven algo raro comennten..

Mas tarde subo el esquema
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: ALE1973 en 21 de Septiembre de 2010, 00:38:43
Hola, los descriptores que usas, son correctos, solía tener ese problema cuando el descriptor estaba equivocado.
Pega el código que tienes para el descriptor.

Saludos
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 21 de Septiembre de 2010, 02:45:41
Código: [Seleccionar]
//////////////////////////////////////////////////////////////////
///
///   Descriptores del dispositivo
///
//////////////////////////////////////////////////////////////////

   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
         USB_DESC_DEVICE_LEN, // Longitud del reporte.
         0x01, // Constante del dispositivo = 1
         0x10,0x01, // Versión del USB 1.10.
         0x00, // Código de clase.
         0x00, // Código de subclase.
         0x00, // Código de protocolo.
         USB_MAX_EP0_PACKET_LENGTH, // Tamaño máximo del paquete de datos del endpoint 0 = 8 para HID.
         0x81,0x17, // Vendor  id =  decimal(6017), hexadecimal(1781) // Identificadores de easyHID.
         0xD0,0x07, // Product id =  decimal(2000), hexadecimal(7D0)
         0x00,0x01, // Número del dispositivo.
         0x01,
         0x02,
         0x00,
         USB_NUM_CONFIGURATIONS  // Número de posibles configuraciones.
   };


//////////////////////////////////////////////////////////////////
/// Descriptores del fabricante
//////////////////////////////////////////////////////////////////


char USB_STRING_DESC_OFFSET[]={0,4,12};

char const USB_STRING_DESC[]={
   // Primer descriptor.
         4, // Longitud del descriptor.
         USB_DESC_STRING_TYPE,
         0x09,0x04,   // Lenguaje id = Inglés (Definido por microsoft).
   // Segundo descriptor.
         8, // Longitud del descriptor.
         USB_DESC_STRING_TYPE, // Descriptor del compilador utilizado. (STRING) (Puede ser el nombre de la compañía)
         'C',0,
         'C',0,
         'S',0,
   // Tercer descriptor.
         32, // Longitud del descriptor.
         USB_DESC_STRING_TYPE, // Descriptor del fabricante: MoyaPIC_easyHID. (STRING)
         'M',0,
         'o',0,
         'y',0,
         'a',0,
         'P',0,
         'I',0,
         'C',0,
         '_',0,
         'e',0,
         'a',0,
         's',0,
         'y',0,
         'H',0,
         'I',0,
         'D',0
};

#ENDIF
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: ALE1973 en 21 de Septiembre de 2010, 08:04:26
Hola, no veo en el descriptor la parte donde defines la cantidad de datos a enviar, recibir, el tipo de dispositivo (mouse, joy, etc), en un descriptor que yo uso y funciona, antes de lo que tu pegas tengo todo esto:

Código: CSS
  1. ///////////////////////////////////////////////////////////////////////////
  2. ///                                                      ////
  3. ////                                                                   ////
  4. ///////////////////////////////////////////////////////////////////////////
  5.  
  6. #IFNDEF __USB_DESCRIPTORS__
  7. #DEFINE __USB_DESCRIPTORS__
  8.  
  9. #include <usb.h>
  10.  
  11.    //////////////////////////////////////////////////////////////////
  12.    ///
  13.    ///  HID Report.  Tells HID driver how to handle and deal with
  14.    ///  received data.  HID Reports can be extremely complex,
  15.    ///  see HID specifcation for help on writing your own.
  16.    ///
  17.    ///  First it defines a block for the first report ID for a mouse
  18.    ///  protocol.  Second it defines a block for the second report ID
  19.    ///  for a keyboard protocol.
  20.    ///
  21.    //////////////////////////////////////////////////////////////////
  22.  
  23. const char USB_CLASS_SPECIFIC_DESC[] = {
  24.     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
  25.     0x09, 0x04,                    // USAGE (Joystick)
  26.     0xa1, 0x01,                    // COLLECTION (Application)
  27.     0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
  28.     0x09, 0x01,                    //   USAGE (Pointer)
  29.     0xa1, 0x00,                    //   COLLECTION (Physical)
  30.     0x09, 0x30,                    //     USAGE (X)
  31.     0x09, 0x31,                    //     USAGE (Y)
  32.     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
  33.     0x26, 0xff, 0x03,              //     LOGICAL_MAXIMUM (255)
  34.     0x75, 0x10,                    //     REPORT_SIZE (16)
  35.     0x95, 0x02,                    //     REPORT_COUNT (2)
  36.     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
  37.     0xc0,                          //     END_COLLECTION
  38.     0x05, 0x02,                    //   USAGE_PAGE (Simulation Controls)
  39.     0x09, 0x01,                    //   USAGE (Flight Simulation Device)
  40.     0xa1, 0x00,                    //   COLLECTION (Physical)
  41.     0x09, 0xbb,                    //     USAGE (Throttle)
  42.     0x09, 0xba,                    //     USAGE (Rudder)
  43.     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
  44.     0x26, 0xff, 0x03,              //     LOGICAL_MAXIMUM (255)
  45.     0x75, 0x10,                    //     REPORT_SIZE (16)
  46.     0x95, 0x02,                    //     REPORT_COUNT (2)
  47.     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
  48.     0xc0,                          //     END_COLLECTION
  49.     0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
  50.     0x09, 0x01,                    //   USAGE (Pointer)
  51.     0xa1, 0x00,                    //   COLLECTION (Physical)
  52.     0x09, 0x33,                    //     USAGE (Rx)
  53.     0x09, 0x34,                    //     USAGE (Ry)
  54.     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
  55.     0x26, 0xff, 0x03,              //     LOGICAL_MAXIMUM (255)
  56.     0x75, 0x10,                    //     REPORT_SIZE (16)
  57.     0x95, 0x02,                    //     REPORT_COUNT (2)
  58.     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
  59.     0xc0,                          //     END_COLLECTION
  60.     0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
  61.     0x09, 0x01,                    //   USAGE (Pointer)
  62.     0xa1, 0x00,                    //   COLLECTION (Physical)
  63.     0x09, 0x36,                    //     USAGE (Slider)
  64.     0x09, 0x37,                    //     USAGE (Dial)
  65.     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
  66.     0x26, 0xff, 0x03,              //     LOGICAL_MAXIMUM (255)
  67.     0x75, 0x10,                    //     REPORT_SIZE (16)
  68.     0x95, 0x02,                    //     REPORT_COUNT (2)
  69.     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
  70.     0xc0,                          //     END_COLLECTION
  71.     0x05, 0x09,                    //   USAGE_PAGE (Button)
  72.     0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
  73.     0x29, 0x20,                    //   USAGE_MAXIMUM (Button 32)
  74.     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
  75.     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
  76.     0x75, 0x01,                    //   REPORT_SIZE (1)
  77.     0x95, 0x20,                    //   REPORT_COUNT (32)
  78.     0x55, 0x00,                    //   UNIT_EXPONENT (0)
  79.     0x65, 0x00,                    //   UNIT (None)
  80.     0x81, 0x02,                    //   INPUT (Data,Var,Abs)
  81.     0xc0                           // END_COLLECTION
  82.    };
  83.  
  84.  
  85.    //if a class has an extra descriptor not part of the config descriptor,
  86.    // this lookup table defines where to look for it in the const
  87.    // USB_CLASS_SPECIFIC_DESC[] array.
  88.    //first element is the config number (if your device has more than one config)
  89.    //second element is which interface number
  90.    //set element to 0xFFFF if this config/interface combo doesn't exist
  91.   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][1] =
  92.   {
  93.   //config 1
  94.      //interface 0
  95.         0
  96.   };
  97.  
  98.   //if a class has an extra descriptor not part of the config descriptor,
  99.   // this lookup table defines the size of that descriptor.
  100.   //first element is the config number (if your device has more than one config)
  101.   //second element is which interface number
  102.   //set element to 0xFFFF if this config/interface combo doesn't exist
  103.    const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][2] =
  104.    {
  105.    //config 1
  106.       //interface 0
  107.       sizeof(USB_CLASS_SPECIFIC_DESC)
  108.    };
  109.  
  110. //////////////////////////////////////////////////////////////////
  111. ///
  112. ///   start config descriptor
  113. ///   right now we only support one configuration descriptor.
  114. ///   the config, interface, class, and endpoint goes into this array.
  115. ///
  116. //////////////////////////////////////////////////////////////////
  117.  
  118.    #DEFINE USB_TOTAL_CONFIG_LEN      41 //config+interface+class+endpoint
  119.  
  120.    const char USB_CONFIG_DESC[] = {
  121.    //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
  122.       //    config(s)
  123.       //    interface(s)
  124.       //    class(es)
  125.       //    endpoint(s)
  126.  
  127.    //config_descriptor for config index 1
  128.          USB_DESC_CONFIG_LEN, //length of descriptor size          ==0
  129.          USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02)     ==1
  130.          USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config      ==2,3
  131.          1, //number of interfaces this device supports       ==4
  132.          0x01, //identifier for this configuration.  (IF we had more than one configurations)      ==5
  133.          0x00, //index of string descriptor for this configuration      ==6
  134.          0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==7
  135.         0x32, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)   //8
  136.  
  137.   //interface descriptor 1 (MOUSE)
  138.         USB_DESC_INTERFACE_LEN, //length of descriptor      =9
  139.         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)       =10
  140.         0x00, //number defining this interface (IF we had more than one interface)    ==11
  141.         0x00, //alternate setting     ==12
  142.         2, //number of endpoints for this interface  //13
  143.         0x03, //class code, 03 = HID     ==14
  144.         0x00, //subclass code //boot     ==15
  145.         0x00, //protocol code       ==16
  146.         0x00, //index of string descriptor for interface      ==17
  147.  
  148.   //class descriptor 1  (HID)
  149.         USB_DESC_CLASS_LEN, //length of descriptor    ==18
  150.         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)      ==19
  151.         0x00,0x01, //hid class release number (1.0) (try 1.10)      ==20,21
  152.         0x00, //localized country code (0 = none)       ==22
  153.         0x01, //number of hid class descrptors that follow (1)      ==23
  154.         0x22, //report descriptor type (0x22 == HID)                ==24
  155.         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, //length of report descriptor            ==25,26
  156.  
  157.   //endpoint descriptor 1 IN
  158.         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==27
  159.         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==28
  160.         0x81, //endpoint number and direction (0x81 = EP1 IN)       ==29
  161.         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)         ==30
  162.         USB_EP1_TX_SIZE,0x00, //maximum packet size supported                  ==31,32
  163.         10  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices)     ==33
  164.  
  165.   //endpoint descriptor 1 OUT
  166.         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==34
  167.         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==35
  168.         0x01, //endpoint number and direction (0x01 = EP1 OUT)       ==36
  169.         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)         ==37
  170.         USB_EP1_RX_SIZE,0x00, //maximum packet size supported                  ==38,39
  171.         10  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices)     ==40
  172.   };
  173.  
  174.  
  175.  
  176.   //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
  177.   //since we can't make pointers to constants in certain pic16s, this is an offset table to find
  178.    //  a specific descriptor in the above table.
  179.  
  180.    //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
  181.    //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
  182.    #define USB_NUM_HID_INTERFACES   1
  183.  
  184.    //the maximum number of interfaces seen on any config
  185.    //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
  186.    #define USB_MAX_NUM_INTERFACES   1
  187.  
  188.    //define how many interfaces there are per config.  [0] is the first config, etc.
  189.    const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};
  190.  
  191.    //define where to find class descriptors
  192.    //first dimension is the config number
  193.    //second dimension specifies which interface
  194.    //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
  195.    //if a class descriptor is not valid, set the value to 0xFFFF
  196.    const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][1][1]=
  197.    {
  198.    //config 1
  199.       //interface 0
  200.          //class 1
  201.          18
  202.    };
  203.  
  204.    //****** END CONFIG DESCRIPTOR LOOKUP TABLES ********
  205.  
  206.    #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
  207.       #error USB_TOTAL_CONFIG_LEN not defined correctly
  208.    #endif


Para mi en esto radica tu error.

Saludos.
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 21 de Septiembre de 2010, 12:48:13
me podrias esplicar un poco mas a que llamas descriptor?? por que yo supouse que era donde va el VIDyPID... Salguos.
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: ALE1973 en 21 de Septiembre de 2010, 15:22:01
kaki, no soy un experto en este tema, pero al iniciar el dispositivo, este le informa a la pc sus características, tipo de dispositivo, método de transferencia, cantidad de endpoints, tamaño, que significan los datos a enviar, en el caso de HID, etc, etc, no lo tengo claro 100% pero te dejo un par de ejemplos para que lo veas a ver si se te aclara mas.

http://helmpcb.com/Electronics/USBJoystick/HIDDescriptor.aspx    este es de la modificación de un joystick, da unos consejos muy buenos sobre algunas reglas a tener en cuenta al momento de armar el descriptor.

http://picmania.garcia-cuervo.net/usb_0_desencadenado.php   este debería de ser de lectura casi obligatoria... sobre todo por lo bien explicado que esta, te va a ayudar bastante, ademas tiene un par de ejemplos que te van a ayudar, copiá uno, y grabalo y verificas que tu hardware esta correcto así vas descartando.

Espero te sirva, cualquier duda en que pueda serte útil, con gusto.

Saludos
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 21 de Septiembre de 2010, 21:31:52
Definitiba mente es con migo... aca dejo el codigo completo, es muy simple que si se enumera el puerto osea si esta listo que prenda un LED, definitiba mente no pasa nada y en la pc menos de menos.

CODIGO:

Código: [Seleccionar]
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE  TRUE

#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8

#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8

#include <pic18_usb.h>
#include <.\include\usb_kbd_HID.h>              //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                                 //handles usb setup tokens and get descriptor reports
#include <ctype.h>

#define LED1    PIN_C0
#define LED_ON  output_high
#define LED_OFF output_low

void main() {

   LED_OFF(LED1);
   while (TRUE) {
      usb_task();

      if (usb_enumerated()) {
LED_ON(LED1);
      }
   }
}

DESCRIPTOR:

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
///                          usb_kbd_HID.h                             ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#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.
   ///
   ///  First it defines a block for the first report ID for a mouse
   ///  protocol.  Second it defines a block for the second report ID
   ///  for a keyboard protocol.
   ///
   //////////////////////////////////////////////////////////////////

   const char USB_CLASS_SPECIFIC_DESC[] = {
      0x05, 0x01, //usage page (generic desktop)   //0,1
      0x09, 0x06, //usage (keyboard)   //2,3
      0xA1, 0x01, //collection (application) //4,5
      0x85, 0x02, //report id (2)   //6,7
      0x05, 0x07, //usage page (key codes)   //8,9
      0x19, 0xE0, //usage min (224) //10,11
      0x29, 0xE7, //usage max (231) //12,13
      0x15, 0x00, //logical min (0) //14,15
      0x25, 0x01, //logical max (1) //16,17
      0x75, 0x01, //report size (1) //18,19
      0x95, 0x08, //report count (8)   //20, 21
      0x81, 0x02, //input (data, variable, absolute) [modifier byte] //22,23
      0x95, 0x01, //report count (1)   //24,25
      0x75, 0x08, //report size (8)    //26,27
      0x81, 0x01, //input (constant) [reserved byte]  //28,29
      0x95, 0x05, //report count (5)   //30,31
      0x75, 0x01, //report size (1)    //32,33
      0x05, 0x08, //usage page (page# for leds) //34,35
      0x19, 0x01, //usage min (1)   //36,37
      0x29, 0x05, //usage max (5)   //38,39
      0x91, 0x02, //output (data, var, abs) [led report] //40,41
      0x95, 0x01, //report count (1)   //42,43
      0x75, 0x03, //report size (3) //44,45
      0x91, 0x01, //output (constant) [led report padding]  //46,47
      0x95, 0x05, //report count (5)   //48,49
      0x75, 0x08, //report size (8) //50,51
      0x15, 0x00, //logical min (0) //52,53
      0x25, 0x65, //logical max (101)  //54,55
      0x05, 0x07, //usage page (key codes)   //56,57
      0x19, 0x00, //usage min (0)   //58,59
      0x29, 0x65, //usage max (101) //60,61
      0x81, 0x00, //input (data, array)   //62,63
      0xC0        //end collection  //64
   };

   //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][2] =
   {
   //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      41 //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          ==0
         USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02)     ==1
         USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config      ==2,3
         1, //number of interfaces this device supports       ==4
         0x01, //identifier for this configuration.  (IF we had more than one configurations)      ==5
         0x00, //index of string descriptor for this configuration      ==6
         0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==7
         0x32, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)   //8

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

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

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

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



   //****** 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][1][1]=
   {
   //config 1
      //interface 0
         //class 1
         18
   };

   //****** END CONFIG DESCRIPTOR LOOKUP TABLES ********

   #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
         0xD8,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
         0x57,0x00, //product id   ==11,12  //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
   };

   #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)

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)
         'R',0,
         'R',0,
         '2',0,
   //string 2
         46, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'U',0,
         'S',0,
         'B',0,
         ' ',0,
         'K',0,
         'e',0,
         'y',0,
         'b',0,
         'o',0,
         'a',0,
         'r',0,
         'd',0,
         ' ',0,
         'b',0,
         'y',0,
         ' ',0,
         'R',0,
         'e',0,
         'd',0,
         'p',0,
         'i',0,
         'c',0
};
Título: Re: Problemas con USB y Pic18f2550 CCS
Publicado por: kaki en 23 de Septiembre de 2010, 18:44:41
Descubri un problema le pongo 2 led en el puerto C4 y C5 donde teoricamente esta el D+ y D- y no me prenden los led. osea que hay dos teorias o se hicieron mierda los puertos o me alguna configuracion para usarlo como puertos normal.