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:
📘 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:
🌡️ 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.
|