Boa noite Cláudio,
Primeiro gostaria de parabenizá-lo pelo excelente conteúdo do blog e pela sua bondade em compartilhar seus conhecimentos.
Bom, gostaria de sua ajuda pra tentar solucionar um problema de mau funcionamento em um projeto que estou desenvolvendo baseado nesse Contador up/down com PIC 16F628A.
Fiz algumas modificações no código para que ele funcione como um temporizador ON/OFF, ou seja, programo um tempo em que ele vai ficar ligado e um tempo em que ele vai ficar desligado e esse ciclo fica se repetindo.
Na simulação com o Proteus tudo funciona perfeitamente, mas, quando gravo o PIC e testo no protoboard até consigo programar os tempos ON/OFF mas quando dou o start ele apaga o display ou as vezes aparece uns números aleatórios.
Já revisei a montagem e está tudo ok
Já troquei o PIC 4 vezes e nada
Já troquei a fonte e nada
Não sei se tem alguma coisa haver mas estou desconfiando que o timer0 e timer1 não funcionam muito bem trabalhando juntos. Será que é isso?
O timer0 mantive igual ao código original, faz a multiplexação do display de 7 segmentos
O timer1 estou usando como base de tempo para os segundos e só ligo ele quando dou o start.
Não sei o que fazer e gostaria de uma luz
Se precisar eu coloco o código aqui.
Olá Nelson!
Provavelmente a alteração que você fez no código está produzindo o erro. Verifique a rotina que você fez, se ela não está 'trancando' o código com o uso de delays. Dentro da rotina de interrupção de algum timer não é recomendado o uso da rotina 'delay_ms() ou delay_us()'.
Oi Cláudio,
Muito obrigado por responder a minha questão.
Verifiquei o que vc falou sobre os delay's e não estou usando nenhum deles dentro da rotina dos timers.
Fiz vários testes e acabei descobrindo a solução.
Por incrível que pareça era um erro básico de programação mesmo, mas, que nunca tinha levado em conta nos meus projetos.
As variáveis que eram carregadas para o display de 7 segmentos não tinham sido inicializadas previamente e eu acho que estavam assumindo valores aleatórios durante a inicialização do código, ou seja, bastou apenas inicializá-las com o valor "0" (ex. int VAR=0) e, pronto, tudo está funcionando perfeitamente.
E o pior é que recentemente eu li um comentário de um outro colega dizendo que os registradores tinham "vida própria" e por isso a importância de inicializá-los previamente.
Vivendo e aprendendo!!!!
Muito obrigado Cláudio