Amigos
Estou querendo fazer um relogio mais ou menos preciso e com custo bem baixo. A precisão não precisa ser "o bixo" dando uns 30s de diferença por dia, tranquilo. Eu fiz alguma coisa com o 16f628 usando o CCS e ficou legal. Ultimamente eu estou usando o pic 16F916 e o compilador de c do hitech e não consigo ter os valores, que eu calculo para o timer, na prática.
é algo mais ou menos assim:
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & CP & CPD & BOREN & FCMDIS);
typedef struct RELOGIO
{
signed int usegundo; signed int dsegundo; unsigned um_ds:1;
};
bank2 volatile struct RELOGIO relogio;
void main (void){
OSCTUNE = 0b00000000;
OSCCON = 0b01110100; // 8 Mhz com oscilador interno
OPTION = 0x82; // Preescaler TIMER0 8
TMR0 = 131;
T0IE = 1; // Habilita a IRQ de estouro do timer 0
PEIE = 1; // Habilita as IRQs dos periféricos internos do PIC
GIE = 1; // Habilita todas as IRQs programadas
while(1){
//display(relogio.dsegundo); //mostra no display o relogio em decimos
if (relogio.um_ds) {
relogio.dsegundo++; // contador de decimos de segundo
}
}
}
static void interrupt global(void)
{
// Testa se houve IRQ do timer0 FOSC/(4*PRESCALER*TAM_TIMER)
if((T0IF)&&(T0IE)) //Frequencia = 8MHz/(4*8*125)
{
T0IF = 0;
TMR0 = TMR0 + 131; // 256 - 125 = 131;
if (relogio.usegundo >= 200)
{
relogio.usegundo = 0;
relogio.um_ds = 1;
}
relogio.usegundo++;
}
}
não tenho outras interrupções no programa.
Eu carrego o valor atual do timer0 junto com o incremento para evitar de perder ciclos que ja ocorreram.
Ele da diferença. No próprio simulador do hitech onde deveria dar 100ms, exatamente, da 100.54, com a linha da rotina de escrita no display comentada, e no pic (físico) da diferença de uns dois segundos a cada 10.
Se eu coloco outras interrupções, junto, ai que a coisa fica uma bagunça, muda muito os valores de tempo.
Alguém poderia me ajudar?