Estoy usando dos interrupciones de temporizador:
-
TIMER0_OVF
se activa cada 12 ms, con su ISR solo sondeando un pin, estableciendo condicionalmente una bandera e incrementando un valor, por lo que debería completarse bastante rápido -
TIMER2_OVF
se activó a una velocidad de 4 kHz, y su ISR solo alterna un pin de salida para hacer que suene un altavoz piezoeléctrico
Dado que el TIMER0_OVF ISR bloquea las interrupciones de TIMER2_OVF por un breve momento cada 12 ms, el pitido no suena limpio, se superpone con un "rrr ...".
Agregar ISR_NOBLOCK
a TIMER0_OVF ISR resuelve esto y suena un pitido limpio, y el resto aún funciona bien.
Sin embargo, no estoy seguro de si este es un uso válido de ISR_NOBLOCK
y si hay una forma más elegante de generar un pitido "limpio".
Leer sobre ISR_NOBLOCK
en < avr / interrupt.h & gt ;: Interrupts Me da la impresión de que está pensado para casos excepcionales en los que se necesitan interrupciones anidadas y se deben utilizar con cuidado.