Esa funcion no limpia el flag.
El flag esta bien limpiado.
Lo unico que veo distinto a los demas timers ( suponiendo que tiene un modulo CCP y es un PIC16F887 ) es que el timer 2 se compara con PR2 para generar la interrupcion. (y no por overflow como los demas)
Y al generarse la interrupcion el mismo se resetea a 0
When a match occurs, two things happen:
• TMR2 is reset to 00h on the next increment cycle
• The Timer2 postscaler is incremented
Entonces al ser 0 el PR2 y entrar a la interrupcion, el timer se resetea a 0 esta continuamente generando una condicion de match (igualdad) con PR2 y por lo tanto es imposible limpiar la condicion de interrupcion.
En ves de usar la logica de cargar el complemento a 2 de un numero en el TMR2 , directamente carga el numero que quieras llegar en PR2 y poner el time2 a 0 por unica vez al comienzo.
Ejemplo
TMR0/1: si yo quisiera contar 100 (0x64) ,en los demas timers deberia cargar el complemento a 2 de ese numero (0x9C), asi comienza de ese numero y cuando se produce el overflow ahi activa la interrupcion.
TMR2: Con el timer 2 si quisieras contar 100, directamente cargas 100 en PR2 y pones el timer2 a 0, esto lo tenes que hacer solo 1 ves. ya que solo el timer se va a poner a 0 cuando entre en la interrupcion. Y estaria contando 100 siempre, la unica forma de desactivarlo es desactivando la interrupcion del mismo.
(Aunque no recuerdo creo que es 99, por que utiliza 1 ciclo para el borrado, pero por por las dudas usa 100)
Lamentablemente no puedo decir mucho ya que no se que micro es.