création d'une interruption par arduino mega

Accueil/Questions/création d'une interruption par arduino mega
création d'une interruption par arduino mega 2015-05-17T18:35:07+00:00

Accueil Forums Questions création d'une interruption par arduino mega

6 sujets de 1 à 6 (sur un total de 6)
  • Auteur
    Messages
  • Zardoua93
    Participant
    Nombre d'articles : 3
    #8817 |

    slt tout le monde, j’ai besoin de votre aide pour crée une interruption qui exécute un petit sous programme par une fréquence de 15ms ou 20ms sachant que je travail sur une carte arduino mega 2560. l’interruption que je veux gérer s’éxécute automatiquement sans avoir besoin d’un signl externe pour l’effectuer.
    je vous remercie d’avance pour vos réponses.

    arnaud39
    Admin bbPress
    Nombre d'articles : 81

    Cela est possible par une petite astuce : la fonction millis vous permet de savoir depuis combien de temps votre carte Arduino est allumée

    Voilà le principe : dans une boucle infinie, on associe la variable i à millis, i se met à jour donc à chaque fois que la boucle est exécutée.
    On va, dans une seconde variable a stocker dans un premier temps i. Ensuite, la variable prend la valeur de i lorsque i – a > 20 (plus de 20ms) et le programme s’exécute. Ce qui nous donne :

    int a = 0; //la première fois a vaut 0
    int i;
    void loop ()
    {
     i = millis();
    if (i-a > 20) {a = millis(); votreFonction();}
    }
    void votreFonction()
    {
    i = millis();//en prévention d'un temps d'exécution de la fonction non négligable
    }

    En espérant avoir répondu à votre question

    • Cette réponse a été modifiée le il y a 2 ans et 4 mois par  arnaud39.
    • Cette réponse a été modifiée le il y a 2 ans et 4 mois par  arnaud39.
    Declan Valdanec
    Participant
    Nombre d'articles : 13

    La question est : le petit programme met-il plus de 20ms à s’exécuter ou non ? Car si c’est le cas aucune solution n’existe, sinon suit ce que a mis @arnaud39 ça marche nickel

    Zardoua93
    Participant
    Nombre d'articles : 3

    salut Arnaud et declan, je vous remercie d’abord pour vos réponses, pour résoudre mon problème, il me faudra plusieurs fonction millis(); car j’ai plusieurs taches à réalisé. j’ai un servomoteur qui change de direction vers 4 postions différente quand un système est déclenché. le servo doit maintenir chaque position pendant 2 ou 3 seconde alors que pendant ce temps là, je doit saisir un code à l’aide d’un clavier matriciel pour désactiver le système, ce qui n’est pas possible à cause de delay. la solution est d’écrire un sous programme qui doit s’éxécuter d’une fréquence suffisante pour m’atteidre au moment d’appuie sur les touches: voilà la solution par le timer1:

    #include <avr/io.h>
    #include <avr/interrupt.h> // les bibliothèques du timer1

    void setup()
    {
    // initialize Timer1
    cli(); // disable global interrupts
    TCCR1A = 0; // set entire TCCR1A register to 0
    TCCR1B = 0;

    // enable Timer1 overflow interrupt:
    TIMSK1 = (1 << TOIE1);
    // Set CS10 bit so timer runs at clock speed:
    TCCR1B |= (1 << CS10);
    // enable global interrupts:
    sei();
    }

    ISR(TIMER1_OVF_vect)
    {
    EnterPin(); // voilà le sous programme qui s’éxécute toutes les 4,1ms 🙂
    }

    pour contoler la fréquence d’interruption, on agit sur les 3 bits (CS10, CS11 et CS12) du registre TCCR1B(timer counter controle register B);

    pour en savoir plus sur les Timer visiter ce lien :
    http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

    salut ! 🙂

    arnaud9212
    Admin bbPress
    Nombre d'articles : 118

    Salut, je peux te conseiller de regarder notre dernier tutoriel sur les timers, tu pourras gerer le moteur sans utiliser de delay et stopper les actions programmés du moteur si le code est bon

    Zardoua93
    Participant
    Nombre d'articles : 3

    ok, Je vous remerci Arnaud9212 pour votre conseil 🙂

6 sujets de 1 à 6 (sur un total de 6)

Vous devez être connecté pour répondre à ce sujet.