0

我使用 PIC18F2458 作为 USB 操纵杆 HID。该程序有效,但我几乎没有问题。

现在,如果我不能写入超过 5 个值(油门、X、Y、4 个按钮),则无法检测到 USB。当前的问题是如果我为油门使用模拟传感器,其他轴 x,y 也会被读取,因为它们将从模拟输入中读取,当然会有噪音,所以每当我使用旋转电阻时油门USB输入,我也写了其他轴。

我该如何解决这个问题?

第二个问题如何为 USB 描述符添加两个油门?

这是当前代码:

unsigned int average(int channel)
{
 int samples = 16;
 unsigned int sum = 0;
 int i;
 for (i = 0; i < samples; i++)
 {
 
     sum+=(Adc_Read(channel)>>2)-128;
 }
 sum = sum/16;
 return sum;
}

void analogo() {

    usb[0] = average(1);   // Get 10-bit results of AD conversion
    usb[1] = average(9);
    usb[2] = average(8);
}

void main(void){
                              // Disable comparators

 ADCON1  = 0x05;                         // Configure all ports with analog function as digital
 TRISA.RA1 =1;
 TRISB.RB2=1;
 TRISB.RB3 =1;
 
 HID_Enable(&readbuff,&writebuff);       // Enable HID communication

 //vl6180x_configure();

  while(1){
  analogo();
  USB_Polling_Proc();

    writebuff[0]=usb[0];         // throttle
    writebuff[1]=usb[1];        // X axis
    writebuff[2]=usb[2];        // Y  axis
    writebuff[3]=0xFF;        //button  0xFF
    writebuff[4]=0xFF;        //button POV 0xFF



    HID_Write(&writebuff,5);


   }

}

和描述符

const struct {
  char report[USB_HID_RPT_SIZE];
}
hid_rpt_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 (8)
     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, 0x0A, // USAGE_MAXIMUM (Button 10)
      0x15, 0x00, // LOGICAL_MINIMUM (0)
      0x25, 0x01, // LOGICAL_MAXIMUM (1)
      0x75, 0x01, // REPORT_SIZE (1)
      0x95, 0x0C, // REPORT_COUNT (12) 2 bits added to switch report count
                  // so bytes are even. Bytes must be even.
      0x55, 0x00, // UNIT_EXPONENT (0)
      0x65, 0x00, // UNIT (None)
      0x81, 0x02, // INPUT (Data Var Abs)
0xC0 // END_COLLECTION
  };
4

0 回答 0