Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main_test_RTC_DS3231.cpp
- Committer:
- bastos
- Date:
- 2022-01-14
- Revision:
- 0:45e50bcd7ce5
File content as of revision 0:45e50bcd7ce5:
/* mbed Microcontroller Library
TEST DE L'HORLOGE RTCC DS3231 :
Terminal série + mesures oscilloscope à l'aide du mini breakout RTCC DS3231
*/
#include "mbed.h"
I2C mon_i2c(I2C_SDA, I2C_SCL); // Instantiation de l'objet mon_i2c
// Déclaration des adresses I2C de la RTCC
const int ecr_DS3231 = 0xD0; // 8bit I2C adressage en écriture de la RTCC DS3231
const int lec_DS3231 = 0xD1; // 8bit I2C adressage en lecture de la RTCC DS3231
DigitalOut maled(LED1);
DigitalIn monbouton(USER_BUTTON);
char Reg_RTCC[8] = { 0x00, 0x50, 0x59, 0x23, 0x03, 0x31, 0x12, 0x20 }; // Valeurs pour exemple uniquement
/* Registres: word.addr, sec., min., heure, N_jr, date, mois, année
Remarque: le registre seconde vaut ici 0x50 (50 sec)
Le registre jour vaut 0x03 (ici 3ème jour de la semaine) etc...
LES VALEURS SONT EN HEXA. CAR LES DONNEES SONT CODEES EN BCD:
ON PEUT AINSI IDENTIFIER PLUS FACILEMENT LE CONTENU... */
void Init_RTCC(void);
void Ecrire_RTCC(void);
void Lire_RTCC(void);
void Diffuser_RTCC(void);
int main()
{
maled = 0; // Exctintion led
Init_RTCC(); // Ecriture du registre de contrôle... sortie SQW à 1Hz
Ecrire_RTCC(); // Ecriture des 7 premiers registres pour mise à l'heure et date
printf("\n\n** Test RTCC **\n\r");
while (true) {
maled = 1; // Témoin led
Lire_RTCC();
Diffuser_RTCC();
maled = 0;
//void rtos :: ThisThread :: sleep_for (100ms); // Tempo 100ms
wait_ms(100); // tempo 500ms
}
}
void Init_RTCC()
{
char data_I2C[2] = { 0x0E, 0x08 };
// 0x0E est l'adresse du registre de contrôle que l'on met à 0x08 (Sortie SQW à 1024Hz (RS2=0 RS1=1))
mon_i2c.write(ecr_DS3231, data_I2C, 2); // Génère la séquence I2C complète : Start + addr_W + 2 octets + stoP
// REMARQUE: normalement, on devrait avoir un signal 1Hz sur SQW si on écrit 0x00 (RS2=RS1=0)
// mais j'observe un basculement tous les 14 secondes?
// Par contre, si j'écris 0x18 pour avoir RS1=2 et RS1=1 je mesure bien 8192Hz comme mentionné dans la datasheet
// Idem pour RS2=0 et RS1=1 (0x08) j'obtiens bien 1024Hz
}
void Ecrire_RTCC()
{
mon_i2c.write(ecr_DS3231, Reg_RTCC, 8); // Génère la séquence I2C complète : Start + addr_W + 8 octets + stoP
}
void Lire_RTCC()
{
char reg_adress = 0; // Le registre d'adresse pointe celui des secondes
mon_i2c.write(ecr_DS3231, ®_adress, 1, true); // Génère la séquence I2C sans le stoP : Start + addr_W + 1 octet
// Le 4ème argument "true" permet de ne pas générer de stop et donc de démarrer directement
// la séquence de lecture qui suit sur un "Restart" comme voulu par l'"état de l'art" du bus I2C...
mon_i2c.read(lec_DS3231, Reg_RTCC+1, 7); // Génère la séquence I2C complète : Start + addr_R + 7 octets (NACK) + stoP
}
void Diffuser_RTCC()
{
int i;
/* // Version 1 : Affichage basique non formaté avec passage à la ligne
printf("H");
for (i = 3; i >= 1; i--) printf(":%X", Reg_RTCC[i]);
// REMARQUE: printf(":%02X", Reg_RTCC[i]); ne fonctionne pas pour imposer un format sur deux caractères hexa
// contrairement au compilateur CCS...
printf(" D");
for (i = 5; i <= 7; i++) printf(":%X", Reg_RTCC[i]);
printf(" J:%X\n", Reg_RTCC[4]);
*/
// Version 2 : Affichage formaté avec retour début de ligne sans passage à la ligne
printf("Heure>");
for (i = 3; i >= 1; i--) {
if (Reg_RTCC[i] < 0x10) putchar('0');
printf("%X", Reg_RTCC[i]);
if (i > 1) putchar(':');
}
printf(" Date>");
for (i = 5; i <= 7; i++) {
if (Reg_RTCC[i] < 0x10) putchar('0');
printf("%X", Reg_RTCC[i]);
if (i < 7) putchar(':');
}
printf(" Jour>");
printf("%X\r", Reg_RTCC[4]);
}