terça-feira, abril 07, 2020

Relógio de Tempo Real: DS1302

Vamos interromper nossa "programação normal" para quatro posts sobre relógios de tempo real (RTC). RTCs são circuitos integrados especializados para contar data e hora. Os quatro modelos que vamos ver são os que tenho em mãos (existem vários outros) e são facilmente encontráveis, seja na forma de CI solto ou como módulo para Arduino, Raspberry, etc.

O primeiro da lista é o DS1302, que já usei num projeto descrito aqui no blog.


O DS1302 (datasheet aqui) se comunica com um microcontrolador através de um protocolo de 3 fios: dado (bidirecional), clock (gerado pelo microcontrolador) e terra, às vezes chamado de "3-wire SPI".  Este segundo nome não é muito apropriado pois uma característica do SPI é ter fios separados para recepção e transmissão, comunicando simultaneamente nos dois sentidos. Em muitos casos a solução é implementar "na unha" o protocolo, controlando a direção do pino de dados e pulsando os sinais bit a bit. O pino CE indica deve ser mantido em nível alto durante a comunicação.

A figura abaixo mostra a comunicação, os bits de dados marcados em vermelho são gerados pelo RTC, os demais pelo microcontrolador.


A base de tempo para o DS1302 é um cristal de 32.768Hz (às vezes abreviado para 32KHz). Este valor é exatamente 2^15, o que permite obter um sinal preciso de 1Hz (1 ciclo por segundo) usando quinze estágios de divisão por 2. Por este motivo, este tipo de cristal é também conhecido como "cristal de relógio".

Na maioria dos casos vamos querer que a data e hora continuem sendo atualizados mesmo que o circuito não esteja alimentado. Para isto o DS1302 possui dois pinos de alimentação separados, Vcc1 e Vcc2 e aceita tensões de 2 a 5V neles. Normalmente Vcc1 é a alimentação normal e Vcc2 é uma bateria. Um recurso interessante do DS1302 é ser capaz de fazer uma carga bem lenta em baterias do tipo NiCad ou NiMH, de forma a mantê-la sempre carregada.

Uma vez que o RTC possui uma bateria, um recurso comum é ter algumas posições de Ram não volátil. O DS1302 possui 31 bytes de Ram.

Conforme indicado na figura da comunicação, as transferências são iniciadas por um byte contendo 5 bits de endereço (A0 a A4) e um bit para indicar que será acessado o relógio ou a Ram. A figura abaixo mostra o endereçamento resultante e os registradores do relógio:


Alguns pontos a destacar:
  • Os valores no relógio estão em BCD ao invés de binário. Isto é, cada dígito decimal é armazenado separado. Por exemplo, o valor decimal 12 é armazenado como 0x12 ao invés de 0x0C.
  • Quando o bit CH no registrador de segundos for 1, o contador fica parado. Na operação normal deve ser mantido em 0.
  • O bit 12/24 seleciona o formato da hora. Quando for 0 temos o formato "24 horas" onde as horas são contadas de 0 a 23. Quando for 1 temos o formato "12 horas" onde as horas são contadas de 0 a 11 e um bit indica se é antes ou depois do meio dia (AM/PM).
  • O bit WP permite proteger a Ram e precisa estar em 0 para a memória ser escrita.
  • O registrador de endereço 0x90/0x91 controla a função de carga da bateria e deve ser programado conforme as características dela (tensão e corrente de carga). Inicialmente a função de carga está desligada, para permitir o uso de bateria não recarregáveis.
  • No "burst mode" todos os registradores do relógio ou posições da memória podem ser lidos ou escritos consecutivamente. Para isto deve ser enviado primeiro o valor especial indicado na tabela acima, em seguida (mantendo o sinal CE alto) serão transmitidos os valores sequencialmente a partir do endereço zero.
Uma busca rápida no gerenciador de biblioteca da IDE do Arduino apresenta duas bibliotecas com suporte ao DS1302:


No Raspberry Pi é possível implementar a comunicação pulsando manualmente os I/Os, mas opções de RTC que usam I2C (que veremos nos próximos posts) são mais simples de usar e dão melhor resultado.

Nenhum comentário: