Estou apanhando para entender o que está acontecendo em uma aplicação simples e banal.
Estou usando um ATmega48, o foco do problema está com o registro GPIOR0. Trabalhando em C com o toolchain da Atmel.
Seto um flag na interrupção do timer 2. Este flag está no bit 1 de GPIOR0.
O assembler gerado é uma instrução SBI do tipo (R-M-W). Esta int. ocorre a cada segundo.
O clock está com 4Mhz rodando o código.
Em um trecho do main() este flag é testado e soma uma unidade a uma variável.
Faço o teste com 1000 segundos (1000 incrementos) e perco 4 segundos, objetivamente.
Fiz os seguintes testes:
1- O flag da interrupção estaria sendo perdido ?
Executei a tarefa dentro da int. Não gerou erro.
2- Por um erro de digitação este flag estaria sendo alterado em outro trecho do programa. Não achei onde.
Troquei o bit 1 pelo 6 e o erro continuou.
3- No trecho que está testando o flag e após desviar limpo o flag. Tirei a interrupção neste trecho.
Contiunou o erro.
4- Imaginei algo com (Read-Modify-Write).
Modifiquei o programa para evitar instruções SBI ou CBI (RMW). Não deu certo, continuou perdendo o flag.
5- Mudei o flag para o registro GPIOR1 que está em outra posição da memo e não usa (RMW). Funcionou corretamente. Tive que deixar assim.
6- Analisei a possibilidade da salva de contexto na int do timer zero que trabalha bastante em cima de GPIOR0 e seus bits, mas não encontrei nada que pudesse estar modificando o flag no bit 1.
Cabe observar que cinematicamente a velocidade de execução do programa é sem sincronismo com timer2 a cristal. Isto dá um certo movimento onde a int do timer 2 ocorre em diversos pontos do programa.
Onde e por que este flag está sendo perdido ????