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 :

RTC DS3132 et interruption


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Par défaut RTC DS3132 et interruption
    bonjour,je souhaite que la RTC declenche une interruption sur le pin 2 de l'arduino UNO.
    J'ai d'abord essayé par scrutation,ça fonctionne:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    const uint8_t alarmInput(2);
     
    void setup()
    {
        Serial.begin(9600);
        pinMode(2, INPUT_PULLUP);
     
        // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
        RTC.setAlarm(ALM1_MATCH_DATE, 0, 0, 0, 1);
        RTC.setAlarm(ALM2_MATCH_DATE, 0, 0, 0, 1);
        RTC.alarm(ALARM_1);
        RTC.alarm(ALARM_2);
        RTC.alarmInterrupt(ALARM_1, false);
        RTC.alarmInterrupt(ALARM_2, false);
        RTC.squareWave(SQWAVE_NONE);
        // set Alarm 1 to occur at 5 seconds after every minute
        RTC.setAlarm(ALM1_MATCH_SECONDS, 5, 0, 0, 0);
        // clear the alarm flag
        RTC.alarm(ALARM_1);
        // configure the INT/SQW pin for "interrupt" operation (disable square wave output)
        RTC.squareWave(SQWAVE_NONE);
        // enable interrupt output for Alarm 1
        RTC.alarmInterrupt(ALARM_1, true);
        Serial.println(" Start ");
        //attachInterrupt(digitalPinToInterrupt(2),printTime,LOW);
    }
     
    void loop()
    {
        // check to see if the INT/SQW pin is low, i.e. an alarm has occurred
      if ( !digitalRead(alarmInput) )
        {
            printTime();
     
        }
     
    }
     
    void printTime()
    {
           RTC.alarm(ALARM_1);
           Serial.println("ça marche");
     
    }
    Par contre lorsque je fonctionne par interruption:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    #include <DS3232RTC.h>        // https://github.com/JChristensen/DS3232RTC
     
    // pin definitions
    const uint8_t alarmInput(2);
     
    void setup()
    {
        Serial.begin(9600);
        pinMode(2, INPUT_PULLUP);
     
        // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
        RTC.setAlarm(ALM1_MATCH_DATE, 0, 0, 0, 1);
        RTC.setAlarm(ALM2_MATCH_DATE, 0, 0, 0, 1);
        RTC.alarm(ALARM_1);
        RTC.alarm(ALARM_2);
        RTC.alarmInterrupt(ALARM_1, false);
        RTC.alarmInterrupt(ALARM_2, false);
        RTC.squareWave(SQWAVE_NONE);
     
         // set Alarm 1 to occur at 5 seconds after every minute
        RTC.setAlarm(ALM1_MATCH_SECONDS, 5, 0, 0, 0);
        // clear the alarm flag
        RTC.alarm(ALARM_1);
        // configure the INT/SQW pin for "interrupt" operation (disable square wave output)
        RTC.squareWave(SQWAVE_NONE);
        // enable interrupt output for Alarm 1
        RTC.alarmInterrupt(ALARM_1, true);
        Serial.println(" Start ");
        attachInterrupt(digitalPinToInterrupt(2),printTime,LOW);
    }
     
    void loop()
    {
     
    }
    // procedure interruption
    void printTime()
    {
           RTC.alarm(ALARM_1);
           Serial.println("ça marche");
     }
    l'appel à l'ISR ne se fait pas,le pin 2 passe bien à 0,mais sans resultat.Quelqu'un a t'il une idée ??

  2. #2
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour badei

    Je n'ai pas de DS3232 mais un DS3231 et ai fait l'exercice.
    Pour ce qui est des routines d'interruptions (ISR), elle doivent être les plus courtes possibles, si possible, seulement un changement de variable (globales et volatile), pas de Print par exemple.
    Il est meilleur, dans ton cas, d'utiliser l'argument FALLING au lieu de LOW pour déclencher l'interruption. Avec LOW l'interruption risque de se faire plusieurs fois, tant que le signal est bas.
    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
    #include <DS3231.h>
    DS3231 RTC;
    // pin definitions
    const uint8_t alarmInput;
    volatile boolean alarmNew = false;
    int alarmCounter = 0;
     
    void setup()
    {
    	Serial.begin(9600);
    	pinMode(2, INPUT_PULLUP);
     
     
    	attachInterrupt(digitalPinToInterrupt(2),printTime, FALLING);
    }
     
    void loop()
    {	
    	if (alarmNew)
    	{
    		Serial.println("Nouvelle alarme No.: " + String(alarmCounter));
    		alarmCounter ++;
    		alarmNew = false;
    	}
    }
    // procedure interruption
    void printTime()
    {
    	alarmNew = true;
    }
    Cordialement
    jpbbricole

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Par défaut
    merci pour votre réponse.J'ai essayé l'attribut FALLING,sans succès.En fait l'appel à l'ISR se fait bien,mais c'est l'appel à la fonction RTC qui plante,elle fait appel à l'I2C.Après recherche,il semble qu'il y ait incompatibilité.Je vais donc plutot comme vous me l'avez conseillé de juste mettre un flag dans l'ISR.

  4. #4
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par badei Voir le message
    Par contre lorsque je fonctionne par interruption:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...// procedure interruption
    void printTime()
    {
           RTC.alarm(ALARM_1);
           Serial.println("ça marche");
     }
    l'appel à l'ISR ne se fait pas,le pin 2 passe bien à 0,mais sans resultat.Quelqu'un a t'il une idée ??
    JPBricole a raison, vous ne devez pas utiliser Serial (et println) dans votre ISR. Lorsqu'une routine d'interruption est active, les autres interruptions sont par défaut bloquées et comme Serial fonctionne par interruption, rien ne s'imprimera. Ce sera mis en attente de sortie de l'ISR et à ce moment le print va passer.

    Le souci que vous pouvez avoir c'est que le buffer de Serial est limité à 64 octets et si vous essayez d'imprimer plus de 64 octets, alors la fonction print devient bloquante en attendant que le buffer série ait de la place. Comme vous êtes dans une interruption et donc que le buffer ne va pas se vider, le print reste bloquant et vous vous retrouvez coincé dans l'ISR...

    ==> bref, pas de print dans les ISR, les conserver les plus rapide possible pour ne pas gêner le reste du fonctionnement (millis() par exemple est bloqué dans l'ISR et ne va pas s'incrémenter) et effectivement si vous partagez des variables entre l'ISR et le code principal bien penser à rajouter le mot clé volatile lors de la déclaration de ces variables. ça dit au compilateur que les valeurs peuvent changer et donc ne pas faire d'optimisation qui consisterait à conserver la valeur dans un registre du micro-processeur.

Discussions similaires

  1. communication des données via modem+rtc en VB6
    Par kadirov dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/07/2006, 11h56
  2. Connexion à distance / RTC
    Par mixi dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 06/04/2006, 19h53
  3. FTP sans internet par modem et RTC
    Par stkam dans le forum Développement
    Réponses: 5
    Dernier message: 03/11/2004, 09h56
  4. Réponses: 3
    Dernier message: 18/02/2004, 17h53
  5. Connecter un serveur avec ADSL et RTC
    Par Sunny dans le forum Développement
    Réponses: 7
    Dernier message: 09/09/2002, 11h15

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