cj0022
 
 
  Joined: 08 Jun 2008 Posts: 1
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| PIC18F2550 USB problem | 
			 
			
				 Posted: Sun Jun 08, 2008 9:21 am     | 
				     | 
			 
			
				
  | 
			 
			
				Hey Im new to PIC18f2550 and Im doing a project to use control 5 LEDs output from PIC28F2550 thru PC interface. My friend provide me an example  codes I think probably from the internet. I'm having problem interpreting the code, I'm wondering if any of you can explain? and why there are two codes used for this application?
 
 
 
 
 
 	  | Code: | 	 		  
 
 
 
#IFNDEF __USB_DESCRIPTORS__
 
#DEFINE __USB_DESCRIPTORS__
 
 
#include <usb.h>
 
 
//////////////////////////////////////////////////////////////////
 
///
 
///   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      32 //config+interface+class+endpoint
 
 
   //configuration descriptor
 
   char const USB_CONFIG_DESC[] = {
 
   //config_descriptor for config index 1
 
         USB_DESC_CONFIG_LEN,     //length of descriptor size
 
         USB_DESC_CONFIG_TYPE,         //constant CONFIGURATION (0x02)
 
         USB_TOTAL_CONFIG_LEN,0,  //size of all data returned for this config
 
         1,      //number of interfaces this device supports
 
         0x01,                //identifier for this configuration.  (IF we had more than one configurations)
 
         0x00,                //index of string descriptor for this configuration
 
         0xC0,                //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 reserved and bit7=1
 
         0x32,                //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)
 
 
   //interface descriptor 0 alt 0
 
         USB_DESC_INTERFACE_LEN,  //length of descriptor
 
         USB_DESC_INTERFACE_TYPE,      //constant INTERFACE (0x04)
 
         0x00,                //number defining this interface (IF we had more than one interface)
 
         0x00,                //alternate setting
 
         2,       //number of endpoints, not counting endpoint 0.
 
         0xFF,                //class code, FF = vendor defined
 
         0xFF,                //subclass code, FF = vendor
 
         0xFF,                //protocol code, FF = vendor
 
         0x00,                //index of string descriptor for interface
 
 
   //endpoint descriptor
 
         USB_DESC_ENDPOINT_LEN, //length of descriptor
 
         USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
 
         0x81,              //endpoint number and direction (0x81 = EP1 IN)
 
         0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
 
         USB_EP1_TX_SIZE,0x00,         //maximum packet size supported
 
         0x01,              //polling interval in ms. (for interrupt transfers ONLY)
 
 
   //endpoint descriptor
 
         USB_DESC_ENDPOINT_LEN, //length of descriptor
 
         USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
 
         0x01,              //endpoint number and direction (0x01 = EP1 OUT)
 
         0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
 
         USB_EP1_RX_SIZE,0x00,         //maximum packet size supported
 
         0x01,              //polling interval in ms. (for interrupt transfers ONLY)
 
 
  };
 
 
   //****** 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   0
 
 
   //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};
 
 
   #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
 
      #error USB_TOTAL_CONFIG_LEN not defined correctly
 
   #endif
 
 
 
//////////////////////////////////////////////////////////////////
 
///
 
///   start device descriptors                                                                               
 
///
 
//////////////////////////////////////////////////////////////////
 
 
   //device descriptor
 
   char const USB_DEVICE_DESC[] ={
 
         USB_DESC_DEVICE_LEN,          //the length of this report
 
         0x01,                //constant DEVICE (0x01)
 
         0x10,0x01,           //usb version in bcd
 
         0x00,                //class code (if 0, interface defines class.  FF is vendor defined)
 
         0x00,                //subclass code
 
         0x00,                //protocol code
 
         USB_MAX_EP0_PACKET_LENGTH,   //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
 
         0xD8,0x04,           //vendor id (0x04D8 is Microchip)
 
         0x11,0x00,           //product id, me gusta el 11 ;)
 
         0x01,0x00,           //device release number
 
         0x01,                //index of string description of manufacturer. therefore we point to string_1 array (see below)
 
         0x02,                //index of string descriptor of the product
 
         0x00,                //index of string descriptor of serial number
 
         USB_NUM_CONFIGURATIONS   //number of possible configurations
 
   };
 
 
 
//////////////////////////////////////////////////////////////////
 
///
 
///   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.
 
const char USB_STRING_DESC_OFFSET[]={0,4,12};
 
 
#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 --> la compaƱia del producto ???
 
         8, //length of string index
 
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
 
         'O',0,
 
         'E',0,
 
         'M',0,
 
   //string 2 --> nombre del dispositivo
 
         22, //length of string index
 
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
 
         'O',0,
 
         'E',0,
 
         'M',0,
 
         ' ',0,
 
         'P',0,
 
         'i',0,
 
         'c',0,
 
         'U',0,
 
         'S',0,
 
         'B',0
 
};
 
 
                          
 
#ENDIF
 
 
 
 
#include <18F2550.h>
 
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
 
#use delay(clock=48000000)
 
#define USB_HID_DEVICE     FALSE             
 
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   
 
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   
 
#define USB_EP1_TX_SIZE    1                 
 
#define USB_EP1_RX_SIZE    3                 
 
#include <pic18_usb.h>     
 
#include <PicUSB.h>        
 
#include <usb.c>                                                                  
 
#define LEDV    PIN_B6
 
#define LEDR    PIN_B7
 
#define LED_ON  output_high
 
#define LED_OFF output_low
 
 
#define modo      recibe[0]
 
#define param1    recibe[1]
 
#define param2    recibe[2]
 
#define resultado envia[0]
 
 
 
void main(void) {
 
 
   int8 recibe[3];                 
 
   int8 envia[1];
 
   LED_OFF(LEDV);                  
 
   LED_ON(LEDR);
 
   usb_init();
 
   usb_task();                     
 
   usb_wait_for_enumeration();     
 
  // LED_ON(PIN_A0);  
 
   LED_OFF(LEDR);
 
   LED_ON(LEDV);                    
 
   SET_TRIS_A( 0xFF);
 
// LED_ON(PIN_B0);
 
  while (TRUE)
 
   {
 
      if(usb_enumerated())         
 
      {
 
        if (usb_kbhit(1))          
 
         {
 
              usb_get_packet(1, recibe, 3); 
 
            
 
            if (modo == 0 || modo == 1) 
 
            {
 
             if (INPUT_STATE(PIN_A1)& INPUT_STATE(PIN_A2))
 
            {  
 
               resultado =3;  
 
               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); 
 
              
 
             }
 
             if (!INPUT_STATE(PIN_A1) & INPUT_STATE(PIN_A2))
 
             {
 
             resultado =2; 
 
 
               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); 
 
            }
 
 
           
 
         }
 
      }
 
   }
 
}
 
}        
 
 | 	  
 
 
 
  _________________ PIC PIC PIC PIC PIC PIC PIC | 
			 
		  |