pic18f4550 Usbye değer gönderme hatası

Başlatan kantirici, 12 Şubat 2012, 13:32:23

kantirici

Merhaba arkadaşlar.
İnternetten buldugum usb ile ilgili kodları değiştirerek kendime uygarladım.Hatsız bir şekilde usbden pice veri yollayıp veriyi değerlendirip istedigim işlemi yapıyorum .Mesela lcdye yazı yazabiliyorum ve pc tarafına sayı yollayabiliyorum.Fakat adc değerini okuyup bir türlü doğru bir şekilde aktarım yapamdım.Pic tarafında lcd den adc değerini okumama rağmen pc tarafına aktarım yapamadım.İletişimi hid aygıt olarak yapıyorum.

Pic olarak 18f4550 ve ccs c kullanıyorum.Pc tarafında c# ve UsbLibrary.dlli kullanıyorum.Bakabilirseniz sevinirim.teşekkürler.


İlgili pic ve pc tarafındaki dosylar burada.http://hotfile.com/dl/146295896/b017093/Yeni_klasr.rar.html

#include <18F4550.h>
#device ADC=10
#fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=48000000)

#define USB_HID_DEVICE     TRUE             
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT //Uçnokta1'de Kesme transferi aktif
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT    
#define USB_EP1_TX_SIZE    64                 //Uçnokta1 için maksimum alınacak ve gonderilecek
#define USB_EP1_RX_SIZE    64                 //veri boyutu (64 byte)

#include <pic18_usb.h>     
#include <USB_Konfigurasyon.h>                //USB konfigurasyon bilgileri bu dosyadadır.
#include <usb.c> 
#include <flex_lcd.c>
//////////////
#use fast_io(a)
#use fast_io(d)
#use fast_io(b)
/////////////
#define UcNokta1       1 
//Yazılım (Firmware) Sürüm no
#define surum_no1      0x00            //surum_no2.surum_no1 ornek: 1.0
#define surum_no2      0x01 
/////////////////////
//#define use_portb_lcd true
//#INCLUDE <LCD.c>
//     #define LCD_ENABLE_PIN  PIN_b0                                    ////
//     #define LCD_RS_PIN      PIN_b1                                    ////
//     #define LCD_RW_PIN      PIN_b2                                    ////
//     #define LCD_DATA4       PIN_b4                                    ////
//     #define LCD_DATA5       PIN_b5                                    ////
//     #define LCD_DATA6       PIN_b6                                    ////
//     #define LCD_DATA7       PIN_b7 
/////////////
unsigned int8 paket[64];

unsigned int16 adc_value=0;
unsigned int8 i=0,j=0,lsb=0,msb=0;
float k=0;
////////////}
#define islem paket[1]
#define karaktersayisi   paket[9]





void main(void)
{     
   set_tris_d(0x00);
   output_d(0x00);
   set_tris_b(0x00);
   output_b(0x00);
   set_tris_a(0xff);
   set_tris_a(0x00);
  setup_adc(ADC_CLOCK_INTERNAL);
  // setup_adc(adc_clock_div_32);
  setup_adc_ports(AN0);
  
   lcd_init();
   delay_ms(100);
   printf(lcd_putc,"\f");
   printf(lcd_putc,"Usb Baglantisi");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Kuruluyor F.O");
   lcd_gotoxy(1,1);
   
   
   
   delay_ms(100);
   usb_init();                      
   usb_task();                      
   usb_wait_for_enumeration();         //Cihaz, hazır olana kadar bekle
   
   if(usb_enumerated())    
      output_high(pin_d0);
      printf(lcd_putc,"\f");
      printf(lcd_putc,"Baglanti Kuruldu");
     
   for (;;)
   {   
      while(usb_enumerated())
      {
      ///////////////////////////////////////////////////////
       if (usb_kbhit(1))             //Eğer pc'den yeni bir paket geldiyse
         {         
            usb_get_packet(UcNokta1, paket, 64); //paketi oku    
            //printf(lcd_putc,"\f%u",paket[19]);
         j=1;
         output_high(pin_d1);
      /////////////////////////////////////////////
      if(paket[1]==0x01)
      { 
      printf(lcd_putc,"\f");
       
      
                set_adc_channel(AN0);  
                delay_us(20);
                adc_value=read_adc();
      
                paket[1]=make8(adc_value,0);
                paket[2]=make8(adc_value,1);
               
                paket[3]=(byte)adc_value>>8;
                paket[4]=(byte)(adc_value&0011111111);
                
                for(i=5;i<65;i++)paket[i]=0xFF;
                
               // printf(lcd_putc,"%d\n ",(int)adc_value);
                printf(lcd_putc,"channel%u\n%0.3f  ",i,0.488*adc_value);              
                delay_ms(50);
      
   usb_put_packet(UcNokta1, paket,64, USB_DTS_TOGGLE);//64
      }
        If(islem=='w')
            {
            
        printf(lcd_putc,"\f");
        
                if(karaktersayisi>16){
                                     for( i=10;i<26;i++)
                                         printf(lcd_putc,"%c",paket[i]);
            
                                     lcd_gotoxy(1,2);   
                                     for(i=26;i<42;i++)
                                         printf(lcd_putc,"%c",paket[i]);}
                             else{
                             for(i=10;i<karaktersayisi+1;i++)
                                         printf(lcd_putc,"%c",paket[i]);}
     }
     
     
     If(islem==0xFF){
           for(i=0;i<65;i++)paket[i]=i;
           usb_put_packet(UcNokta1, paket,64, USB_DTS_TOGGLE);
     }
              
                  
         }
         
         
    
      }
   }
}


                                                      

#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, 0,        // Usage minimum
      0x29, 800,        // Usage maximum

      0x15, 0x00,        // Logical minimum (-128)
      0x25, 0xFF,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, 64,        // Report count = 16 bits (2 bytes)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 0,        // Usage minimum
      0x29, 800,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 64,        // Report count = 16 bits (2 bytes)
      0x91, 2,        // Output (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
         32
   };


//////////////////////////////////////////////////////////////////
///
///   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+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, //index of string descriptor for this configuration      ==7
         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
         50, //maximum bus power required (maximum milliamperes/2)  (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, //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
         0x11,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
         10,  //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};

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

   #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
         0x00,0x02, //usb version in bcd 
         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
         0x11,0x11, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
         0x11,0x11, //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
   };


//////////////////////////////////////////////////////////////////
///
///   start string descriptors
///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
///
///   You must define the length else get_next_string_character() will not see the string
///   Current code only supports 10 strings (0 thru 9)
///
//////////////////////////////////////////////////////////////////

//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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

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)
         'O',0,
         'Z',0,
         'C',0,
   //string 2
         58,                   //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         ' ',0,
         'F',0,
         'a',0,
         't',0,
         'i',0,
         'i',0,
         'h',0,
         ' ',0,
         'O',0,
         'z',0,
         'c',0,
         'a',0,
         'n',0,
         ' ',0,
         ' ',0,
         'U',0,
         'S',0,
         'B',0,
         ' ',0,
         'H',0,
         'I',0,
         'D',0,
         ' ',0,
         '2',0,
         '0',0,
         '1',0,
         '2',0,
         ' ',0,
         ' ',0
};

#ENDIF


kantirici


respected

Merhaba,
Benzer bir uygulamayı ben Delphi de yaptım sorunsuz çalıştırdım. Sanırım sorunun PIC in gönderdiği bilgiyi çevir me işleminde. PIC usb den bilgi gönderirken string olarak gönderir. Sen o bilgiyi alıp işlemen lazım. Sanırım şu anda led yakma gibi işlemleri '11' gelmişse ledi yak şeklinde yapıyorsun. ADC de ise bu şekilde karşılaştırma yerine aldığın bilgiyi doğrudan yazdırmaya çalıştığın için sorun oluyordur.
   Kısaca aldığın string bilgiyi integer olarak değerlendirmen gerekiyor. Ayrıca HID aygıt yaptıysan dll kullanmana gerek yok. Doğrudan sistem tanıyacak şekilde ayarlama yapabilirsin.( usb descriptor içinden)

t2

DLL aygıtı tanımakiçin değil haberleşebilmek içindir.  HID aygıtla ilgili düşük seviyeli fonksiyonlar angarya işler bu DLL ile halledilir. DLLi kullanan kişi, bu sayede arayüzü kolay oluşturabilir.

respected

ben dll dosyayı pic te kullandığını düşünmüştüm. C# kısmındaysa sorun yok.

muhittin_kaplan

Önce ADC değil de sıradan bir bilgi göndermeyi denermisin ? adc ye sonra geçmen daha iyi olur. CCS çalışmadım USB Desc doğru görünüyor.

kantirici

Merhaba,
Usbden bilgisayara problemsiz veri yollayabiliyorum.Mesela;

                set_adc_channel(AN0);  
                delay_us(20);
                adc_value=read_adc();
                paket[1]=make8(adc_value,0);
                paket[2]=make8(adc_value,1);paket[6]=(byte)'t';
                paket[7]=(byte)'a';
                paket[8]=(byte)'m';
                paket[9]=(byte)'a';
                paket[10]=(byte)'m';
                
                
      
   usb_put_packet(UcNokta1, paket,64, USB_DTS_TOGGLE);


Bu şekilde pc tarafına "tamam" kelimesi ulaşıyor fakat paket[1] ve [2] de 1 -0 gibi değerler dönüyor.Örnek olarak baz aldıgım kodlar sorunsuz bir şekilde  adc verisini pc tarafına yolluyor.Bir türlü işin içinden çıkamadım.

justice_for_all

veri hicmi gitmiyor yoksa yalnis verilermi gidiyor?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

kantirici

Merhaba,
hem isisde hemde deneme kartında başarılı olamadım.İsisde debug yaptım ve usbye gönderilecek değişkene doğru değeri gönderiyor fakat pc tarafına o değer gelmiyor.Bende adc değerini 4 e bölüp aşagıdaki koddaki gibi tüm diziye attım ve sadece 5.indis i alabildim.Diğer indisler 0 olarak geldi yani değer atanmadan.

for(i=1;i<65;i++)paket[i]=adc_value;
           usb_put_packet(UcNokta1, paket,64, USB_DTS_TOGGLE);



Fakat adc haricinde kendim değer atayıp yollayabiliyorum..Acaba neden adc de sadece pakat[5]i yolluyor anlayamadım.

Ayrıca aşağıdaki kodda çalışıyor tüm sayıları pc tarafına gönderiyor.
If(islem==0xFF){
           for(i=0;i<65;i++)paket[i]=i;
           usb_put_packet(UcNokta1, paket,64, USB_DTS_TOGGLE);


Yani adc işin içine girdimi pic sapıtıyor veya biryerlerde yaptıgım yanlışlıktan ben sapıttırıyorum :)...


justice_for_all

#9
gelen paket ve giden paket diye iki değişken olarak yapın bence ve adc için referans voltaj belirtmemişsiniz ..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

kantirici

Yok hocam olmuyor malesef.Acaba kullandıgım derleyici versiyonu ile ilgili bir sıkıntı olabilirmi? 4.120 versiyon kullanıyorum.

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

kantirici

MErhaba,
Hocam verdiginiz hex ile şu hataları sürekli olarak veriyor.Teşekkürler.

ADC conversion started before wait time has expired follawing previous conversion or change

Attempt to sample non-existant ADC channel 14 (zero assumed)

kantirici

Merhaba,
Arkadaşlar sorunu çözdüm. ccs c v4.128 yükleyince sorun çözüldü.Şimdi sorunsuz bir şekilde yollayabiliyorum.İlgilenen arkadaşlara teşekkür ederim.

Mucit23

#14
Arkadaşlar merhaba

CCS de USB bağlantısı kurmaya çalışıyorum. Anlamadığım bazı noktalar var izininizle onları sormak istiyorum
Yukarıda verilmiş olan USB konfigürasyon dosyasında en altta bazı string karakterler girilmiş
                                                      

#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, 0,        // Usage minimum
      0x29, 800,        // Usage maximum

      0x15, 0x00,        // Logical minimum (-128)
      0x25, 0xFF,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, 64,        // Report count = 16 bits (2 bytes)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 0,        // Usage minimum
      0x29, 800,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 64,        // Report count = 16 bits (2 bytes)
      0x91, 2,        // Output (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
         32
   };


//////////////////////////////////////////////////////////////////
///
///   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+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, //index of string descriptor for this configuration      ==7
         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
         50, //maximum bus power required (maximum milliamperes/2)  (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, //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
         0x11,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
         10,  //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};

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

   #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
         0x00,0x02, //usb version in bcd 
         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
         0x11,0x11, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
         0x11,0x11, //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
   };


//////////////////////////////////////////////////////////////////
///
///   start string descriptors
///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
///
///   You must define the length else get_next_string_character() will not see the string
///   Current code only supports 10 strings (0 thru 9)
///
//////////////////////////////////////////////////////////////////

//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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

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)
         'O',0,
         'Z',0,
         'C',0,
   //string 2
         58,                   //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         ' ',0,
         'F',0,
         'a',0,
         't',0,
         'i',0,
         'i',0,
         'h',0,
         ' ',0,
         'O',0,
         'z',0,
         'c',0,
         'a',0,
         'n',0,
         ' ',0,
         ' ',0,
         'U',0,
         'S',0,
         'B',0,
         ' ',0,
         'H',0,
         'I',0,
         'D',0,
         ' ',0,
         '2',0,
         '0',0,
         '1',0,
         '2',0,
         ' ',0,
         ' ',0
};

#ENDIF


Burada girilen karakterler cihaz adınımı belirliyor?
Diğer bir sorum ise USB HID cihazlarında Vendor ID ve Product ID değerlerini kafama göre bir sayı belirsem ne gibi problemlerle karşılaşırım.
Yarın C# da ufak bir program yazacağım. Daha önce hiç usb kullanmadım. Bu yüzden biraz ön bilgiye ihtiyacım var.