CONTADOR DIGITAL UP/DOWN – COM PIC 16F628A (REF308)  

  RSS

0

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.  

 
0

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()'.

 
0

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   

 

 
Share: