Arduino come utilizzare l’RTCC MCP7940N

Accedere ai registri dell’MCP7940N usando Arduino

Molti tutorial sull’utilizzo di un RTCC (Real Time Clock and Calendar) con Arduino riguardano l’integrato DS1307 in quanto la sua diffusione è data dalla disponibilità di diverse librerie, dal costo contenuto e dalla sua integrazione in numerose shield. Nonostante ciò sul mercato esistono molti altri dispositivi interessanti che svolgono funzioni aggiuntive e hanno precisioni molto più elevate riguardo al conteggio del tempo.

Mi sono trovato a realizzare dei progetti che come specifica richiedevano una alimentazione di 3,3V, dato che il DS1307 lavora tra i 4,5V e i 5,5V ho dovuto ripiegare su un altro rtcc. Quello che ho scelto è l’MCP7940N prodotto da Microchip. Nonostante non sia disponibile la versione PDIP ho scelto questo integrato perché oltre a lavorare con tensione di alimentazione di 3,3V ha alcune altre funzioni interessanti come la possibilità di impostare due allarmi e la possibilità di calibrare l’orologio per poter aumentare la sua precisione nel conteggio del tempo.

Nella tabella seguente ho messo in comparazione le funzioni del DS1307 col MCP7940N

La gestione dei registri di questo integrato è molto semplice; è molto simile a quella del DS1307 e possiamo usare gran parte del codice usato in questo precedente articolo.

DS1307MCP7940N
Tensione di alimentazioneda 4.5V a 5.5Vda 1.8V a 5.5V
Consumo (Alimentazione a batteria)<500nA<700nA
Calibrazione RTCNOSI(digitale)
SRAM56Bytes64Bytes
Allarme programmabileNOSI (2)
UscitaOnda quadra
programmabile
Onda quadra programmabile.
Uscita allarme

Passiamo alla pratica realizzando il seguente circuito elettrico. Lo schema è identico a quello utilizzato per il DS13017.

Arduino MCP7940N

 

Il circuito utilizza il bus I2C per comunicare con l’integrato MCP7940N.

Andiamo a controllare il datasheet dell’ MCP7940N per vedere quali sono i registri che permettono il settaggio della data e dell’orario:

Registri MCP7940N

i registri che vanno dall’indirizzo 00h all’indirizzo 06h sono quelli che utilizzeremmo per impostare l’ora e la data. La modalità di scrittura di questi registri deve avvenire utilizzando la codifica BCD. Da notare che oltre al dato di tempo e di tata, ci sono alcuni bit che permettono di attivare alcune funzioni, ad esempio il registro 00h setta i secondi (dal bit0 al bit6) ma permette anche di avviare l’oscillatore (bit7 ST).
E’ possibile settare il bit7 manualmente, con la funzione bitSet(), oppure direttamente quando impostiamo il valore dei secondi servendoci di una maschera di bit. Vediamo subito con un esempio cosa dobbiamo fare.

Supponiamo di impostare il registro a 38 secondi. La prima cosa da fare è convertire il numero 38 in codice BCD utilizzando questa funzione:

il valore decimale 38 equivale al valore BCD 0b00111000.

Il valore decimale 38 viene convertito in valore BCD semplicemente convertendo le unità in codice binario e le decine in codice binario, infatti l’unità 8 equivale al valore binario 0b1000 mentre la decina 3 equivale al valore binario 0b0011. I due valori binari vengono concatenati per ottenere il valore BCD infatti 0b0011 concatenato con 0b1000 forma il valore BCD 0b00111000 (38 decimale)

Come possiamo osservare il bit7 del valore BCD è a valore logico basso. Per far partire l’oscillatore dovremmo impostare questo bit a valore logico alto. Questo può essere fatto utilizzando la funzione bitSet() o più semplicemente mascherando il valore BCD dei secondi con un valore binario che imposti il bit7 a livello alto, lasciando inalterato il valore BCD dei secondi.
Quest’ultima soluzione viene eseguita usando l’operatore | (bitwise or). Il valore della maschera deve tenere il bit7 a livello logico alto e lasciare invariato il valore dei secondi. Il valore della maschera da utilizzare sarà quindi 0b10000000 (0x80). In questo modo mettendo il valore 0b10000000 in or col valore BCD dei secondi 0b00111000 otterremmo il valore 0b10111000:

Ora sappiamo come generare i dati in valore BCD e come mascherarli per attivare le funzioni aggiuntive dei registri quindi di seguito il codice che permette di impostare i registri dall’indirizzo 00h all’indirizzo 06h, con l’ora e la data:

Leggere orario e data dall’MCP7940N

Dopo aver impostato data e ora e settato alcuni parametri (ST e VBATEN) il circuito RTCC MCP7940N autonomamente gestirà orario e data senza l’ausilio di istruzioni aggiuntive. A questo punto sarà sufficiente eseguire la lettura dei sette registri, da 00h a 06h, per ottenere le informazioni relative a data e ora correnti.

Il codice seguente mostra come eseguire la lettura dei registri e come elaborare i dati, in quanto i registri restituiscono i valori in formato BCD comprensivi dei bit di settagio (ST e VBATEN):

Nel codice possiamo osservare come vengono mascherati i dati letti tramite un l’operatore & (bitwise and). Sapendo che i registri contengono bit che permettono di settare o resettare delle funzioni aggiuntive dell’MCP7940N, dobbiamo necessariamente escluderli dalla lettura per ottenere solamente il dato relativo al tempo.

Nel caso del registro 00h abbiamo che, oltre al dato dei secondi, è presente anche il bit7 (ST) che deve essere escluso quando convertiamo il valore BCD in decimale. Tramite l’operatore & e la maschera 0x7f (0b01111111) otteniamo un comportamento di questo tipo; supponiamo che il dato letto dal registro sia 0b10111000, mascherando questo dato con il valore 0b01111111 otteniamo 0b00111000.

In conclusione, risulta molto semplice scrivere e leggere dai registri dell’MCP7940N, dobbiamo solo stare attenti nell’utilizzo delle maschere di bit che ci permettano, in fase di scrittura, di inserire i dati di data e tempo insieme ai settaggi che abilitano alcune funzionalità, mentre, in fase di lettura, di ottenere i dati di tempo filtrando i settaggi delle funzionalità.

Offerte del giorno Amazon
Preferiti
Rimani aggiornato

Sondaggi
Sorry, there are no polls available at the moment.
Seguimi su Twitter