Hola a todos.
Estoy intentando hacer algo parecido a un joystick, con un pic18f2455, conectado por usb al pc, utilizando los descriptores hid, y apoyandome en varias ideas que he visto en este y otros foros. El tema es que tengo un par de potenciometros conectados a la entrada AN0 y AN1, con una resolucion de 10bits, y esto correspondería al eje X e Y, y 16 botones que de momento para las pruebas los tengo con unos valores fijos. El problema es que con sólo mover el potenciometro un poco, cuando pasa de 0V a 0.2V, se desplaza el eje al otro extremo, no se mueve de forma progresiva según el potenciometro, sino que parece digital y con solo mover un poco el potenciometro se sitúa al otro extremo de los ejes. Pongo aqui el código en C de CCS y el HID Descriptor para ver si alguien me puede ayudar y darme una idea sobre lo que hago mal. Muchas gracias:
#include <18F4550.h>
#device ADC=8
#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
#include <pic18_usb.h>
#include <.\include\usb_gamepad_HID3.h> //USB Configuration and Device descriptors for this USB device
#include <usb.c> //handles usb setup tokens and get descriptor reports
#include <ctype.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
void main(void) {
long valor0,valor1;
long out_data[3];
set_tris_A(0b0000001);
setup_adc_ports(AN0_to_AN1);
setup_adc(ADC_CLOCK_DIV_64);
usb_init_cs();
while (TRUE) {
usb_task();
if (usb_enumerated())
{
output_high(PIN_B4);
set_adc_channel(0);
delay_us(15);
valor0=read_adc();
set_adc_channel(1);
delay_us(15);
valor1=read_adc();
{
out_data[0]=valor0; // Ejes X y Y
out_data[1]=valor1;
out_data[2]=0b1010101010101010;
usb_put_packet(1,out_data,6,USB_DTS_TOGGLE);
}
}
}
}
0x05, 0x01, // usage page (generic desktop Choose the usage page "mouse" is on
0x09, 0x05, // usage Device is a gamepad
0xA1, 0x01, // collection (application) This collection encompasses the report format
0x09, 0x01, // usage (pointer) Choose the key code usage page
0xA1, 0x00, // collection (physical) Physical collection
0x09, 0x30, // usage (X) X direction of pointer
0x09, 0x31, // usage (Y) Y direction of pointer
0x15, 0x00, // logical minimum (0)
0x25, 0x7F, // logical maximum (127)
0x35, 0x00, // PHYSICAL minimum (0)
0x45, 0x7F, // PHYSICAL maximum (127)
0x75, 0x10, // report size (8)
0x95, 0x02, // report count (2) Two reports, eight bit each
0x81, 0x02, // input (data, variable, absolute)
0xC0, // end collection
0x05, 0x09, // usage page (buttons) Choose the “button” usage page
0x19, 0x01, // usage minimum (1) There are three buttons
0x29, 0x10, // usage maximum (16)
0x15, 0x00, // logical minimum (0) Each button is represented by one bit
0x25, 0x01, // logical maximum (1)
0x95, 0x10, // report count (16) Three reports, one bit each
0x75, 0x01, // report size (1)
0x81, 0x02, // input (data, variable, absolute)
0xC0, // end collection