Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino: les interruptions

    16 mars 2014 à 21:16:04

    Salut,

    je suis sur un arduino pro et je veux introduire les interruptions. La première serait par exemple: au bout d'une minute, mettre l'arduino en veille si il n'y a pas d’interaction avec la carte.

    La deuxième interruption serait à l'aide d'un bouton poussoir, relancer le programme là ou il s'était arrêté avec les mêmes variables actionnées.

    Est ce réalisable ?

    Quelle est l'interruption à utiliser pour mettre en veille et quelle est l'interruption pour réactivé le programme ?

    • Partager sur Facebook
    • Partager sur Twitter
      17 mars 2014 à 1:23:14

      mettre en veille, c'est pas une interruption, c'est une instruction (sleep_cpu en l'occurrence) T'as juste à activer l'IT de ton GPIO, ça réveillera ton processeur, dans l'IT, tu acquitte l'IT (si c'est pas déjà fait par la couche arduino) et tu laisse le proc revenir à la tâche de fond.

      Pour plus d'info : http://playground.arduino.cc/Learning/arduinoSleepCode#.UyY_Wf1OVOQ

      • Partager sur Facebook
      • Partager sur Twitter
      64kB de mémoire, c'est tout ce dont j'ai besoin
        17 mars 2014 à 20:18:17

        Salut,

        merci pour ta réponse. J'ai utilisé le lien que tu m'as proposé et il m'a aidé. J'ai pu créer l'interruption mais je n'ai pas réussi à mettre mon arduino pro en veille. C'est à dire que lorsque je change l'état de la pin 2(pin d'interruption externe), le programme exécute le bout de code interruption_externe() que j'ai créé.

        Seulement, il ne se met pas en veille avec la fonction sleep_cpu();(il passe la ligne normal). J'ai également vu dans le lien qu'il y a cinq modules qui peuvent être activé ou désactivé mais je voulais savoir si ils sont activées ou non par défaut ?

        Y'a t-il une autre solution pour le mettre en veille ? 

        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2014 à 0:52:19

          fait voir ton code ?

          • Partager sur Facebook
          • Partager sur Twitter
          64kB de mémoire, c'est tout ce dont j'ai besoin
            18 mars 2014 à 9:35:05

            #include <Adafruit_GFX.h>
            #include <Adafruit_PCD8544.h>
            #include <avr/sleep.h>
            // pin 7 - Serial clock out (SCLK)
            // pin 6 - Serial data out (DIN)
            // pin 5 - Data/Command select (D/C)
            // pin 4 - LCD chip select (CS)
            // pin 3 - LCD reset (RST)
            Adafruit_PCD8544 display = Adafruit_PCD8544(3,4,5,7,6);
            int pin = 13;
            volatile unsigned long button_time = 0;
            volatile unsigned long last_button_time = 0;
            int debounce = 250; // debounce latency in ms
            volatile int state = LOW; // déclartion d'une variable volatile
            void setup()
            {display.begin();
              display.setContrast(50);
             pinMode(pin, OUTPUT);
             attachInterrupt(0, interruption, FALLING); // attache l'interruption externe n°1 à la fonction interruption
            }
            void loop()
            {
            digitalWrite(pin, state); // la LED reflète l'état de la variable
            display.clearDisplay();// efface le lcd
            display.print("a");
            display.display();// affiche la lettre 
            delay(2500);// une pause pour prendre le temps de voir ce qui est affiché à l'écran.
            sleep_cpu();
            display.clearDisplay();
            display.print("b");
            display.display(); 
            delay(2500);
            }
            void interruption() // la fonction appelée par l'interruption externe n°0
            {
             button_time = millis();
             if (button_time - last_button_time > debounce)
             {
             state = !state; // inverse l'état de la variable
             last_button_time = button_time;
             }
             display.clearDisplay();
             display.print("boucle interruption");
             display.display(); 
             delay(2500);
            }
            Voila le bout de code sur lequel je m’exerce pour la mise en veille et la sortie de veille de mon arduino.
            Avec ce code en l'état, j'ai la lettre "a" et la lettre "b" qui apparait sur l'ecran et "boucle interruption" quand j'appuie sur le bouton poussoir. En même temps, la lcd sur la carte arduino change d'état.
            • Partager sur Facebook
            • Partager sur Twitter
              18 mars 2014 à 15:36:27

              bonjour,

              une bonne pratique sur les forums d'informatique, ou d'électronique programmée consiste à poster son code entre des balises code, qui comme leur nom l'indique, servent à poster du code. ça rend le code lisible, garde l'indentation et la coloration syntaxique, ça rend compacte un peu, bref ça rend le code plus lisible, et du coup, c'est devenu un usage obligatoire. pour ce faire, tu peux copier ton code dans le presse-papier depuis ton IDE, cliquer sur le bouton qui ressemble à ça: [</>], dans la petite fenêtre qui s'ouvre, sélectionner le langage qui correspond à ton code (le code arduino peut se confondre à du C++ en terme de syntaxe, donc choisis C++), coller ton code , et cliquer sur le bouton insérer (il est vert, tu peux pas le rater).

              je vais le faire pour toi pour cette fois, mais à l'avenir, pense à le faire, ça coûte rien, et ça donne moins envie à la personne qui aide de quitter la page.

              #include <Adafruit_GFX.h>
              #include <Adafruit_PCD8544.h>
              #include <avr/sleep.h>
              // pin 7 - Serial clock out (SCLK)
              // pin 6 - Serial data out (DIN)
              // pin 5 - Data/Command select (D/C)
              // pin 4 - LCD chip select (CS)
              // pin 3 - LCD reset (RST)
              Adafruit_PCD8544 display = Adafruit_PCD8544(3,4,5,7,6);
              int pin = 13;
              volatile unsigned long button_time = 0;
              volatile unsigned long last_button_time = 0;
              int debounce = 250; // debounce latency in ms
              volatile int state = LOW; // déclartion d'une variable volatile
              void setup()
              {display.begin();
                display.setContrast(50);
               pinMode(pin, OUTPUT);
               attachInterrupt(0, interruption, FALLING); // attache l'interruption externe n°1 à la fonction interruption
              }
              void loop()
              {
              digitalWrite(pin, state); // la LED reflète l'état de la variable
              display.clearDisplay();// efface le lcd
              display.print("a");
              display.display();// affiche la lettre 
              delay(2500);// une pause pour prendre le temps de voir ce qui est affiché à l'écran.
              sleep_cpu();
              display.clearDisplay();
              display.print("b");
              display.display(); 
              delay(2500);
              }
              void interruption() // la fonction appelée par l'interruption externe n°0
              {
               button_time = millis();
               if (button_time - last_button_time > debounce)
               {
               state = !state; // inverse l'état de la variable
               last_button_time = button_time;
               }
               display.clearDisplay();
               display.print("boucle interruption");
               display.display(); 
               delay(2500);
              }

               voilà, c'est tout pour moi, je vais jeter un oeil à tout ça quand j'aurai un peu plus de temps.

              • Partager sur Facebook
              • Partager sur Twitter

              oui. non. enfin je regarde et je te dis.

              Arduino: les interruptions

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown