Arduino: generar señales de tiempo crítico con interrupciones

2

Tengo algunos problemas para entender completamente cómo se interrumpe, por ejemplo. Arduinos / AVR se utilizan en la práctica. Asumamos que quiero generar una señal de tiempo crítico como PWM y al mismo tiempo poder responder a las entradas de los botones. Ambos deben implementarse con interrupciones.

¿Cómo puedo asegurarme de que la señal PWM no se ensucie cuando se activa el botón y, por lo tanto, se está ejecutando otra rutina de interrupción (no relacionada con la señal)? De manera similar, ¿cómo pueden las bibliotecas basadas en interrupciones como 'wire' asegurar que no se pierdan solicitudes mientras se ejecuta otro código (quizás también basado en interrupciones) (implementado por mí u otras librerías)?

    
pregunta dominik

1 respuesta

2

Es fácil: no puedes. Y depende de la plataforma.

Algunos microcontroladores tienen controladores de interrupción de múltiples prioridades, de modo que si se ejecuta un ISR de baja prioridad y se dispara una interrupción más alta, las micro paradas dejan de atender el bajo, guardan el contexto, atienden al de alta prioridad y luego regresan al inferior rutina de prioridad Para su ejemplo, probablemente establecería el PWM en prioridad alta y los botones en prioridad baja, esperar un puñado de nosotros por un ser humano no es un gran problema.

En términos generales, si un microcontrolador no tiene un controlador de interrupción con prioridad habilitada, un ISR no es interrumpible. Si se presiona un botón y, después de algunos ciclos de reloj, el temporizador se ajusta, así que es hora de alternar bien el pin PWM ... El pin esperará. El bit de solicitud de interrupción se establece y cuando el micro termina de dar servicio a los botones, regresará a la rutina principal y luego regresará para atender la nueva solicitud. Si se produce más de una solicitud mientras se atiende a otra ... Eso depende de la plataforma. Puede haber un orden fijo o programable, se puede servir FCFS o incluso al azar.

La clave es: mantener sus ISR cortos , y en breve quiero decir short . Cuanto más corto, mejor. O, en este caso específico, sirve la tarea no crítica mediante sondeo. Puede pasar un rato agradable (1) y revisar los botones que se encuentran allí, y hacer lo que tenga que hacer con su entrada, y generar PWM mediante interrupción.

Y el último consejo: no uses arduino. Si escribe todos su código, sabrá qué hace y cómo se comporta. Los micros Atmel pueden programarse en "vanilla" c o asm, y en mi opinión, es mucho mejor

    
respondido por el Vladimir Cravero

Lea otras preguntas en las etiquetas