por Pask » 11 Jan 2007 19:03
Gostaria que alguém pudesse me ajudar no seguinte: elaborei um programa em assembly para um relógio digital que está funcionando muito bem com o PIC 16F628 e 4 displays multiplexados. No entanto, a base de tempo da contagem do tempo do relógio é feita pelo TIMER 1 através do seu oscilador externo via cristal de 32,768 kHz. Então, a base de 60 segundos fica 30,5175us (1:1 prescaler) x 16.384 (TMR1) x 120 (DIVISOR_TMR1) = 60s.
A interrupção do timer 1 foi habilitada e ocorre com periodicidade de 1/2 segundo até completar 1 minuto. A partir daí, ocorrem os incrementos aos dígitos de minutos, horas, etc. O problema é que está havendo uma tendência do relógio a atrasar. Após 24 horas de funcionamento, eu percebo uma diferença de quase 3 segundos em relação ao relógio que usei para acertá-lo, ou seja, ele perde o sincronismo com o relógio comercial usado. Detalhe: o relógio comercial na verdade é o relógio do meu telefone celular que é muito preciso! Sendo assim, quem está realmente atrasando é o relógio com o PIC.
Também já usei como base de tempo o próprio oscilador de clock do PIC (4MHz) com cristal de quartzo externo mas ficou ainda pior, pois o atraso chegava a quase 4 segundos em 24 horas!
Para tentar contornar este problema, elaborei uma sub-rotina que corrige o valor da variável DIVISOR_TMR1 de x tempo em x tempo alterando seu valor final. Com isto, consigo manter o relógio mais ou menos preciso por mais de 10 dias. Mas, eu pergunto, não haveria uma forma de mantê-lo funcionando com ótima precisão por vários meses de outro jeito? Eu sei que todo relógio atrasa e/ou adianta um pouco após várias semanas ou meses de funcionamento. Eu apenas gostaria que o meu relógio digital fizesse a "mesma coisa", ou seja, que fosse preciso corrigir sua hora após alguns meses apenas e não a cada 10 dias! Se ele permanecesse atrasando 0,5 minuto a cada mês já estaria ótimo. Ao final de 1 ano ele teria atrasado 6 minutos apenas.
Alguém pode me dar uma luz? Obrigado.
Pask.