IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    992
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 992
    Par défaut 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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 211
    Billets dans le blog
    48
    Par défaut
    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)

    Nom : ds3231_register.PNG
Affichages : 488
Taille : 90,4 Ko

    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 éprouvé
    Inscrit en
    Juillet 2004
    Messages
    992
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 992
    Par défaut
    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
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    ce codeveut 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 éprouvé
    Inscrit en
    Juillet 2004
    Messages
    992
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 992
    Par défaut
    Un grand merci Jay M

    je comprends un "peu" mieux

    Cordialement
    pascal

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Et donc à mettre en regard des bits pertinents dans le tableau posté par @f-leb

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut 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 :

    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é :

    Salutations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Port série] Arduino et QSerialDevice
    Par krapo13 dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 15/09/2011, 09h36
  2. Xbee et arduino: pourquoi un arret ?
    Par alx4t1 dans le forum Embarqué
    Réponses: 0
    Dernier message: 05/07/2011, 11h25
  3. arduino et début en dev
    Par zerros dans le forum C
    Réponses: 1
    Dernier message: 23/02/2011, 11h32
  4. Réponses: 3
    Dernier message: 01/02/2010, 09h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo