8 Comentários

Módulo Tiny RTC I2C – Parte 2

i2c
Este post faz parte da série Módulo Tiny RTC I2C. Leia também os outros posts da série:

Dando continuidade ao nosso estudo do Módulo Tiny RTC I2C que começamos na nossa "Parte 1", vamos analisar a memória EEPROM AT24C32. Também vamos entender como funciona a bateria do RTC e faremos nosso primeiro teste de comunicação com esse dispositivo, através de um Arduino Uno.

Esta série foi desenvolvida com o hardware oferecido pelo loja FILIPEFLOP, a qual foi fundamental para o desenvolvimento deste projeto, pois sem o auxílio do hardware, o projeto se tornaria inviável.

logoFF

Memória EEPROM AT24C32

No artigo anterior vimos que é possível utilizar parte da memória RAM do RTC DS1307 para armazenar dados. No entanto, trata-se de uma memória volátil. Uma vez que a bateria (VBat) e a alimentação (VCC) não estejam presentes, os dados são perdidos.

Para armazenar informações de maneira indefinida, é necessário o uso de uma memória não volátil, uma EEPROM. Como nosso sistema utiliza um barramento de comunicação I2C, foi adotado o uso de uma memória AT24C32. Essa memória possui uma série de características vantajosas para nosso sistema, entre elas:

  • 4.096 Bytes ( 32KBits) de dados;
  • Alto número de cíclos de gravação, até 1.000.000;
  • Alimentação de 2,7V até 5,5V (para AT24C32N-SU27).

Como vimos na comunicação I2C, cada dispositivo possui um endereço específico. Dessa forma, compartilhando o barramento de comunicação sem causar colisão na troca de dados. Vimos também que o endereço base para o RTC DS1307 é 68h (110.1000b).

Tiny RTC: Esquema do AT24C32.
Figura 1: Esquema do AT24C32.

Para a memória AT24C32, o endereço base da comunicação é 50h (101.0000b). No entanto, os 3 bits menos significativos são separados para o endereço de mais de uma memória desse tipo no mesmo barramento(101.0[A2][A1][A0]). Dessa forma, os 7 bits de endereços são separados da seguinte forma: 

Endereço A[2:0C]Endereço I2C
00050h
00151h
01052h
01153h
10054h
10155h
11056h
11157h

Para o nosso caso, a memória já possui os endereços A[2:0] ligados ao GND, mantendo o valor 000b. Dessa forma, o endereço de acesso a esse dispositivo será sempre 50h. Imaginando que exista a necessidade do uso de mais de uma memória de mesmo tipo, é possível fazer a ligação de mais dispositivos nesse barramento, uma vez que o endereço seja alterado para outro valor, conforme indicamos acima.

Esse dispositivo também possui um pino para proteção contra gravação, trata-se do Write Protect (WP). Seu funcionamento é bastante simples, uma vez esse pino ligado em 1 (VCC) todo o processo de gravação é desabilitado. No entanto, a leitura funciona normalmente. Para que sejam aceitos comandos de gravação, este pino precisa estar e 0 (GND).

Internamente, ele possui um resistor de pull-down ligando o WP em 0. No entanto, no nosso módulo ele está ligado diretamente na linha de GND, garantindo que a memória sempre esteja permitindo a escrita de dados.

Bateria

Como dissemos no artigo anterior, esse módulo já possui uma bateria integrada. Trata-se da bateria LIR2032, uma bateria de recarregável de Lítio Ion com capacidade típica de 35mAh.

É importante perceber que há diferenças de alimentação entre o RTC DS1307 e a bateria LIR2032, e o circuito ganhou uma complexidade interessante para analisarmos. Primeiramente, nosso RTC está preparado para receber no pino VBat uma tensão de bateria entre 2,0V e 3,5V, conforme seu datasheet.

Essa bateria pode ter uma faixa mais extensa de tensão, podendo variar entre 3,0V (completamente descarregada) e 4,2V (completamente carregada). A diferença é grande e a adaptação é necessária. Para tanto, o seguinte circuito foi adotado.

Circuito de carga e descarga da bateria LIR2032.
Figura 2: Circuito de carga e descarga da bateria LIR2032.
  • Analisando o processo de descarga:

 

Durante o processo de descarga,  divisor de tensão manterá a tesão VBat dentro dos limites esperados pelo RTC e que não haverá fuga de corrente para VCC, impedido por D1. Apesar dessa afirmação, vamos comprovar esse funcionamento através de um pouco de matemática. Vamos adotar o pior caso para o sistema, com a corrente exigida pelo DS1307 como a máxima indicada em seu datasheet, IBat=800nA. Do outro lado, o pior caso para essa corrente seria um consumo 0A.

Sabemos também que a tensão da bateria pode variar entre 4,2V (bateria carregada) e 3,0V (bateria descarregada). Os piores casos são dados pela tesão mínima e máxima. A tensão mínima é dada quando a bateria está completamente descarregada e o RTC está consumindo a máxima corrente de VBat. Já a tensão máxima é dada na situação oposta, quando a bateria está completamente carregada e o RTC está consumindo a menor quantidade de corrente possível em VBat. Nessas condições temos que: 

Para VBT1=3,0V e IBAT=800nA, e sabendo que:
[math]I_{R6}=I_{R4}+I_{BAT}[/math](Eq.1)
[math]V_{BT1}=V_{R6}+V_{R4}[/math](Eq.2)
  
Temos que:
[math]I_{R6}=I_{R4}+800nA[/math](Eq.3)
[math]V_{BT1}=V_{R6}+V_{R4}[/math](Eq.4)
  
Logo:
[math]3,0=510*10^3*I_{R6}+1,5*10^6*I_{R4}[/math](Eq.5)
  
Substituindo Eq.3 em Eq.5:
[math]3,0=510*10^3*(I_{R4}+800*10^{-9})+1,5*10^6*I_{R4}[/math](Eq.6)
[math]3,0=510*10^3*I_{R4}+510*10^3*8*10^{-7}+1,5*10^6*I_{R4}[/math](Eq.7)
[math]2.010*10^3*I_{R4}=3,0-0,408[/math](Eq.8)
[math]I_{R4}=1,28955{\mu}A[/math](Eq.9)
  
Sabendo que VR4=VBAT, temos:
[math]V_{R4}=R4*I_{R4}[/math](Eq.10)
[math]V_{R4}=V_{BAT}=1,5*10^6*1,28955*10^{-6}[/math](Eq.11)
  
[math]V_{BAT}=1,93433V[/math](Eq.12)

Logo, quando a bateria estiver completamente descarregada e caso o RTC esteja consumindo a máxima corrente, a tensão da bateria será de 1,93V.

Do outro lado, temos VBT1=4,2V e IBat=0A.
Não havendo corrente em [math]I_{BAT}[/math], [math]R_{4}[/math] e [math]R_{6}[/math] passam a trabalhar apenas como divisores resistivos. Nessas condições, temos que:
[math]V_{BAT}=\frac{(V_{BT1}*R_{4})}{(R_{4}+R_{6})}[/math](Eq.13)
 [math]V_{BAT}=\frac{(4,2*1,5*10^6)}{(1,5*10^6+510*10^3)}[/math](Eq.14) 
[math]V_{BAT}=\frac{6,3*10^6}{2.010*10^3}[/math](Eq.15)
  
[math]V_{BAT}=3,13433V[/math]  (Eq.16)

Dessa forma, sabemos que a tesão sobre o pino VBAT ficará entre 1,93V e 3,13V, garantindo que a tensão nunca supere os 3,5V limites para este pino do DS1307.

  • Carregador de Bateria LIR2032

O processo de carga dessa bateria é dada através de R5 e D1, e temos que a corrente máxima de carga é de 35mA. Dessa forma, mesmo que a bateria esteja completamente descarregada, ou mesmo tenha entrado em curto-circuito, a corrente máxima sobre esse componente será de:

[math]I_{CARGA}=\frac{V_{CC}-V{D1}}{R_{5}}[/math](Eq.17)
[math]I_{CARGA}=\frac{5,0-0,7}{200}=\frac{4,3}{200}[/math] (Eq.18) 
  
[math]I_{CARGA}=21,5mA[/math](Eq.19) 

No entanto, para o processo de carga, realizamos um teste prático. Fizemos uma série de medidas sobre a bateria e os componentes de sua periferia. Durante o processo de carga, a tensão sobre D1=0,646V. Os valores dos resistores eram de:

R5=199,8Ohms

VCC=5,21V

Observamos os seguintes dados:

Tempo (min)VBat (V)IBat (mA)
02,6834,050
602,8003,250
1202,8383,000
1802,8712,800
2402,8772,750
3002,9172,500
3602,9522,300

À partir dessas informação, traçamos dois gráficos. O primeiro apresenta a tensão sobre a bateria no decorrer do tempo. Percebemos que a bateria estava bastante descarregada no início do processo.

Tiny RTC: Gráfico da tensão da bateria durante a carga.
Figura 3: Gráfico da tensão da bateria durante o processo de carga.

Para este segundo gráfico, traçamos a corrente demandada pela bateria durante o processo de carga. É possível perceber que mesmo com a bateria bastante descarregada a corrente ficou longe do limite máximo de 21.5mA.

Gráfico da corrente de carga.
Figura 4: Gráfico da corrente de carga.

É possível verificar a tensão da bateria através do sinal BAT, que está presente no P1.1 do barramento externo. É conveniente colocar um buffer para minimizar fugas de correntes da bateria. Para maiores detalhes desse circuito, dêem uma olhada no artigo Buffers e Seguidores de Tensão.

Tiny RTC: Acesso à tensão da bateria através do sinal BAT
Figura 5: Acesso à tensão da bateria através do sinal BAT.

Exemplo de Acesso ao RTC 

Nesse teste vamos fazer a montagem necessária para a comunicação com o RTC. Neste momento não vamos acessar nenhuma outra característica do dispositivo. O objetivo disso é simplificar a comunicação para ficar claro o processo de comunicação.

  • Esquema de Ligação

Para realizar um teste inicial com o módulo RTC, precisamos apenas da alimentação e da comunicação I2C. Esses sinais bastarão para esse exemplo. Lembre-se que o módulo já contém os resistores de pull-up necessários. Assim, nenhum outro componente externo é necessário.

Esquema de ligação entre o Módulo Tiny RTC I2C e o Arduino UNO.
Figura 6: Esquema de ligação entre o Módulo Tiny RTC I2C e o Arduino UNO.

Para essa ligação, foi utilizado o "Kit Jumper Macho-Macho". As cores utilizadas foram exatamente as mesmas apresentadas no esquema. Dessa forma, a montagem foi idêntica ao apresentado.

Figura X:
Figura 7: Montagem para a realização dos testes.
  • Software para Comunicação

O software foi separado em duas partes. Na primeira inicializamos o RTC com a data 15/07/15 e com a hora 14:30:00. Como dito no primeiro artigo, o RTC DS1307 trabalha no formato BCD, o que significa que o dia 15 é dado pelo valor 15h (0001.0101b). O código é dado da seguinte forma:

É interessante reparar que o endereço passado é o 68h, conforme dito no artigo anterior. O primeiro byte enviado em seguida é o 00h. Trata-se do primeiro endereço de escrita, neste caso o registrador de segundos. O segundo byte é o valor a ser escrito nele. Como queremos que a contagem de segundos comece em 00, escrevemos o valor 00h.

O RTC é inteligente para incrementar o endereço do registrador automaticamente. Logo, o terceiro byte é o dado que desejamos escrever no endereço 01h, que foi incrementado automaticamente. Isso acontece até o byte de ano com o valor 15h, que desejamos escrever no endereço 06h.

Para a execução principal do sistema, dada em loop(), fazemos a leitura da data e hora e apresentamos no terminal serial. O código é dado por:

O ponto principal da comunicação se dá entre as linhas 14 e 23. Perceba que a comunicação endereça o dispositivo (68h) e escreve o valor 00h. Esse primeiro byte é o endereço do registrador interno de segundos.

Se continuássemos a escrever faríamos como no setup() que configuramos o dispositivo. No entanto, queremos ler. Logo, com o registrador interno escrito, terminamos a comunicação e começamos o processo de leitura. Isso acontece na linha 18 com Wire.requestFrom( 0x68 , 7 ). Nessa instrução estamos dizendo que desejamos ler 7 bytes do dispositivo 68h.

  • Resultado

Podemos observar essa comunicação na imagem abaixo:

Sinais de comunicação I2C com o RTC DS1307.
Figura 8: Sinais de comunicação I2C com o RTC DS1307.

Observe que a primeira linha é a comunicação SDA, e a segunda linha é o clock SCL. A indicação de StartBit é dada pelo círculo verde, enquanto o StopBit é dado pelo círculo vermelho. Na legenda em azul temos os dados da comunicação, onde é possível ver:

Write [0xD0]+ACK
0x00+ACK 

Isso indica que foi iniciado uma comunicação de escrita para o endereço D0h. Se você estiver realmente acompanhando este artigo, vai perceber que o endereço não condiz com o 68h que falamos até agora. Na verdade o sistema está apresentado os 8 bits trocados, enquanto sempre falamos do endereço como sendo 7 bits. Dessa forma o valor D0h (1101.0000b) trata-se do endereço 68h mais a indicação de escrita 0 (110.1000+0b).

Logo depois vemos que a comunicação é terminada com um StopBit e recomeçada. No entanto, à partir de agora, trata-se de uma leitura. A legenda da imagem indica os valores trocados com:

Read [0xD1]+ACK
0x30+ACK
0x21+ACK
0x15+ACK
0x04+ACK
0x15+ACK
0x07+ACK
0x15+NAK

Exatamente da mesma forma, o endereço dado D1h é a composição do 68h com o bit de leitura 1. Assim, 1101.0001b é dado por 110.1000+1b.

Também sabemos que o endereço é incrementado automaticamente e começamos com o valor 00h. Dessa forma podemos dizer que os valores são:

RegistradorFunçãoValor
00hSegundos30h
01hMinutos21h
02hHoras15h
03hDia da Semana04h
04hDia do Mês15h
05hMês07h
06hAno15h

Dessa forma fica simples entender o significado dos valores. O ano possui apenas 2 dígitos, logo 15h significa 2015. O dia da semana começa com 1, que seria domingo, então 04h significa "quarta-feira". Para a hora, minuto e segundo, os valores 15h, 21h e 30h representam 15:21:30. O resultado disso podemos ver abaixo:

Tela de comunicação com os dados lidos do RTC DS1307.
Figura 9: Tela de comunicação com os dados lidos do RTC DS1307.

Referências

[1] - Fonte: http://www.filipeflop.com/pd-6b854-real-time-clock-rtc-ds1307.html?ct=&p=1&s=1
[2] - Fonte: http://www.atmel.com/images/doc0336.pdf
Figura 6 - Fonte: https://www.arduino.cc/en/uploads/Main/ArduinoUnoSmd450px.jpg
Crédito da Imagem Destacada: Módulo RTC Tiny I2C - FILIPEFLOP

Outros artigos da série

<< Módulo Tiny RTC I2C - Parte 1Módulo Tiny RTC 1-Wire - Parte 3 >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Módulo Tiny RTC I2C - Parte 2
Comentários:
Notificações
Notificar
guest
8 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Luis Paulo
Luis Paulo
28/01/2019 21:10

Olá Muito bom o seu post. Apenas que ele conta os segundos somente de 00 a 09, não incrementando além, ou seja, não vai para 10,11,etc. Isto pode ser visto na captura de tela acima (figura 9), onde a captura de tela inicia com 15:50:05 (05 segundos) e 5 linhas abaixo, na passagem da quinta para a sexta linha, ela passa de 09 segundos de volta ao 00 segundo. Porém, a contagem dos minutos continha sendo feita corretamente. Acredito que seja somente um problema na amostragem dos segundos, pois na contagem interna eles estão incrementando, visto que os minutos incrementam.… Leia mais »

Danilo Ramos domingues
Danilo Ramos domingues
Reply to  Luis Paulo
25/06/2019 16:44

troque a linha "Serial.print( ( buf[ 0 ] & 0x07 ) >> 4 , HEX ) ; "por "Serial.print( ( buf[ 0 ] ) >> 4 , HEX ) ;"

Alexandre
Alexandre
16/02/2018 10:41

Francesco, bom dia! Vc sabe onde posso encontrar um exemplo da utilização (com a programação Arduino) do sensor de temperatura DS18b20 conectado no RTC 1307 ?

Daniel Mendes
Daniel Mendes
06/02/2016 12:44

só consigo fazer funcionar sem a bateria (somente no vcc do arduino) quando coloco a bateria ele para de funcionar, sabe o q pode ser?

Francesco Sacco
Reply to  Daniel Mendes
17/02/2016 16:42

Meu amigo, ainda está com o problema?
Caso positivo, valeria verificar a tensão no pino BAT quando a bateria estivesse conectada. Isso é parecido com problemas de baterias em curto.

Daniel Mendes
Daniel Mendes
Reply to  Francesco Sacco
18/02/2016 16:40

a mesma bateria funciona em outros aparelhos, este teste ainda seria válido neste caso?

Iohana Torres
Iohana Torres
23/10/2015 15:44

Francesco, sabe de algum outro módulo de data/hora que pode ser usado no arduíno? O RTC DS1307, reinicia toda vez que ligo ele a uma bateria externa.

Francesco Sacco
Reply to  Iohana Torres
27/10/2015 14:38

Olá Iohana,

Sobre outro módulo, sim, há muitos.
No site do FilipeFlop você encontra o DS3231, por exemplo.
http://www.filipeflop.com/pd-1c7dbf-real-time-clock-rtc-ds3231.html?ct=&p=1&s=1

Mas se quiser insistir em um módulo DS1307, pode tentar este módulo.
http://www.labdegaragem.org/loja/relogio-de-tempo-real-grove.html

No entanto, eu gostaria de saber por quê está com problemas com esse RTC. Qual módulo você está usando? Qual o problema que está encontrando?

Um abraço.

Francesco

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 

Soluções inteligentes para acionamento de MOSFETs/IGBTs com família STDRIVE

Data: 08/10 às 15:00h - Apoio: STMicroelectronics
 
INSCREVA-SE AGORA »



 
close-link