alan bastien / Mbed 2 deprecated testbatt

Dependencies:   mbed

Committer:
bastos
Date:
Fri Jan 14 09:40:47 2022 +0000
Revision:
0:45e50bcd7ce5
fff

Who changed what in which revision?

UserRevisionLine numberNew 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, &reg_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