Você não precisa de um RTC para construir um relógio: o chip ATmega possui todo o hardware necessário para desempenhar as funções do próprio RTC. Aqui está como:
Obtenha um cristal de relógio de 32768 Hz: compre-o ou desmonte um relógio antigo. Esses cristais, projetados especificamente para manter o tempo, apresentam uma variação de temperatura extremamente pequena. Você também precisaria de um desses se quisesse usar um chip RTC.
Configure os fusíveis do seu ATmega para executar o oscilador RC de 8 MHz. Isso tornará sua millis()
função terrivelmente imprecisa e também libertará os pinos XTAL1 e XTAL2.
Conecte o cristal do relógio aos pinos TOSC1 e TOSC2. Esses são os mesmos pinos que XTAL1 e XTAL2 (9 e 10 no 328P). Os nomes diferentes são usados para significar funções diferentes.
Configure o Timer / Contador 2 para operação assíncrona, modo de contagem normal, pré-calibrador definido como 128 e ative a interrupção de estouro do timer.
Agora você receberá uma interrupção TIMER2_OVF a uma taxa muito constante de uma vez por segundo. Você só precisa avançar a exibição do relógio em um segundo no ISR. Entre as interrupções, você pode colocar o MCU em sono muito profundo (modo de economia de energia: nada funciona além do Timer / Contador 2) e pode ser executado por anos em algumas células AA. A menos que a tela tenha muita energia, obviamente.
Fiz exatamente isso para construir meu relógio de parede de 24 horas com uma mão . Este link aponta agora para a tradução em inglês da documentação original em francês.
Calibração de quartzo
Se você não calibrar seu quartzo, poderá esperar um desvio significativo, geralmente alguns segundos por semana . A taxa de desvio depende da capacitância dispersa dos traços que conectam o cristal à MCU. Em princípio, poderia ser removido adicionando alguma capacitância extra e afinada. Vale a pena notar que você teria o mesmo problema de desvio com um RTC.
Se você estiver satisfeito com esse tipo de precisão, viva com ele e seja feliz. No entanto, se você deseja medir a deriva, notará que é muito estável. Você pode compensar isso facilmente em software e obter uma precisão de alguns segundos por ano .
O algoritmo para corrigir a deriva é muito simples. A partir da deriva medida, você descobre o atraso preciso entre as interrupções, que deve estar muito próximo de 10 9 nanossegundos, depois:
#define ONE_SECOND 1000000000 // in nanoseconds
#define ONE_INTERRUPT 999993482 // for example
ISR(TIMER2_OVF_vect)
{
static uint32_t unaccounted_time;
unaccounted_time += ONE_INTERRUPT;
while (unaccounted_time >= ONE_SECOND) {
advance_display_by_one_second();
unaccounted_time -= ONE_SECOND;
}
}
No exemplo acima, o quartzo é um pouco rápido demais e o software compensa "faltando" um tiquetaque a cada poucos dias. Se o quartzo fosse muito lento, o mesmo código ocorreria duas vezes a cada poucos dias.
Esse tipo de calibração também poderia ser feito para um RTC, mas seria significativamente mais complexo, porque o RTC relata o tempo em uma forma discriminada que não se presta naturalmente a operações aritméticas.