Estou aqui a trabalhar numa biblioteca para criar um RTC com o chip dos Arduinos e um cristal de 32768 Hz. Já o tenho a funcionar, mas para testar o código preciso de mais tempo... que é coisa que me escapa ultimamente. :\
Para usar a biblioteca será preciso um ATmega328, 168 ou ATmega16, 32, 644, 1284. Também compila para o mega2560, mas os "idiotas" do Arduino não deixaram os pinos disponíveis para ligar o cristal na placa oficial, logo placas baseadas no Arduino Mega não podem usar isto. Quem tiver placas como as da SeeedStudio, pode usar a biblioteca.
Até agora o máximo que consegui "testar" foram umas 6 horas e não obtive diferenças que se notassem a olho nú, provando então que o código que conta as horas não está completamente errado. Para usar isto nos ATmega168 ou 328, temos de desactivar o cristal externo de 16MHz e usar o cristal interno, ainda não vi exactamente como fazer isso com a IDE do Arduino, mas é possível de fazer. Depois liga-se o cristal de 32kHz nos pinos do cristal de 16MHz e isto funciona.
Quem quiser testar isto durante alguns dias ou mais, que diga e eu tento colocar isto de forma a poder ser usado no chip que tiverem. Devido ao que disse anteriormente, usar isto nas placas do Arduino não é muito aconselhável pois vão ter de dessoldar cristais e soldar outros e as placas além do Duemilanove não usam cristal tornando isto impossível.
Para usar isto nos ATmega168 ou 328, temos de desactivar o cristal externo de 16MHz e usar o cristal interno, ainda não vi exactamente como fazer isso com a IDE do Arduino, mas é possível de fazer
Para fazer isto tens de mexer nos bit fuses podes usar este online calculator para isso.AVR® Fuse Calculator – The Engbedded Blog
No forum do Nick Gammon tambem tem um bom tuturial para isso.
Pelo que percebi o que tu concebeste foi ligar o oscilador interno do microcontrolador para o seu proprio clock e usar a entrada desactivada por consequência para la ligar o cristal de 32768 Hz fazendo um contador interno de 16 bits para dar 1 Segundo e assim o RTC?
Hoje chegou o meu Saleae Logic, nao tenho nenhum cristal de 32768 mas certamente poderei arranjar um e teria todo o gosto em testar isso no logic.
Posta a biblioteca que faço uns prints assim que arranjar o cristal
viva, os fuses eu troquei com um avrfuses para mac. isso é simples.
Existe um ficheiro com isso no site do arduino para ser possível de testart com a IDE.
o relogio é feito com o timer 2 em modo assincrono. Ou seja, um timer de 8 bits, com um prescaler de 128, sempre que existe um overflow passaram-se 32768 pulsos... exactamente o que esse cristal dá.
Se usar um modo que permita usar o output compare, posso ter os pinos OC2A e B, a trocar de estado de segundo a segundo. Que é o que tenho aqui.
Vou meter as funções numa classe e meto por aqui um link. Eu vou ver se ligo um DS1307 para sincronizar e testar entre ambos, mas quanto mais gente experimentar, melhor.
Estou aqui a pensar nos efeitos colaterais que tem em usar o oscilador interno.Iremos perder a funçao milli()(deixa de contar corretamente) e provavelmente a Uart tambem necessitará de ser ajustada em termos de baud rate correcto?
Isso é feito com as definições da MakeFile (ou neste caso, com as definições da placa a usar). Se escolheres a placa que usa os 8MHz, duvido que isso parta o millis() e a UART porque esses valores são calculados com base no relógio.
Como isto usa o Timer2, também não é por isso que estraga o millis.
Pensando um pouco mais... pode dizer-se que o millis() não será tão preciso como é actualmente porque o oscilador interno é uma malha RC e o cristal externo é bastante preciso. Mas o código está preparado para usar um clock de 8MHz. Podes ver isso no ficheiro wiring.c.
A UART... bom, toda a gente fala disso e dão a ideia que a UART é impossível de usar com o cristal interno, mas a realidade que experimentei agora com este micro durante horas agora e há uns 10 anos atrás com o atmega8 é que a UART funciona de forma idêntica. Claro que, as frequências mais altas são piores (ou impossíveis) de atingir, mas até 19200 nunca vi grandes problemas.
Notei alguns problemas na biblioteca e coisas que se podem melhorar (meti uma descricão no ficheiro .cpp) mas vai ter de esperar um pouco porque infelizmente vou ter trabalho nos pröximos tempos.
Quem quiser tirar os ficheiros é fazer download daqui. A documentacão é... inexistente, pelo que se tiverem dúvidas acerca de como usar o código podem perguntar aqui.
Estive a ver o teu codigo e assim que possa vou testar.Para ja gostei de ver o código está muito bem escrito e comentado. É bom olhar para código human readable que por vezes alguns programadores gostam de baralhar