Tengo una pequeña duda sobre la TOVn
bandera ubicada en el TIFRn
registro.
La hoja de datos dice que si el TCNTn
contador se desborda, la TOVn
bandera ubicada en el registro TIFRn
se establecerá en 1
. (en el mismo ciclo de reloj se produjo el desbordamiento).
El código para manejar dicho evento es el siguiente:
/* Check if TOV1 flag is set */
if (TIFR1 & _BV(TOV1)) {
/* Since TOV1 is set, we know we missed an overflow interrupt */
/* Handle the event... */
// ... timer_ovf_cnt++;
/* Prevent ISR to be called, because we already handled the overflow */
TIFR1 = _BV(TOV1); // .. but TOV1 is already set in TIFR1?
}
Pero lo que me confunde es: ¿por qué debo configurar el TOV1
bit cuando ya está configurado por hardware? ¿La configuración de la TOV1
bandera en TIFR1
la mano 1
del usuario desactiva la interrupción del temporizador? (¿Incluso si el indicador TOV1 ya está configurado por hardware?)
EDITAR : Encontró la respuesta: ¿ Borrar bits de bandera escribiendo 1?
El objetivo de escribir 1 para borrar es borrar la bandera atómicamente sin cambiar ninguno de los otros bits. Claro, es posible hacer una lectura-modificación-escritura y borrar un bit de esa manera, pero luego puede sobrescribir un indicador que se configuró en el hardware entre la lectura y la escritura. Dado que no hay razón para establecer el bit desde el software, el flip flop está configurado para que el hardware pueda establecer el bit y el software pueda borrarlo escribiendo 1. Esto no es necesario para las banderas que se establecen en un controlador de interrupción como usted puede simplemente deshabilitar las interrupciones durante la operación de lectura-modificación-escritura.
La otra publicación no menciona nada sobre la atomicidad, que es el razonamiento detrás de este diseño.
ricardo