Las transmisiones USB fallan en mi GUI de software

3

Estoy transmitiendo una matriz de búfer desde el USB incorporado de los controladores PIC 18F y lo envío a una GUI. Soy capaz de detectar el dispositivo correctamente (enumeración). Pero la interfaz gráfica de usuario se bloquea algunas veces, sin ninguna razón.

Supongo que es un problema de transmisión / interrupción, ya que cada vez que envío un número constante no se bloquea. Pero siempre que hago una operación de ADC y envío el valor correspondiente a través de USB, se bloquea.

Esto supuso que la transmisión USB o el manejo de interrupciones deben manejarse correctamente.

Soy nuevo en el protocolo USB y probé con este código de trabajo.

No tengo ningún problema con respecto a la enumeración, pero cuando se transmite, se produce el bloqueo.

El formato del código es:

 main()
{   usbinit(); // usb initialization

       while(1)

{         
      x=do_adc();
      UsbTasks(); // does usb works    
      yourtasks();//sends the buffer 

}

}

Me gustaría entender cuál podría ser la causa detrás de este comportamiento anómalo.

Como se indica a continuación en los comentarios, la pila USB está configurada para la configuración de sondeo. ¿Cómo debo gestionar la lectura de ADC?

Si lo hago:

while(1)

    {         

          UsbTasks(); // does usb works
           x=do_adc();    
          yourtasks();//sends the buffer 

    }

¿Hará algún cambio? ¿O no es esta la mejor manera de enviar valores ADC?

    
pregunta Rookie91

1 respuesta

4

De acuerdo con la Clase de CDC USB en un dispositivo incorporado nota de Microchip que en su mayoría aplica también a otras clases de dispositivos:

  

La rutina de Tareas de USB se puede usar de manera encuestada y cooperativa, como se demuestra. Si es así, nada en el bucle principal debería bloquearse durante más de unos pocos microsegundos o eventos que pueden perderse.

Por lo tanto, las dos soluciones principales que vienen a la mente son:

  • En lugar de esperar a que la conversión de ADC termine, inicie la conversión y luego use una interrupción de conversión completa para que el ciclo de procesamiento principal pueda continuar mientras el ADC toma una muestra.

  • Configura la pila USB para usar el modo controlado por interrupciones para eliminar los requisitos para llamar a UsbTasks con tanta frecuencia.

Para la mayoría de las aplicaciones, diría que esta última es probablemente la solución más fácil para que no tenga que preocuparse mucho si su bucle principal se detiene un poco.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas