Go Down

Topic: Alguém com paciência, tempo e hardware para testar um RTC? (Read 1 time) previous topic - next topic

bubulindo

Viva,

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

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).
This... is a hobby.

HugoPT

Antes de mais parabéns pelo desenvolvimento.
Quote
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.http://www.engbedded.com/fusecalc
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

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

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.

This... is a hobby.

HugoPT

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?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

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

This... is a hobby.

bubulindo

#5
Nov 27, 2012, 12:26 pm Last Edit: Nov 27, 2012, 03:11 pm by bubulindo Reason: 1
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/doc1259.pdf
http://www.atmel.com/Images/doc8161.pdf   página 155.


This... is a hobby.

bubulindo

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

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.
https://github.com/bubulindo/RTC

This... is a hobby.

HugoPT

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   ;)
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Um dos bugzinhos já foi resolvido.

Falta adicionar e tirar outras cenas. Mas isso vai ter de espera um pouco agora. :(
This... is a hobby.

Go Up