Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Arduino - DS3231


Sujet :

Arduino

  1. #1
    Membre régulier
    Arduino - DS3231
    Bonjour à Tous

    Je souhaite faire un projet composé de :
    - Arduino Nano
    - DS3231
    - OLED 128x64
    - 2 alarmes

    pour ce faire je me suis inspiré d'un croquis déjà existant mais ne comportant qu'une seule alarme
    sous la forme d'une sous-routine suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //Sous-routine pour obtenir l'alarme 1
    void get_alarm()
    {
      uint8_t n[4];
      uint8_t t[4];               //second,minute,hour,day
      uint8_t f[5];               // flags
      uint8_t i;
     
      Wire.beginTransmission(DS3231_I2C_ADDR); //
      Wire.write(DS3231_ALARM1_ADDR);
      Wire.endTransmission();
     
      Wire.requestFrom(DS3231_I2C_ADDR, 4);
     
      for (i = 0; i <= 3; i++) {
        n[i] = Wire.read();
    	Serial.println(n[i]);
        f[i] = (n[i] & 0x80) >> 7;
    	Serial.println(n[i]);
        t[i] = bcdtodec(n[i] & 0x7F);
    	Serial.println(n[i]);
      }
     
      f[4] = (n[3] & 0x40) >> 6;
      t[3] = bcdtodec(n[3] & 0x3F);
     
      wake_SECOND = t[0];
      Serial.println(wake_SECOND);
      wake_MINUTE = t[1];
       Serial.println(wake_MINUTE);
      wake_HOUR = t[2];
       Serial.println(wake_HOUR);
    }


    Débutant sous Arduino , je souhaiterai comprendre
    celle-ci afin de la reproduire pour la seconde alarme
    merci donc par avance si quelqu'un pouvait me commenter ces lignes


    Cordialement
    pascal

  2. #2
    Responsable Arduino et Systèmes Embarqués

    Bonsoir,

    Pour comprendre le code, il faut éplucher la doc du DS3231(chez Maxim Integrated).
    La communication est selon le protocole I2C.

    DS3231_ALARM1_ADDR est l'adresse vers le registre de l'alarme 1 (égale à 07h je devine) où tu requiers les 4 octets (07h à 0Ah)



    Par exemple avec le 1er octet à l'adresse 07h, tu retrouves les secondes (entre 0 et 59) :
    - chiffre des dizaines (BIT4 à BIT6)
    - chiffre des unités (BIT0 à BIT3)
    - la signification du BIT7 (A1M1) est décrite dans le tableau 2. Alarm Mask bits, page 12 de la datasheet (=1 si alarme toutes les 1s)

    etc.
    Le reste est manipulations binaires, et opérations de masquage.

    C'est long et fastidieux (mais formateur), mais il existe aussi des bibliothèques toutes prêtes si tu es pressé

  3. #3
    Membre régulier
    Bonsoir,

    merci pour votre réponse

    j'avais effectivement pressenti qu'il s'agissait d'une valeur appartenant au tableau que vous avez joins
    par déduction l'alarme 2 commence donc de 0Bh à 0Dh

    par contre que signifie le terme du code

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     f[i] = (n[i] & 0x80) >> 7;

    est-ce un décalage de 7 par rapport à zéro (0x80) pour les secondes de l'alarme 1 ?

    et ma deuxième question
    Quelle est la signification de ces lignes svp ?


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     f[4] = (n[3] & 0x40) >> 6;
      t[3] = bcdtodec(n[3] & 0x3F);


    Cordialement

    pascal

  4. #4
    Membre expérimenté
    ce code
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    (n[i] & 0x80) >> 7
    veut dire

    aller chercher la valeur à la position i du tableau n
    "masquer" cette valeur (faire un ET binaire avec un masque) en utilisant un masque de valeur 0x80 ==> en binaire 1000 0000 c'est à dire qu'on ne conserve que le bit de poids fort du premier octet (le 8ème bit)
    décaler le résultat de 7 bits vers la droite avec le >> 7 => ça veut dire que ce 8ème bit (bit 7 si on compte à partir de 0) se retrouve en bit de poids faible.

    donc pour faire simple, c'est une expression qui va retourner 0 ou 1 en fonction de la valeur (0 ou 1) du 8ème bit de n[i]

    pour l'autre c'est pareil mais avec un autre masque.

    la fonction bcdtodec() permettra de convertir un nombre représenté en format BCD "binary coded decimal" vers du DECimal. C'est lié au mode de représentation de l'information dans votre composant.

  5. #5
    Membre régulier
    Un grand merci Jay M

    je comprends un "peu" mieux

    Cordialement
    pascal

  6. #6
    Membre expérimenté
    Et donc à mettre en regard des bits pertinents dans le tableau posté par @f-leb

  7. #7
    Membre éclairé
    Plus
    Bonjour,

    Ce code pour récupérer la valeur du 7e bit marche bien mais nécessite deux valeurs qui dépendent du n° de bit recherché 7 et 0x80 = 2^7 :
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    (n[i] & 0x80) >> 7


    Si on doit récupérer des bits à des positions variables, on préfère en général ce code qui ne demande que la position du bit recherché :
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    (n[i] >> 7) & 1


    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

###raw>template_hook.ano_emploi###