Porém não quero utilizar esses chips do tipo timer counter, tipo 1307 da vida, eu quero fazer tudo na mão mesmo. O motivo é custo, final!
Já implementei as rotinas e estou utilizando como fonte de clock uma rotina DDS e o clock eu pego o da própria CPU (pic16f887a).
Porém tenho notado que há um erro na contagem dos segundos, esta adiantando em 4 segundos, num periodo de 24horas, estou pegando como base o relógio do PC para fazer essa comparação.
Eu estou um tanto admirado, porque o DDS é muito preciso, pelos menos em frequencias acima de 100hz...será que o DDS é o culpado desse erro?
Se vocês, puderem me ajudar indicando uma forma de ter uma fonte de clock precisa, por favor...abaixo segue minha rotina DDS:
inicialização:
cpp code
#define HZ 4000000
#define TOGGLE (((HZ * 5) / 1) * 5)
// long 32bits:
volatile unsigned long accum_01, accum_02;
volatile unsigned long noteon, freqhz_01, freqhz_02;
T2CON = 0b00000100;
PR2 = (100-1);
INTCON = 0b11000000;
PIE1.TMR2IE = 1;
freqhz_01 = 20000; // BASE DE TEMPO 1 HZ = 0,5 nível 1 e 0,5 nível 0.
freqhz_02 = 20000;
accum_01 = 0;
accum_02 = 0;
/***********************************************
ROTINA DE INTERRUPÇÕES
************************************************/
void interrupt()
{ //Vetor de interrupção , endereço 04h de memória
PIR1.TMR2IF = 0;
accum_01 += freqhz_01;
accum_02 += freqhz_02;
/* OSCILADOR DDS: */
if(accum_01 >= TOGGLE)
{
accum_01 -= TOGGLE;
pisca=~pisca;
if(pisca==0) {if(segundos==60) {segundos=0; if(minuto==59) {minuto=0; if(hora==23) hora=0; else hora++;} else minuto++;} segundos++;}
}
}