Registri dell'RTC

 

I registri dell'RTC, come nel caso del DS3231, sono delle celle di memoria interne al chip (normalmente accessibili tramite I2C) che memorizzano:

  • Data e ora correnti

  • Configurazione di allarmi

  • Stato del dispositivo

  • Controlli per uscita SQW

  • Temperatura interna

  • Flag e stati interni

📘 Dove si trovano

Il DS3231 espone i suoi registri da indirizzo 0x00 a 0x12 (decimale: 0 a 18).
Ecco una panoramica:

🧾 Mappa dei registri del DS3231 (indirizzi in esadecimale)

 

Indirizzo Nome registro Contenuto Note
0x00 Seconds Secondi in formato BCD (0–59) R/W
0x01 Minutes Minuti in BCD (0–59) R/W
0x02 Hours Ore (in BCD, 12h o 24h) R/W
0x03 Day Giorno della settimana (1–7) R/W
0x04 Date Giorno del mese (1–31) R/W
0x05 Month/Century Mese (1–12) e bit del secolo (bit 7) R/W
0x06 Year Anno (00–99), riferito a 2000 R/W
0x07 Alarm 1 Seconds Secondi per Allarme 1 R/W
0x08 Alarm 1 Minutes Minuti per Allarme 1 R/W
0x09 Alarm 1 Hours Ore per Allarme 1 R/W
0x0A Alarm 1 Day/Date Giorno/data per Allarme 1 R/W
0x0B Alarm 2 Minutes Minuti per Allarme 2 R/W
0x0C Alarm 2 Hours Ore per Allarme 2 R/W
0x0D Alarm 2 Day/Date Giorno/data per Allarme 2 R/W
0x0E Control Controlla SQW, allarmi, interruzioni R/W
0x0F Status Flag allarmi, Oscillator Stop Flag R/W
0x10 Aging Offset Calibrazione frequenza (fine tuning) R/W
0x11 Temp MSB Temperatura interna, parte alta R
0x12 Temp LSB Temperatura, parte bassa (¼ °C) R

📌 Dettaglio registri importanti:

🕒 Registri tempo reale (0x00 – 0x06)

Contengono ora, minuti, secondi, giorno, data, mese e anno.

⚠️ In formato BCD, quindi ad esempio 0x23 = 23 decimale.


Registri allarmi (0x07 – 0x0D)

Usati per configurare Alarm 1 e Alarm 2.
Ogni campo ha anche bit di match e modalità, cioè se il confronto è per ora, minuti, data, ecc.


🎛️ Registro Control (0x0E)

Contiene le opzioni per:

  • Abilitare Alarm 1/2 (A1IE, A2IE)

  • Abilitare interrupt sull'uscita SQW

  • Disabilitare uscita onda quadra (INTCN)

  • Frequenza SQW se attivata


🪫 Registro Status (0x0F)

Importante per:

  • Sapere se è scattato un allarme (A1F, A2F)

  • Rilevare se l’oscillatore si è fermato (OSF)


🌡️ Registro temperatura (0x11 – 0x12)

Valore interno letto ogni 64 secondi:

Temp = MSB + (LSB >> 6) * 0.25
Esempio: 0x19 0x40 → 25.0°C


📤 Accesso ai registri

Per leggere o scrivere, usi il protocollo I2C, ad esempio:

 

Wire.beginTransmission(0x68); // indirizzo DS3231
Wire.write(0x00);             // registro secondi
Wire.endTransmission();
Wire.requestFrom(0x68, 1);
byte secondi = Wire.read();

 

✅ In sintesi

  • I registri del RTC contengono tutto: ora, data, allarmi, stato, controllo, temperatura.

  • Sono configurabili e leggibili da Arduino.

  • Vanno gestiti in modo preciso, specialmente quando si usano gli allarmi.

I registri dell'RTC DS3231 non sono volatili (in gran parte).

Ecco come funziona nel dettaglio:


I registri principali di tempo, data e allarme (0x00 – 0x0D)

  • NON sono volatili.

  • Vengono mantenuti grazie alla batteria tampone collegata al modulo (di solito una CR2032).

  • Se la batteria è presente e funzionante, l’orologio continua a contare anche a microcontrollore spento, e i dati rimangono intatti anche per mesi o anni.

  • Se invece la batteria è assente o scarica, alla perdita di alimentazione i valori si resettano o diventano inattendibili (possono essere zeri, numeri casuali o rimanere fermi all’ultimo stato valido).


⚠️ Registro di stato (0x0F) e registro controllo (0x0E)

  • Anche questi vengono mantenuti se la batteria è presente.

  • Ad esempio il flag OSF (Oscillator Stop Flag) si imposta quando il modulo perde alimentazione, e rimane impostato fino a che non lo azzeri tu con codice. Serve per capire se l’orologio ha "saltato un colpo".


❄️ Temperatura (0x11–0x12)

  • Viene aggiornata periodicamente (ogni ~64 secondi).

  • È volatile nel senso che è letta dal sensore interno, ma non è "memoria RAM volatile". È solo un dato aggiornato dinamicamente.


📌 In sintesi:

Registro Volatile? Richiede batteria per mantenersi? Note
Tempo/Data ❌ No ✅ Sì Si mantengono con batteria tampone
Allarmi ❌ No ✅ Sì Idem
Stato/Controllo ❌ No ✅ Sì Rimangono fino a tua azzeramento
Temperatura ➖ Dinamico ⚠️ Non memorizzato Non "volatile", ma cambia spesso

Se ti accorgi che il tuo RTC parte sempre da "zero" o da un'ora fissa quando accendi Arduino, probabilmente la batteria tampone è scollegata o scarica.

 

Meccanismo di lettura scrittura

Supponiamo di voler leggere i registri 0x0E e 0x0F del DS3231:

 

Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0x0E); // Registro di partenza
Wire.endTransmission();

Wire.requestFrom(DS3231_ADDRESS, 2); // Leggi due byte

byte reg0E = Wire.read(); // Contenuto di 0x0E
byte reg0F = Wire.read(); // Contenuto di 0x0F

 

Ora reg0E e reg0F contengono i valori dei due registri, letti in sequenza.

 

Supponiamo tu voglia scrivere i valori 0x12 e 0x34 nei registri 0x0E e 0x0F del DS3231:

Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0x0E);      // Registro di partenza
Wire.write(0x12);      // Scrive in 0x0E
Wire.write(0x34);      // Scrive in 0x0F
Wire.endTransmission();

 

Come si può notare la linea:

 

Wire.write(0x0E);

Non significa scrivere (write) ma solo: voglio leggere a partire dal registro 0x0E. Poi in lettura devo specificare il numero di byte, in scrittura no.