¿Cuál es una buena estrategia para leer muchas entradas de botones mientras se sigue usando USB?

0

Estoy tratando de diseñar un joystick USB con muchos botones diferentes. La placa que estoy usando ahora tiene un ATmega32U4, un puerto USB y 16 pines de E / S. Estoy usando LUFA para una pila USB.

Sé que puedo obtener 8 * 8 = 64 entradas de los 16 pines de E / S al crear una cuadrícula y una luz estroboscópica sobre ella, pero me preocupa cuánto tardará en completarse y si puede afectar a la conexión USB Debido a los retrasos. (Me doy cuenta de que las luces estroboscópicas a través de 64 valores de E / S probablemente no tomarán tanto tiempo, pero planeo poner un poco de procesamiento adicional para que esto ralentice aún más las cosas).

Mi plan era crear una interrupción de temporizador y usar la interrupción para llamar a las funciones HID_Device_USBTask () y USB_USBTask (). ¿Parece razonable o hay un mejor enfoque que podría tomar?

    
pregunta samoz

1 respuesta

1

Esto suena muy razonable, siempre y cuando tenga en cuenta que acceder a los mismos datos mediante el código normal y el código de interrupción puede causar problemas, si sucede al mismo tiempo.

Imagínese, tiene un búfer para enviar datos a través de USB y un contador para el número de bytes de datos que realmente están dentro del búfer.

En realidad, hay 10 bytes para enviar en el búfer, por lo que counter = 10.

Si su código desea agregar tres bytes más, lo hará:

  1. Lea counter para saber en qué posición del búfer deben insertarse los bytes
  2. Escriba los bytes en las posiciones 11, 12, 13
  3. Aumente counter en 3, ya que ahora hay tres bytes más en el búfer.

La rutina de USB llamada más tarde, será para esto:

  1. Lea counter para saber cuántos bytes deben enviarse
  2. Envía esos bytes
  3. Establezca counter en cero

Ahora, si la rutina USB es llamada por una interrupción del temporizador, se llama mientras su función normal está ejecutando una línea aleatoria. Por ejemplo, puede llamarse justo después de que la función normal haya procesado el paso 2. ¿Qué sucede?

  • La rutina normal ya ha escrito los nuevos bytes en las posiciones 11, 12 y 13.
  • La rutina USB lee counter , que todavía es 10, y por lo tanto envía solo los primeros diez bytes en el búfer. Después, establece counter en cero.
  • La rutina normal continúa donde se interrumpió y aumenta counter en tres. Es counter = 3!

El código no solo ignora los nuevos tres bytes. En la próxima llamada, la rutina USB enviará los primeros tres bytes en el búfer, que son los mismos tres bytes enviados por la última llamada.

Para evitar este problema, simplemente haga todo el procesamiento de datos / lectura de botones mientras que la interrupción del temporizador llama a la rutina USB. Tan pronto como desee colocar datos en el búfer, deshabilite la interrupción / temporizador, escriba en el búfer y a counter , y habilite la interrupción nuevamente.

La rutina USB se debe llamar al menos una vez dentro de un intervalo de tiempo determinado. Si su tiempo es demasiado apretado, es posible que exceda el intervalo al desactivar la interrupción. Por lo tanto, llame a la rutina del USB manualmente después de deshabilitar la interrupción, o elija un período mucho más corto para su temporizador.

    
respondido por el sweber

Lea otras preguntas en las etiquetas