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@0:45e50bcd7ce5, 2022-01-14 (annotated)
- Committer:
- bastos
- Date:
- Fri Jan 14 09:40:47 2022 +0000
- Revision:
- 0:45e50bcd7ce5
fff
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| bastos | 0:45e50bcd7ce5 | 1 | /* mbed Microcontroller Library |
| bastos | 0:45e50bcd7ce5 | 2 | TEST DE L'HORLOGE RTCC DS3231 : |
| bastos | 0:45e50bcd7ce5 | 3 | Terminal série + mesures oscilloscope à l'aide du mini breakout RTCC DS3231 |
| bastos | 0:45e50bcd7ce5 | 4 | */ |
| bastos | 0:45e50bcd7ce5 | 5 | |
| bastos | 0:45e50bcd7ce5 | 6 | #include "mbed.h" |
| bastos | 0:45e50bcd7ce5 | 7 | |
| bastos | 0:45e50bcd7ce5 | 8 | I2C mon_i2c(I2C_SDA, I2C_SCL); // Instantiation de l'objet mon_i2c |
| bastos | 0:45e50bcd7ce5 | 9 | // Déclaration des adresses I2C de la RTCC |
| bastos | 0:45e50bcd7ce5 | 10 | const int ecr_DS3231 = 0xD0; // 8bit I2C adressage en écriture de la RTCC DS3231 |
| bastos | 0:45e50bcd7ce5 | 11 | const int lec_DS3231 = 0xD1; // 8bit I2C adressage en lecture de la RTCC DS3231 |
| bastos | 0:45e50bcd7ce5 | 12 | |
| bastos | 0:45e50bcd7ce5 | 13 | DigitalOut maled(LED1); |
| bastos | 0:45e50bcd7ce5 | 14 | DigitalIn monbouton(USER_BUTTON); |
| bastos | 0:45e50bcd7ce5 | 15 | |
| bastos | 0:45e50bcd7ce5 | 16 | char Reg_RTCC[8] = { 0x00, 0x50, 0x59, 0x23, 0x03, 0x31, 0x12, 0x20 }; // Valeurs pour exemple uniquement |
| bastos | 0:45e50bcd7ce5 | 17 | /* Registres: word.addr, sec., min., heure, N_jr, date, mois, année |
| bastos | 0:45e50bcd7ce5 | 18 | Remarque: le registre seconde vaut ici 0x50 (50 sec) |
| bastos | 0:45e50bcd7ce5 | 19 | Le registre jour vaut 0x03 (ici 3ème jour de la semaine) etc... |
| bastos | 0:45e50bcd7ce5 | 20 | LES VALEURS SONT EN HEXA. CAR LES DONNEES SONT CODEES EN BCD: |
| bastos | 0:45e50bcd7ce5 | 21 | ON PEUT AINSI IDENTIFIER PLUS FACILEMENT LE CONTENU... */ |
| bastos | 0:45e50bcd7ce5 | 22 | |
| bastos | 0:45e50bcd7ce5 | 23 | void Init_RTCC(void); |
| bastos | 0:45e50bcd7ce5 | 24 | void Ecrire_RTCC(void); |
| bastos | 0:45e50bcd7ce5 | 25 | void Lire_RTCC(void); |
| bastos | 0:45e50bcd7ce5 | 26 | void Diffuser_RTCC(void); |
| bastos | 0:45e50bcd7ce5 | 27 | |
| bastos | 0:45e50bcd7ce5 | 28 | int main() |
| bastos | 0:45e50bcd7ce5 | 29 | { |
| bastos | 0:45e50bcd7ce5 | 30 | maled = 0; // Exctintion led |
| bastos | 0:45e50bcd7ce5 | 31 | Init_RTCC(); // Ecriture du registre de contrôle... sortie SQW à 1Hz |
| bastos | 0:45e50bcd7ce5 | 32 | Ecrire_RTCC(); // Ecriture des 7 premiers registres pour mise à l'heure et date |
| bastos | 0:45e50bcd7ce5 | 33 | printf("\n\n** Test RTCC **\n\r"); |
| bastos | 0:45e50bcd7ce5 | 34 | while (true) { |
| bastos | 0:45e50bcd7ce5 | 35 | maled = 1; // Témoin led |
| bastos | 0:45e50bcd7ce5 | 36 | Lire_RTCC(); |
| bastos | 0:45e50bcd7ce5 | 37 | Diffuser_RTCC(); |
| bastos | 0:45e50bcd7ce5 | 38 | maled = 0; |
| bastos | 0:45e50bcd7ce5 | 39 | //void rtos :: ThisThread :: sleep_for (100ms); // Tempo 100ms |
| bastos | 0:45e50bcd7ce5 | 40 | wait_ms(100); // tempo 500ms |
| bastos | 0:45e50bcd7ce5 | 41 | } |
| bastos | 0:45e50bcd7ce5 | 42 | } |
| bastos | 0:45e50bcd7ce5 | 43 | |
| bastos | 0:45e50bcd7ce5 | 44 | void Init_RTCC() |
| bastos | 0:45e50bcd7ce5 | 45 | { |
| bastos | 0:45e50bcd7ce5 | 46 | char data_I2C[2] = { 0x0E, 0x08 }; |
| bastos | 0:45e50bcd7ce5 | 47 | // 0x0E est l'adresse du registre de contrôle que l'on met à 0x08 (Sortie SQW à 1024Hz (RS2=0 RS1=1)) |
| bastos | 0:45e50bcd7ce5 | 48 | mon_i2c.write(ecr_DS3231, data_I2C, 2); // Génère la séquence I2C complète : Start + addr_W + 2 octets + stoP |
| bastos | 0:45e50bcd7ce5 | 49 | // REMARQUE: normalement, on devrait avoir un signal 1Hz sur SQW si on écrit 0x00 (RS2=RS1=0) |
| bastos | 0:45e50bcd7ce5 | 50 | // mais j'observe un basculement tous les 14 secondes? |
| bastos | 0:45e50bcd7ce5 | 51 | // Par contre, si j'écris 0x18 pour avoir RS1=2 et RS1=1 je mesure bien 8192Hz comme mentionné dans la datasheet |
| bastos | 0:45e50bcd7ce5 | 52 | // Idem pour RS2=0 et RS1=1 (0x08) j'obtiens bien 1024Hz |
| bastos | 0:45e50bcd7ce5 | 53 | |
| bastos | 0:45e50bcd7ce5 | 54 | } |
| bastos | 0:45e50bcd7ce5 | 55 | |
| bastos | 0:45e50bcd7ce5 | 56 | void Ecrire_RTCC() |
| bastos | 0:45e50bcd7ce5 | 57 | { |
| bastos | 0:45e50bcd7ce5 | 58 | mon_i2c.write(ecr_DS3231, Reg_RTCC, 8); // Génère la séquence I2C complète : Start + addr_W + 8 octets + stoP |
| bastos | 0:45e50bcd7ce5 | 59 | } |
| bastos | 0:45e50bcd7ce5 | 60 | |
| bastos | 0:45e50bcd7ce5 | 61 | void Lire_RTCC() |
| bastos | 0:45e50bcd7ce5 | 62 | { |
| bastos | 0:45e50bcd7ce5 | 63 | char reg_adress = 0; // Le registre d'adresse pointe celui des secondes |
| bastos | 0:45e50bcd7ce5 | 64 | mon_i2c.write(ecr_DS3231, ®_adress, 1, true); // Génère la séquence I2C sans le stoP : Start + addr_W + 1 octet |
| bastos | 0:45e50bcd7ce5 | 65 | // Le 4ème argument "true" permet de ne pas générer de stop et donc de démarrer directement |
| bastos | 0:45e50bcd7ce5 | 66 | // la séquence de lecture qui suit sur un "Restart" comme voulu par l'"état de l'art" du bus I2C... |
| bastos | 0:45e50bcd7ce5 | 67 | 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 |
| bastos | 0:45e50bcd7ce5 | 68 | } |
| bastos | 0:45e50bcd7ce5 | 69 | |
| bastos | 0:45e50bcd7ce5 | 70 | void Diffuser_RTCC() |
| bastos | 0:45e50bcd7ce5 | 71 | { |
| bastos | 0:45e50bcd7ce5 | 72 | int i; |
| bastos | 0:45e50bcd7ce5 | 73 | /* // Version 1 : Affichage basique non formaté avec passage à la ligne |
| bastos | 0:45e50bcd7ce5 | 74 | printf("H"); |
| bastos | 0:45e50bcd7ce5 | 75 | for (i = 3; i >= 1; i--) printf(":%X", Reg_RTCC[i]); |
| bastos | 0:45e50bcd7ce5 | 76 | // REMARQUE: printf(":%02X", Reg_RTCC[i]); ne fonctionne pas pour imposer un format sur deux caractères hexa |
| bastos | 0:45e50bcd7ce5 | 77 | // contrairement au compilateur CCS... |
| bastos | 0:45e50bcd7ce5 | 78 | printf(" D"); |
| bastos | 0:45e50bcd7ce5 | 79 | for (i = 5; i <= 7; i++) printf(":%X", Reg_RTCC[i]); |
| bastos | 0:45e50bcd7ce5 | 80 | printf(" J:%X\n", Reg_RTCC[4]); |
| bastos | 0:45e50bcd7ce5 | 81 | */ |
| bastos | 0:45e50bcd7ce5 | 82 | // Version 2 : Affichage formaté avec retour début de ligne sans passage à la ligne |
| bastos | 0:45e50bcd7ce5 | 83 | printf("Heure>"); |
| bastos | 0:45e50bcd7ce5 | 84 | for (i = 3; i >= 1; i--) { |
| bastos | 0:45e50bcd7ce5 | 85 | if (Reg_RTCC[i] < 0x10) putchar('0'); |
| bastos | 0:45e50bcd7ce5 | 86 | printf("%X", Reg_RTCC[i]); |
| bastos | 0:45e50bcd7ce5 | 87 | if (i > 1) putchar(':'); |
| bastos | 0:45e50bcd7ce5 | 88 | } |
| bastos | 0:45e50bcd7ce5 | 89 | printf(" Date>"); |
| bastos | 0:45e50bcd7ce5 | 90 | for (i = 5; i <= 7; i++) { |
| bastos | 0:45e50bcd7ce5 | 91 | if (Reg_RTCC[i] < 0x10) putchar('0'); |
| bastos | 0:45e50bcd7ce5 | 92 | printf("%X", Reg_RTCC[i]); |
| bastos | 0:45e50bcd7ce5 | 93 | if (i < 7) putchar(':'); |
| bastos | 0:45e50bcd7ce5 | 94 | } |
| bastos | 0:45e50bcd7ce5 | 95 | printf(" Jour>"); |
| bastos | 0:45e50bcd7ce5 | 96 | printf("%X\r", Reg_RTCC[4]); |
| bastos | 0:45e50bcd7ce5 | 97 | } |
| bastos | 0:45e50bcd7ce5 | 98 |