Autor Tema: Duda PIC USB  (Leído 6343 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #15 en: 21 de Mayo de 2013, 14:54:17 »
Mmm bueno, gracias bruno, voy a probar con el metodo HID que lo utilice solo una vez, adaptando un ejemplo de un teclado, que no me anduvo para nada porque obviamente usaba delays para no enviar un millon de veces la letra cada vez que presionas la tecla jaja y como no supe sacarlos, perdia mucha info en el envio y lo deje ahi.
Ayer justo descargue algo llamado Application library de microchip. La instale y todo pero no me resolvió ningún problema con el driver, al contrario. Voy a probar con el Microchip solutions que me dijiste a ver si puedo terminar con este proyecto de una buena vez!

En cuanto pruebe seguramente voy a volver con mas dudas jaja
Saludos y gracias!

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: Duda PIC USB
« Respuesta #16 en: 21 de Mayo de 2013, 17:37:54 »
Buenas, pregunta para Bruno, ya que no sabia lo de las prioridades del bulk, implemente un joystick en HID leyendo encoders, y no lograba que la pc detecte cada movimiento del encoder, y no eran muchos, a lo sumo 10 por segundo, despues tome el mismo programa y lo hice en bulk y logro detectar mucho mas que 10 o 20 pulsos por segundo, siempre me pregunte si era problema del HID, o del soft de la pc que no lograba detectar tantos datos por segundo, es posible esto, o esta mal implementado algo en el HID y no caigo en la cuenta?

Saludos.
Alejandro.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #17 en: 21 de Mayo de 2013, 19:39:41 »
Mmm bueno, gracias bruno, voy a probar con el metodo HID que lo utilice solo una vez, adaptando un ejemplo de un teclado, que no me anduvo para nada porque obviamente usaba delays para no enviar un millon de veces la letra cada vez que presionas la tecla jaja y como no supe sacarlos, perdia mucha info en el envio y lo deje ahi.
Ayer justo descargue algo llamado Application library de microchip. La instale y todo pero no me resolvió ningún problema con el driver, al contrario. Voy a probar con el Microchip solutions que me dijiste a ver si puedo terminar con este proyecto de una buena vez!

En cuanto pruebe seguramente voy a volver con mas dudas jaja
Saludos y gracias!

Ese Application Library es precisamente el famoso "Microchip Solutions". Fijate en "...\Microchip Solutions v2012-04-03\USB\Tools\MCHPUSB Custom Driver\MCHPUSB Driver\Release\"

si te instala el driver en x64.

Buenas, pregunta para Bruno, ya que no sabia lo de las prioridades del bulk, implemente un joystick en HID leyendo encoders, y no lograba que la pc detecte cada movimiento del encoder, y no eran muchos, a lo sumo 10 por segundo, despues tome el mismo programa y lo hice en bulk y logro detectar mucho mas que 10 o 20 pulsos por segundo, siempre me pregunte si era problema del HID, o del soft de la pc que no lograba detectar tantos datos por segundo, es posible esto, o esta mal implementado algo en el HID y no caigo en la cuenta?

Saludos.
Alejandro.

Hola, cómo implementaste el encoder? Es decir, cómo representaste el encoder en el descriptor del HID? El problema muchas veces pasa por el lado de la PC. Uno siempre se envicia y quiere enviar la mayor cantidad de información posible, lo más rápido posible. Por ejemplo, si te dan a elegir el intervalo de envío, le ponemos 1ms (el mínimo para USB Full Speed). Todo tiene un costo. Seguramente lo que te estaba pasando en HID es que tu aplicación estaba perdiendo algunos paquetes, seguramente debido a la alta velocidad a la que los enviabas y/o a un mal driver de comunicación HID de la PC o bien a un algoritmo de captura de datos recibidos lento o deficiente. Por ahí es mejor hacer menos envíos y concentrar más la informacion, si es posible, para minimizar la posibilidad de perder un paquete y tener más tiempo de procesado y entre pooling.

Pensemos por ejemplo en un mouse, sea tanto por puerto PS2/mini-PS2 o USB. El mouse va a intentar enviar cada cierto intervalo de tiempo, entre otras cosas, la cantidad de movimiento acumulado. Si no puede confirmar el envío satisfactorio (tanto el PS2 como el USB permiten saber si el paquete ha sido enviado correctamente) seguirá acumulando los nuevos movimientos al previo, e intentará reenviar el paquete luego. Pero fijemonos en que la cantidad de movimiento total, cuando se reciba, se mantendrá fiel a la realidad (aunque habremos sido penalizados sin saber por dónde se ha movido el mouse durante todo ese tiempo en que no logró enviarnos su movimiento acumulado). Más de una vez seguramente habrán sufrido este tipo de "congelamientos" en el puntero del mouse de su PC, en el cual el mouse cambia de posición sólo una vez por segundo o a veces más. Pero sin embargo, una vez que la posición del puntero se refresca, el movimiento se mantiene fiel al hecho en el mouse. De eso se trata en caso de encoders, de no perder los valores ya que los datos relacionados al movimiento son relativos, no absolutos.

Saludos.






"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: Duda PIC USB
« Respuesta #18 en: 22 de Mayo de 2013, 21:53:53 »
Gracias Bruno por la respuesta, lo que implemente fue un joystick común, en el pic hacia la lógica para saber en que dirección giraba el encoder, cuando tenia ese dato lo enviaba como pulsación de un botón, por ejemplo el 1, cuando giraba en sentido contrario enviaba el 2, así cada vez que el pic detectaba que el encoder avanzaba o retrocedía enviaba el dato, luego lo dejaba un cierto tiempo pulsado, el suficiente para que el próximo movimiento del encoder no se solape con el anterior, y eso era todo, funcionaba muy bien, solo que lerdo, no se podía enviar muchos datos seguidos como te comentaba, luego con el bulk, lo que hago es directamente convertir la rotación del encoder en un numero, 1 para avanzar 255 para retroceder, y asi envio de una los datos de 8 encoders, mas 8 ejes, y alli desde un soft en visual basic interpretaba los datos, ahi se terminaron los problemas, puedo enviar datos suficientes para mi aplicación.
Otra cosa que me comentaron es la opción de hacer la repetición de un pulsador, osea que el driver de la pc al recibir una cierta cantidad de pulsos, pasaba a modo repetición, osea por cada pulso recibido el driver lo convertía en 10 por ejemplo, esto no lo probé (porque no me quedan claro algunas cosas), y no lei, fue el comentario de otro forista en otro foro.
Ahora viendo como funciona el sistema en modo bulk, no quiero cambiarlo, pero me gustaría saber por que no funcionaba antes.

Espero haberme hecho entender.
Saludos
Alejandro.

Edito, bah agrego algo, siempre trate el encoder como relativo, ya que paso solo los incrementos, como estaba tratado como pulsaciones de botones los incrementos, no puedo hacer lo mismo que el mouse
porque en realidad me serviria hacer lo que hace la rueda del mouse.
En definitiva lo que busco hacer es modificar algo en la pantalla (las radios del flight simulator), con un encoder, si giro rapido el encoder en lugar de saltar de uno en uno salta de 5 en 5, ese es el resultado
que buscaba con le HID, al final hago todo en un soft de visual basic y listo.
« Última modificación: 22 de Mayo de 2013, 22:05:37 por ALE1973 »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Duda PIC USB
« Respuesta #19 en: 23 de Mayo de 2013, 09:02:15 »
En definitiva lo que busco hacer es modificar algo en la pantalla (las radios del flight simulator), con un encoder, si giro rapido el encoder en lugar de saltar de uno en uno salta de 5 en 5, ese es el resultado
que buscaba con le HID, al final hago todo en un soft de visual basic y listo.

Jeje, justo estoy con esto, pero en lugar de las radios estoy haciendo un control para el MCP. Tengo montato el circuito en placa board pendiente de acabar la pcb y haciendo pruebas. Estoy controlando unos 10 pulsadores, un par de interruptores, unos 10 leds, 1 encoder y 1 lcd.
La conexión es usb en modo HID y no tengo ningún problema, ni noto nada de demora. La unica diferencia es que no lo controlo como joy sino que realicé una interface en C# que intreactua entre fsx y pic.

Lo que me gusta del HID es que no tengo que preocuparme de drivers :P

Un saludo

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #20 en: 23 de Mayo de 2013, 12:11:01 »

Ese Application Library es precisamente el famoso "Microchip Solutions". Fijate en "...\Microchip Solutions v2012-04-03\USB\Tools\MCHPUSB Custom Driver\MCHPUSB Driver\Release\"

si te instala el driver en x64.


Uh recién lo acabo de instalar y me lo tomo genial, pero el problema es que sigue sin enumerar el USB no se porque. Se estanca en el "usb_wait_for_enumeration();". Puede ser porque ningun programa en la pc recibe los datos que envio? Yo estoy usando el USB Monitor Pro, pero no se sirve para lo que yo quiero. Yo querria un Hyperterminal, pero para USB, ¿tenes idea de cual podria usar?

Gracias!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #21 en: 23 de Mayo de 2013, 12:29:38 »
Dónde estás viendo que se queda en usb_wait_for_enumeration()? En el PIC?

Te recomiendo que te bajes el USBLyzer y el USBDeview para poder saber bien qué está pasando y si  se está intercambiando información con el dispositivo. Para convertir un USB en RS232 se usa CDC.

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: Duda PIC USB
« Respuesta #22 en: 23 de Mayo de 2013, 12:55:19 »
En definitiva lo que busco hacer es modificar algo en la pantalla (las radios del flight simulator), con un encoder, si giro rapido el encoder en lugar de saltar de uno en uno salta de 5 en 5, ese es el resultado
que buscaba con le HID, al final hago todo en un soft de visual basic y listo.

Jeje, justo estoy con esto, pero en lugar de las radios estoy haciendo un control para el MCP. Tengo montato el circuito en placa board pendiente de acabar la pcb y haciendo pruebas. Estoy controlando unos 10 pulsadores, un par de interruptores, unos 10 leds, 1 encoder y 1 lcd.
La conexión es usb en modo HID y no tengo ningún problema, ni noto nada de demora. La unica diferencia es que no lo controlo como joy sino que realicé una interface en C# que intreactua entre fsx y pic.

Lo que me gusta del HID es que no tengo que preocuparme de drivers :P

Un saludo


Hola, yo tengo por ahora andado 5 encoders del panel de un C172, y el problema lo note cuando quieres por ej mover el OBS del VOR, y quieres darle una vuelta completa al VOR, entonces ahi empece a notar que debia dar como 20 vueltas del encoder, estudiando vi que se saltaban pulsos (como que la PC no los veia), entonces intente hacer la aceleracion como la de la rueda del mouse que cuando la giras rapido empieza a aumentar mas por cada pulso que llega a la pc, ahi vi que me era imposible lograr eso, por ello pase a bulk, con un soft en visal basic, y de ahi por ethernet lo escribo en el FSX, como alli puedo regular las aceleraciones, y la cantidad de pulsos por cada tic del encoder, opte por dejar asi como esta, la ves que quise utilizar esa forma en HID, se me colgaba todo.

Saludos.

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #23 en: 23 de Mayo de 2013, 14:44:02 »
Dónde estás viendo que se queda en usb_wait_for_enumeration()? En el PIC?

Te recomiendo que te bajes el USBLyzer y el USBDeview para poder saber bien qué está pasando y si  se está intercambiando información con el dispositivo. Para convertir un USB en RS232 se usa CDC.

Saludos

Hice que titile un led una vez después de el    usb_init(); una vez despues del    usb_task(); y cuando tendria que titilar de nuevo, pero dos veces, despues de Usb_wait_for_enumeration(); no lo hace, y se queda encendido. La idea era que desp de configurar todo se apague, pero nunca llega a enumerar el dispositivo. Dale, los voy a probar a ver que tal.

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #24 en: 18 de Junio de 2013, 17:21:32 »
Hola gente del foro! Pude resolver el problema de la velocidad con el CDC, pero tengo un nuevo problema... Cuando hago:

          rx_pc= usb_cdc_getc();
          usb_cdc_putc(rx_pc);

La pc SIEMPRE recibe 37 en decimal, sin importar que caracter le envie. El programa en pc es un transceptor via RS232. Enumera el dispositivo correctamente, funciona todo, excepto que el pic recibe siempre lo mismo. Lo use puenteando la RX con TX de una placa que convierte USB en RS232 y lo que yo envio, lo devuelve tal cual. Pero al momento de recibirlo en el pic, o de enviarle al pic siempre recibe 37 en decimal.

Espero que puedan ayudarme!
Gracias y saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda PIC USB
« Respuesta #25 en: 19 de Junio de 2013, 00:16:54 »
Hola, no recuerdo bien las librerías, pero no deberías primero asegurarte que hay algo que leer haciendo un usb_kbhit()?

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado cabflip

  • PIC10
  • *
  • Mensajes: 12
Re: Duda PIC USB
« Respuesta #26 en: 28 de Junio de 2013, 15:36:17 »
Hola, no recuerdo bien las librerías, pero no deberías primero asegurarte que hay algo que leer haciendo un usb_kbhit()?

Saludos.

Código: [Seleccionar]
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include ".\include\usb_cdc.h"

////////////////////// Definicion de las Funciones /////////////////////////////

void config_puertos (void){

   SET_TRIS_B (0b11111111); //Todo entrada, DATOS
   SET_TRIS_D (0b11110000); //4 bits + sign. ENTRADAS, 4 bits - sign. SALIDAS
}

/////////////////////////////// Defines ////////////////////////////////////////

#BYTE PORTA=0xf80
#BYTE PORTB=0xf81
#BYTE PORTD=0xf83


#define LED    pin_C0
   

////////////////////////// Variables Globales //////////////////////////////////

BYTE i,RX_PC=0,prueba=0xff;

//////////////////////////// Funcion Main //////////////////////////////////////

void main() {
   
   
   ON(Led);
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
   OFF(Led);
   delay_ms(500);
   ON(Led);
   
   while (TRUE) {   
      if(usb_cdc_kbhit())     //Si el ENDPOINT contiene datos del host..
         {RX_PC= usb_cdc_getc();
          usb_cdc_putc(RX_PC);
          usb_cdc_putc(prueba);
 

       

      }  //Bucle de transmision (If KBhit contiene datos)
//         ON(Led);    //Antes de salir enciende el led READY para proxima operacion
   }  //Bucle infinito
}  //Bucle Main


Sisi obvio, ahi esta todo el codigo. Envio a la PC sin problemas la variable PRUEBA, pero recibe SIEMPRE lo mismo, sin importar que dato le envie. ¿Alguno tiene idea de porque podria ser?