Estoy transmitiendo una matriz de búfer desde el USB incorporado de los controladores PIC 18F y enviando esto a una GUI. Soy capaz de detectar el dispositivo correctamente (enumeración). Pero la GUI falla algunas veces, sin ningún motivo.
Supongo que es un problema de transmisión/interrupción, ya que cada vez que envío un número constante, no falla. Pero cada vez que realizo una operación ADC y envío el valor correspondiente a través de USB, se bloquea.
Esto hizo que supusiera 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 administrar 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?
De acuerdo con la nota de aplicación USB CDC Class on an Embedded Device de Microchip, que también se aplicaría principalmente a otras clases de dispositivos:
La rutina USBTasks se puede utilizar de manera cooperativa, como se muestra. Si es así, nada en el bucle principal debe bloquearse durante más de unos pocos microsegundos o los eventos pueden perderse.
Entonces, las dos soluciones principales que se me ocurren son:
En lugar de esperar a que termine la conversión del ADC, 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.
Configure la pila USB para usar el modo controlado por interrupción para eliminar los requisitos para llamar 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, por lo que no tiene que preocuparse tanto si su bucle principal se detiene un poco.
PedroJ
UsbTasks
durante demasiado tiempo.Novato91
David
Novato91