USB HID y dispositivo de juegos

Holas... Yo contestaré tu pregunta porque curiosamente después de tanto leer, probar y ensayar contesté la mía.

Empezaré por el final. Para enviar una serie de datos usamos (después haber configurado todo) el siguiente comando en el Main de nuestro programa:

usb_put_packet(1,envia,6,USB_DTS_TOGGLE);

De donde:
'1': hace referencia al descriptor, EndPoint 1 (EP1).
'envia': es una variable que contiene los datos.
'6': Es el número de bytes a enviar.
'USB_DTS_TOGGLE': Sincronización de datos

Enfocandonos en la variable, que son 6 bytes (es un vector) tenemos distintos tipos de cosas:

envia[0]= eje_x
envia[1]= eje_y
envia[2]= eje_rx
envia[3]= eje_ry
envia[4]= botones1
envia[5]= botones2

En mi caso, todos mis datos, son de 8 bits cada uno. Esto es más sencillo porque si estás corto en bits de datos, debes acabar de llenar los 8 bits con otros datos que tengas por ahí y por tanto cambia el reporte.

Pero entonces volviendo por fin a tu pregunta: ¿Para que? Para que el PC pueda saber quien es que cosa, se debe definir el orden de lo que llega:

0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x39, 0x00, // DESIGNATOR_INDEX (0)
0x09, 0x30, // USAGE (X) ---eje_x
0x09, 0x31, // USAGE (Y) ---eje_y
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
0x95, 0x02, // REPORT_COUNT (2) ----'variables eje_x y eje_y'
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x00, // COLLECTION (Physical)
0x39, 0x01, // DESIGNATOR_INDEX (1)
0x09, 0x33, // USAGE (Rx)
0x09, 0x34, // USAGE (Ry)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
0x95, 0x02, // REPORT_COUNT (2) ----'variables eje_rx y eje_ry'
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1) ---- 'Botones'
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x09, // USAGE_MINIMUM (Button 9) 'MAS botones'
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION

Defini estos reportes de cuantas maneras te puedas imaginar. Y solo leyendo, me enteré, que si tienes varias palancas físicas (como pasa en el mando de PSX) debes designar índices. Si no se dice para que sirve, el PC no lo entiende por lo tanto no va a funcionar. Hice chequeos de que el paquete se enviaba, con diferentes rutinas, con timeout donde todo parecía perfecto pero no había cambios (el gamepad no me reaccionaba para nada).

Otra cosa que cambién en el archivo de configuración de descriptores fue el número de interfases: #define USB_NUM_HID_INTERFACES 2, leí también que debía definirse de esta forma, aunque aclaro, que programé un firmware de megajoystick de 25 botones y este tampoco reaccionó (creo que lo habrán visto por ahí).

Estoy usando Windows 7 64-bits. y funciona perfectamente.



Saludos! Espero no haberme extendido mucho.
 
Buenisima respuesta. Te comento que hace un tiempo program un HID con el ejemplo del CCS, y utilizando libusb. Si no hacia un envio continuo de los datos es como se quedaba bloqueda (el programa en la PC) hasta que llegue un dato, x mas falso que sea. Sabes porque ocurre esto?
Encima si enviaba datos falsos despues quedaban en el buffer y no se podia hacer una especie de fflush() para descartar los datos anteriores...
 
Si! Afortunadamente ahora tiene más funciones (envios con timeout, flushes y más), o me habría vuelto loco imaginándome que estaría pasando! No pude hacer nada con el proteus (mencioné que he intentado de todo?), porque los drivers USB no son aptos para Windows de 64 bits (ni siquiera se queja que sea windows 7, sino por 64bits). Hastá monté una máquina virtual con el VirtualPC, pero lo mismo, no tomaba los puertos usb. Afortunadamente mi perseverancia es terca y se niega a morir algunas veces.

Me alegro que te haya servido mi respuesta.
 
tengo una duda... en este HID REPORT

0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8) bits
0x95, 0x02, // REPORT_COUNT (2)siempre primero se definen todas las variables que habra? o en que orden se debe definir la variable, los maximos y minimos. Que indica REPORT COUNT? que diferencia hay entre USAGE_MINIMUM, el PHYSICAL_MINIMUM y el LOGICAL_MINIMUM??? gracias!
 
Asumo que este HID report, es un fragmento del que estás mirando, pues deben definirse ciertas cosas antes.

Te cuento de lo que he visto, porque he bajado muchos fragmentos de estos y me he guiado por ahí. He leido, pero considero que aun me faltan cosas por aprender. He visto reports, donde solo se definen las variables, (si, siempre van definidas primero) y luego los max/min logicos y físicos y por último el conteo y tamaño del reporte. También he visto que no existen los valores lógicos, creo que todo depende de tu aplicación, pero como te digo, creo que todavía me falta por aprender.

Para este caso (bueno mi caso), una palanca de gamepad, (stick, no D-PAD o flechas, porque estas ultimas solo manejan 4 bits, 1 bit por cada dirección), maneja una variación leve es decir, en un juego, el avion, el auto, la motocicleta, se mueve de forma proporcional a la deflexión (lo que tanto muevas) del stick. Por tanto, se deben definir unos mínimos lógicos, de donde a donde va, en valores para que el PC entienda (0 a 255, 8 bits solo alcanzan a hacer un byte, por eso el valor maximo de 255). No he probado quitarles los valores físicos, porque está dentro de una 'colección física'. Esto es una forma de estructura que define el reporte en si.

El report size, que es de 8, (8 bits) indica el tamaño en bits de cada reporte. El report count, en cambio, indica de cuantos reportes estás hablando. Esto explica que el PC entienda que no solo va el 'eje X', sino también el 'eje y', porque cada uno es un reporte diferente con los mismos lógicos y físicos, (definidos dentro de la misma colección), con el mismo tamaño.

Pero bueno, uno diría, que todo en el gamepad es físico, ¿entonces por que razón no se definen los botones de forma física? Hasta donde he visto, solo las palancas se definen como físicos... pero creo que me falta más por aprender, me cuentas...

Espero haber aclarado tus dudas.
 
Hola a todos, estuve lleyendo y han hecho un trabajo muy interesante. Estoy tratando de hacer un joystick 3D, por ejemplo el 3DConnexion (http://www.3dconnexion.com/) se usa mucho para el Altium Designer y el Solidworks o para todo soft 3D. La idea es un HID, espero que me puedan ayudar por donde empezar. Saludos y gracias. Leandro
 
El Altium Designer, tiene la posibilidad de poder hacer una simulacion 3D de un PCB y utiliza una combinacion del mouse y el teclado para hacer rotar el PCB. Por ejemplo para rotar, si mal no recuerdo es: SHIFT + Botón Derecho del mouse. También el cualquier CAD 3D se puede rotar la pieza con mucha facilidad. Es costo es de unos 140 dólares en el pais. (http://www.youtube.com/watch?v=kV6vnpCcgxI Min: 2:30) ahi hay unos segundos de cómo se utiliza
 
Si, el tema de las piezas de puede llegar a convertir en un doler de cabeza, pero la idea es arrancar con un rocker de joystick standar, como los de video juego. Por lo que me dijo mi amigo, gran parte de las funciones de puede hacer con un rocker. A ver si compartis conmigo... tendría que hacer un HID (joystick o mouse-keyboard) que cuando se mueva el rocker, lo que entienda la pc sea la techa de shift y el movimiento de un mouse. Con el tema del usb+pic+ccs estuve jugando el CDC y HID como keybord. Pero todo desde los ejemplos del CCS. Lamentablemente no hay mucho documentado y algunas cosas las hago por pura música...
 
Holas... Yo contestaré tu pregunta porque curiosamente después de tanto leer, probar y ensayar contesté la mía.

Empezaré por el final. Para enviar una serie de datos usamos (después haber configurado todo) el siguiente comando en el Main de nuestro programa:

usb_put_packet(1,envia,6,USB_DTS_TOGGLE);

De donde:
'1': hace referencia al descriptor, EndPoint 1 (EP1).
'envia': es una variable que contiene los datos.
'6': Es el número de bytes a enviar.
'USB_DTS_TOGGLE': Sincronización de datos

Enfocandonos en la variable, que son 6 bytes (es un vector) tenemos distintos tipos de cosas:

envia[0]= eje_x
envia[1]= eje_y
envia[2]= eje_rx
envia[3]= eje_ry
envia[4]= botones1
envia[5]= botones2

En mi caso, todos mis datos, son de 8 bits cada uno. Esto es más sencillo porque si estás corto en bits de datos, debes acabar de llenar los 8 bits con otros datos que tengas por ahí y por tanto cambia el reporte.

Pero entonces volviendo por fin a tu pregunta: ¿Para que? Para que el PC pueda saber quien es que cosa, se debe definir el orden de lo que llega:

0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x39, 0x00, // DESIGNATOR_INDEX (0)
0x09, 0x30, // USAGE (X) ---eje_x
0x09, 0x31, // USAGE (Y) ---eje_y
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
0x95, 0x02, // REPORT_COUNT (2) ----'variables eje_x y eje_y'
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x00, // COLLECTION (Physical)
0x39, 0x01, // DESIGNATOR_INDEX (1)
0x09, 0x33, // USAGE (Rx)
0x09, 0x34, // USAGE (Ry)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
0x95, 0x02, // REPORT_COUNT (2) ----'variables eje_rx y eje_ry'
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1) ---- 'Botones'
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x09, // USAGE_MINIMUM (Button 9) 'MAS botones'
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION

Defini estos reportes de cuantas maneras te puedas imaginar. Y solo leyendo, me enteré, que si tienes varias palancas físicas (como pasa en el mando de PSX) debes designar índices. Si no se dice para que sirve, el PC no lo entiende por lo tanto no va a funcionar. Hice chequeos de que el paquete se enviaba, con diferentes rutinas, con timeout donde todo parecía perfecto pero no había cambios (el gamepad no me reaccionaba para nada).

Otra cosa que cambién en el archivo de configuración de descriptores fue el número de interfases: #define USB_NUM_HID_INTERFACES 2, leí también que debía definirse de esta forma, aunque aclaro, que programé un firmware de megajoystick de 25 botones y este tampoco reaccionó (creo que lo habrán visto por ahí).

Estoy usando Windows 7 64-bits. y funciona perfectamente.



Saludos! Espero no haberme extendido mucho.


oscaroae:

Queria hacerte ( mas bien hacerles) una consulta, como modifico el descriptor para realizar un "gamepad o joystick" que sólo posea botones y no aparezcan los ejes x,y por ejemplo.
Mi idea es hacer un control con solo 32 botones y despues otro control con solo dos ó 4 ejes.

Otra cosa que no entedí es que es y para que sirve el #define USB_NUM_HID_INTERFACES 2 que mencionaste.

Les comento que arme un joystick y funcionó bien, y para los que no podian modificarle el nombre del dispositivo les cuento que busquen en la REGISTRY del Windows el string del dispositivo, lo borran y luego al enchufar nuevamente el joystick les tomará el nombre nuevo, es que el windows recuerda el id del dispositivo viejo y entonces no actualiza el nombre, aprovecho a preguntar como cambio el ID y que valores les puedo poner.

Slds.
 
Hola amigos.
A partir de lo que estais tratando aquí, intento conectar un potenciometro a la entrada AN0 y otro a la AN1 para pasar el valor de 10bits al ejeX y ejeY, además de otros 16 botones. Creo que tengo todo más o menos bien, pero el problema está en que solo con mover un poco el potenciometro, en cuanto pasa de 0V a 0.2V, se van los ejes hasta el otro extremo. Creo que debe ser problema de configuración del conversor A/D, pero no logro descubrir donde falla. Pondré aquí el código en CCS y el Descriptor para ver si alguien me puede ayudar. Gracias!!
Código:
#include <18F4550.h>
#device ADC=10
#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);
         }
      } 
   }
}

Código:
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)
      0x26, 0xFF, 0x03, // logical maximum (1023)
      0x35, 0x00, // PHYSICAL minimum (0)
      0x46, 0xFF, 0x03, // PHYSICAL maximum (1023)
      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
 
Hola amigos.
A partir de lo que estais tratando aquí, intento conectar un potenciometro a la entrada AN0 y otro a la AN1 para pasar el valor de 10bits al ejeX y ejeY, además de otros 16 botones. Creo que tengo todo más o menos bien, pero el problema está en que solo con mover un poco el potenciometro, en cuanto pasa de 0V a 0.2V, se van los ejes hasta el otro extremo. Creo que debe ser problema de configuración del conversor A/D, pero no logro descubrir donde falla. Pondré aquí el código en CCS y el Descriptor para ver si alguien me puede ayudar. Gracias!!
Código:
#include <18F4550.h>
#device ADC=10
#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);
         }
      } 
   }
}

Código:
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)
      0x26, 0xFF, 0x03, // logical maximum (1023)
      0x35, 0x00, // PHYSICAL minimum (0)
      0x46, 0xFF, 0x03, // PHYSICAL maximum (1023)
      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
Hola:
Creo que el problema está en que en tu programa en la linea del usb_put_packet figura 6
y en realidad me parece que debería ser 3 ( por el long out_data[3] ), pero tmb en el descriptor no concuerda la cantidad de bytes que tenés que enviar .
Te comento que quise hacer un joystick de 8 ejes 16 botones a 10 bits pero no me funcionó, y como quería tenerlo ya lo deje a 8 bits de resolución y funcionó bien y lo dejé así, cuando tenga tiempo volveré a probar, si a vos te funciona a 10 bits avisame.
 
A 10 bits tiene que funcionar, pq tengo el .hex de uno con 6 ejes y 10bits, y el descriptor está redactado como este. Con 8 bits el eje Z me funciona bien (con el descriptor adecuado), pero aún a 8 bits el eje X e Y no van. Mueves el potenciometro solo un poco, y se va al extremo de un salto, como si solo hubiese un bit, y ya te digo, con el descriptor igual para los ejes X e Y como para el Z, y el Z si que funciona bien.
Cuando tenga tiempo seguiré haciendo pruebas y lo voy comentando.
Un saludo y gracias.

PD: en el usb_put_packet creo que tienes que poner el número de bytes, ¿no?o eso tengo entendido.
 
Hola...
saben soy nuevo en esto de la comunicacion usb, la unica vez lo realice desde proton....Quisiera saber si pueden ayudarme para implementar el joystick sobretodo la parte de el `programa en c o en lo que lo estes realizando y una explicacion de como haces que windows reconozca la tecla presionada (asignacion) o a su vez como codificas ese dato
gracias espero poder contar con su ayuda
 
Hola a todos.
Quiero hacer un ejemplo parecido tan sólo una conversión de 10 bits en HID. Pero he hecho modificaciones en el descriptor con mal resultado. Sin embargo sí unicamente realizo una conversión de 10 bits si que funciona.

Os adjunto los archivos que estoy utilizando para simularlo.

Código:
const char USB_CLASS_SPECIFIC_DESC[] = {
6, 0, 255, // Usage Page = Vendor Defined
9, 1, // Usage = IO device
0xa1, 1, // Collection = Application
0x19, 1, // Usage minimum
0x29, 8, // Usage maximum

0x15, 0x00, // Logical minimum (-128) 0x15, 0x00, 0x80,
0x26, 0xFF, 0x03, // Logical maximum (127) 0x26, 0xFF, 0x03, 0x7F,

0x75, 8, // Report size = 8 (bits)
0x95, 2, // Report count = 16 bits (2 bytes) ///2
0x81, 2, // Input (Data, Var, Abs)
0x19, 1, // Usage minimum
0x29, 8, // Usage maximum
0x75, 8, // Report size = 8 (bits)
0x95, 2, // Report count = 16 bits (2 bytes) 2 /// 4
0x91, 2, // Output (Data, Var, Abs) 2 /// 4
0xc0 // End Collection
};
Código:
 

Adjuntos

  • Firmware del PIC18F2550 CAD AN0 10BITS.rar
    77 KB · Visitas: 73
Hola de nuevo
Perdona a todos me he explicado mal lo que quiero es realizar dos conversiones A/D de 10 bits, he modificado el descriptor de la siguiente manera, pero no me funciona:
Código:
const char USB_CLASS_SPECIFIC_DESC[] = {
6, 0, 255, // Usage Page = Vendor Defined
9, 1, // Usage = IO device
0xa1, 1, // Collection = Application
0x19, 1, // Usage minimum
0x29, 8, // Usage maximum

0x15, 0x00, // Logical minimum (-128) 0x15, 0x00, 0x80,
0x26, 0xFF, 0x00 // Logical maximum (127) 0x26, 0xFF, 0x03, 0x25, 0x7F,

0x75, 8, // Report size = 8 (bits)
0x95, 4, // Report count = 16 bits (2 bytes) ///2
0x81, 4, // Input (Data, Var, Abs)
0x19, 1, // Usage minimum
0x29, 8, // Usage maximum
0x75, 8, // Report size = 8 (bits)
0x95, 4, // Report count = 16 bits (2 bytes) 2 /// 4
0x91, 4, // Output (Data, Var, Abs) 2 /// 4
0xc0 // End Collection
};
 
Hola a todos,

Tengo un hardware trabajando con el PIC18F2550 y una aplicacion en vb net 2008 express, pero aun no entiendo muy bien como debo configurar este report para que trabaje segun los datos que utilizo.

Este es parte de mi main donde debo recibir una cantidad desconocida de numeros, y el pic responde ok a cada recepcion de datos. El problema esta en que el pic solamente recibe bien los 2 primeros datos [0] y [1], el resto me recibe basura.

Código:
case 170: 
                        if  ( responder_ok() == true )
                        {
                           if (llego_dato_USB() == true )
                           {
                              usb_get_packet(1, inp_data, sizeof(inp_data));
                              total_telef = inp_data[0];
                              //write_eeprom (10,total_telef);
                              if  ( responder_ok() == true )
                              {
                                 puntero = 11;
                                 salir = false;

                                    if (llego_dato_USB() == true )
                                    {
                                       usb_get_packet(1, inp_data, sizeof(inp_data));
                                       total_digitos = inp_data[0];
                                       if  ( responder_ok() == true )
                                       {
                                          if (llego_dato_USB() == true )
                                          {
                                             i = 0;
                                             usb_get_packet(1, inp_data, sizeof(inp_data));  // total_digitos
                                             //for (pos = puntero ; pos <= (puntero + total_digitos) ; pos++)
                                             //{                                                
                                                //escribir_eeprom (pos,inp_data[i]);                                                
                                                                                                
                                                num_telf[0]=inp_data[0];
                                                num_telf[1]=inp_data[1];
                                                num_telf[2]=inp_data[2];
                                                num_telf[3]=inp_data[3];
                                                num_telf[4]=inp_data[4];
                                                num_telf[5]=inp_data[5];
                                                num_telf[6]=inp_data[6];
                                                num_telf[7]=inp_data[7];
                                                num_telf[8]=inp_data[8];
                                                num_telf[9]=inp_data[9];
                                                //i++;
                                             //}
                                             num_telf[10] = total_digitos;
                                             num_telf[11] = total_telef;
                                             
                                             //escribir_eeprom(pos,'%');
                                             puntero = pos++;
                                             responder_ok();

                                          }

                                       }

                                    }
   
                                 }
                                
                              }
                           }
                        break;


y

Código:
const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,    // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,       // Collection = Application
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum

      0x15, 0x80,        // Logical minimum (-128)
      0x25, 0x7F,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, 2,        // Report count = 16 bits (2 bytes)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 2,        // Report count = 16 bits (2 bytes)
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection
   };

Me podrian decir en lo que me estoy equivocando aca. Gracias ;)
 
Atrás
Arriba