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 :

Controler la valeur de sortie d'une interruption


Sujet :

Arduino

  1. #1
    Membre du Club
    Homme Profil pro
    Avide d'apprentissage
    Inscrit en
    Avril 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Avide d'apprentissage
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 80
    Points : 41
    Points
    41
    Par défaut Controler la valeur de sortie d'une interruption
    Bonjour à tous et à toutes,

    Je reviens encore pour un nouveau problème qui commence à m'embêter.

    J'utilise cette interruption :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    attachInterrupt(2, arret,FALLING);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void arret(){
       Bf_bar = 1;         // Bf_bar : variable volatile globale initialisée à 0
       tmp_f=millis();     // tmp_f : variable globale 
    }

    Est-il possible d'avoir toujours le même état à la sortie d'une interruption ?

    Je m'explique, j'aimerai que suite à l'interruption, Bf_bar vaille toujours 1 et non 0 ou 1.

    Voici le contexte : J'ai un programme qui se lance lorsque on appuie et maintient un bouton, si on lâche

    le bouton on fait appel à l'interruption "arret" qui change l'état de Bf_bar et le programme fait autre chose si Bf_bar vaut 1.

    Le problème est que Bf_bar ne vaut pas tout le temps 1 lorsque mon bouton est relâché mais tantôt 1 tantôt 0.

    Y a t-il possibilité de le forcer toujours à 1 ?

    Je vous remercie.

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonsoir

    comment Bf_bar pourrait changer d'état ? Dans ta condition il est réinitialisé à 0 ?

    Si c'est le cas, regarde si l'ajout d'un délai répond à ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void arret(){
       Bf_bar = 1;         // Bf_bar : variable volatile globale initialisée à 0
       delay(20);         // pause 20ms 
       tmp_f=millis();     // tmp_f : variable globale 
    }
    tmp_f je l'aurais déclarée volatile également puisqu'elle change de valeur lors de l'interruption.


    Je vois aussi que tu utilises un timer avec la fonction millis(). Attention, à l'overflow
    Fonction millis()

  3. #3
    Membre du Club
    Homme Profil pro
    Avide d'apprentissage
    Inscrit en
    Avril 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Avide d'apprentissage
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Auteur Voir le message
    bonsoir
    comment Bf_bar pourrait changer d'état ? Dans ta condition il est réinitialisé à 0 ?
    Ce n'est pas dans la condition qu'il est initialisé à mais au tout début du programme.

    Le problème s'en approche mais dans ce cas présent c'est plus son bouton qui lui donne du fil à retordre...
    Citation Envoyé par Auteur Voir le message
    Je vois aussi que tu utilises un timer avec la fonction millis(). Attention, à l'overflow
    Fonction millis()
    Je compte réinitialiser ma carte à chaque fin d'utilisation pour éviter ce problème.
    Je ne sais pas encore comment le faire mais c'est dans un coin, en attente.

    Enfin pour mon problème de changement d'état de Bf_bar, vu que j'ai tourné le problème dans tous les sens et que l'état ne change pas comme je le souhaite je vais faire autrement.
    Je vais initialiser Bf_bar à 1, le forcer à 0 quand mon bouton sera appuyé et donc quand mon bouton sera relâché Bf_bar vaudra 1.
    J'aurai aimé utiliser une interruption parce que pour l'instant mon programme est plein de conditions...
    Pour l'instant ça marche mais si ça marchait tout en ayant un programme classe ça serait mieux

    Merci en tout cas

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par akuma8 Voir le message
    Ce n'est pas dans la condition qu'il est initialisé à mais au tout début du programme.
    Dans le setup() ou dans le loop() ?

    Citation Envoyé par akuma8 Voir le message
    Enfin pour mon problème de changement d'état de Bf_bar, vu que j'ai tourné le problème dans tous les sens et que l'état ne change pas comme je le souhaite je vais faire autrement.
    Normalement une fois que le contenu de ta variable a changé il n'y a aucune raison qu'il change à nouveau sauf si tu l'as écrit quelque part. D'où mon interrogation. J'ai donc du mal à comprendre le problème.

  5. #5
    Membre du Club
    Homme Profil pro
    Avide d'apprentissage
    Inscrit en
    Avril 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Avide d'apprentissage
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    J'ai résolu le problème autrement. Je suis passé par une variable qui change d'état lorsque le bouton est appuyé et s'il est relaché je fais autre chose en fonction de l'état de la variable.

    Maintenant je suis confronté à un autre problème, voici la partie du code :
    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
     
     
    if(Bf_bar)
    {  // Bf_bar est vraie ssi le bouton a été laché.
        // Bip Bip Bip Bip
         tmp=millis(); // capture de l'instant où le bouton est laché : tmp initialisé comme suit : unsigned long tmp = 0;
         chrono_start=1;
         Serial.println("BOUTON FERMETURE LACHE !!!!!!");
         digitalWrite(V,LOW);
         arretMoteursS2();
         aut_f=false;
         aut_o =false;
    }
     if (chrono_start)
    { 
         if(millis()-capture > 2000)  // capture initialisé comme suit : unsigned long capture = 0;
         {
            digitalWrite(R,HIGH); 
            Serial.println("!!!!!!!!!!!! 2 SECONDES SE SONT ECOULEES TROP TARD     !!!!!!");
            capture=millis();
            chrono_start =0;
            Bf_bar=0;
            travail(); // appel à travail au bout de 2s.
         }	
    }
    En fait j'aimerai que lorsqu'on lâche le bouton, si 2 secondes se sont écoulées et qu'on n'a pas reappuyé sur le bouton on fait autre chose à la place.
    Le problème c'est que j'ai l'impression que ce code ne marche pas, ça va trop vite pour 2 secondes, c'est presque instantané.
    J'ai mis la variable "tmp" pour saisir l'instant où on lache le bouton pour comparé à l'instant où "Serial.println("!!!!!!!!!!!! 2 SECONDES SE SONT ECOULEES TROP TARD !!!!!!");" s'affiche
    mais le problème est que tmp ne capture pas cet instant, il vaut 0 ^^ !

    Y a-t-il possibilité de faire autrement pour capturer mes 2 secondes ?

    Merci

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Dans ton if(Bf_bar) tu as tmp=millis(); mais plus bas tu as écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(millis()-capture > 2000)
    . Ca ne serait pas plutôt :
    ?

    Avec le code que tu as posté il n'y a aucune raison que tmp reste à 0 sauf si tu ne passes pas dans la condition if(Bf_bar).

  7. #7
    Membre du Club
    Homme Profil pro
    Avide d'apprentissage
    Inscrit en
    Avril 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Avide d'apprentissage
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Ca ne serait pas plutôt :
    ?
    Elle était là mon erreur, au temps pour moi .

    Merci

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

Discussions similaires

  1. Controle de valeur dans une variable
    Par rollergirl dans le forum Langage
    Réponses: 2
    Dernier message: 01/09/2010, 14h09
  2. Chi2 inferieur à une certaine valeur en sortie
    Par Squallhisoka dans le forum SAS STAT
    Réponses: 1
    Dernier message: 27/04/2009, 22h43
  3. Récupérer valeur de sortie d'une procédure et Problème bizarre
    Par mercure07 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 03/12/2008, 16h02
  4. Réponses: 3
    Dernier message: 19/08/2007, 02h04
  5. [JSP] addition deux valeurs en sortie d'une jsp
    Par LESOLEIL dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 08/06/2005, 11h13

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