Te voy a dar un ejemplo espero que mas sencillo de entender.
Tu interrupcion del Timer2 esta atado a la frecuencia del PWM, supongamos que tenes una frecuencia de PWM 1KHz es decir cada 1ms tendrias una interrupcion del Timer2. (Valor tal ves no correcto pero que sirve de ejemplo )
Otra condicion que te dije es que si te quedas dentro de la interrupcion no entra a otra interrupcion hasta que sale finalmente.
Esto ocurriria en tu programa:
Tiempo transcurrido - Accion
1ms - Entro a la interrupcion del Timer2
31ms - Termina el delay y sale de la interrupcion, aca me perdi 30 interrupciones del Timer2, el problema es que apenas salga como queda pendiente vuelve a entrar
31ms - Entro de nuevo a la interrupcion del Timer2
61ms - Repito el ciclo de salir
Existe un problema. NUNCA tengo otro tiempo. Apenas sale de la interrupcion como hay otra pendiente vuelve a entrar. La otra es que poseas un PWM de 50Hz y el tiempo te sobre. Otro problema de esto es que pasa si tenes un codigo en el while del main? Y ocurre este caso?. Nunca lo vas a poder ejecutar. Por eso nuevamente
no uses delays en la interrupcionSi (con el tiempo que suponimos) mi interrupcion del Timer2 es 1ms. Y quiero leer cada 30 ms el valor de los Timers. Que evita que yo ponga un contador en ves de un delay? Es decir cuando entre 30 veces a la interrupcion recien ahi tome el valor de los timers.
void TIMER2_isr(void)
{
if (contador >= 30)
{
a=get_timer0();
b=get_timer1(); //CONT Pulsos
set_timer0(0);
set_timer1(0);
contador = 0;
}
contador++;
}
De esta forma ejecutar la interrupcion es rapida, y no me detengo dentro de la misma para siempre. Revisar si el contador tiene el valor correcto llevara 5 ciclos de instruccion como mucho si cuento el incremeto tambien.
-------------------------------------------------
Ahora vamos a los tiempos que posee tu programa
Timer2 tiene un OV cada 50ms
Y encima necesitas 30ms mas para poder obtener buenos valores en los demas Timers.
Por que no directamente implementas un contador y que cada 100ms proceda a tomar los valores de los Timers 0 y 1.
El Timer0 podes contar hasta 511 ( si pensas en el flag de interrupcion como un noveno bit ) Y te aseguras de que nunca supere este valor con los preescalers.
El Timer1 no vas a tener problemas.
Que velocidades va a tener y cuantos pulsos por revolucion van a entrar en cada caso ?