Alguém com paciência, tempo e hardware para testar um RTC?

Viva,

Estou aqui a trabalhar numa biblioteca para criar um RTC com o chip dos Arduinos e um cristal de 32768 Hz. :slight_smile: 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. :slight_smile:

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. :frowning:

Aqui está uma foto dum ATmega168 a rolar o RTC.

Até agora isto conta horas e data e dá a possibilidade de gerar um pulso de segundo a segundo em dois dos pinos do ATmega (puramente por hardware).

Antes de mais parabéns pelo desenvolvimento.

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. :slight_smile:

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.

Referências para isto:

http://www.atmel.com/Images/doc8161.pdf página 155.

Ok...

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. :frowning:

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 :wink:

Um dos bugzinhos já foi resolvido.

Falta adicionar e tirar outras cenas. Mas isso vai ter de espera um pouco agora. :frowning: