
Não sei se vai ajudar alguém, porém tenho observado uma coisa até que óbvia, mas que pode passar desapercebido e causar muitos transtornos.
Sempre que você utilizar uma variável LOCAL na interrupção e essa variável tiver que ser "manipulada" fora da interrupção, lembre-se de que variáveis LOCAIS, são utilizadas apenas naquele momento da sua execução, após isso ela é "descartada".
Exemplo:
"FORMA ERRADA"

Rotina utilizando a interrupção do TIMERx:
voide timer....}
rotina de interrupção....
Rotina comum que esta dentro da interrupção do TIMERx
void PiscaumLed()
{unsigned char Contador (essa variável é declarada localmente, aqui esta o problema)
if(Contador==100)
{
Contador=0;
PiscaLed=~PiscaLed;
}Contatdor++;
}
Notem que a a variável Contador foi declarada como LOCAL, note também que o protótipo void "PiscaumLed()" é uma rotina de chamada que tem uma "variável GLOBAL".
Caso você declare ela como LOCAL, como é o caso da rotina acima, acontecerá que a contagem dessa variável vai se perder.
O correto é fazer a declaração GLOBAL, ficando assim:
"FORMA CORRETA"

unsigned char Contador; (essa variável esta sendo declarada de forma GLOBAL).
Rotina comum que esta dentro da interrupção do TIMERx
void PiscaumLed()
{
if(Contador==100)
{
Contador=0;
PiscaLed=~PiscaLed;
}Contatdor++;
}
Peço desculpas se não consegui me expressar corretamente, espero que tenham entendido e ficarei muito feliz se apenas um amigo for beneficiado com esta dica...deixem seus comentários.