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

Embarqué Discussion :

Interruptions en C sur Code Composer [MSP430]


Sujet :

Embarqué

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut Interruptions en C sur Code Composer
    Bonjour à tous,
    Je suis débutant en informatique et dans le cadre d'un projet pour mes études je dois utiliser plusieurs interruptions.
    Je dois coder sur code composer studio en C.
    Pour faire simple je dois avoir deux interruptions qui se déclenchent lorsque j'appuie sur un bouton ; on utilise un MSP430F5529
    Je souhaiterais déclencher des interruptions sur les ports :
    - P1.3 en front montant
    - P8.2 en front montant également

    J'ai réussi à programmer pour le premier (P1.3) mais je ne sais pas comment faire pour le second. Voici mon code :

    Code C : 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
    45
    46
    47
    48
    49
    50
    51
    #include <msp430.h>
     
     
     
    void main( void )
    {
     
     
     
        WDTCTL = WDTPW + WDTHOLD; // Arrêt du Watchdog
     
     
     
        P1DIR |= (BIT4+BIT5);       //initialisation des différents ports afin d'allumer des leds et vérifier que línterruption se declenche
        P1DIR &=~ (BIT3);
     
        P1OUT &=~ (BIT5);
        P1OUT |= (BIT4);
     
     
     
        P1IES &= ~ (BIT1);//sur front montant         &= ~
        P1IFG &= ~(BIT1); //flag eteint
        P1IE |= (BIT3);    //Sur la pate P1.3 on fait l4interruption
     
        _BIS_SR (GIE); /* interruption générale activée */
     
     
     
     
        while(1)
        {
                //On ne fait rien, on attend que linterruption se declenche
     
        }
    }
     
     
    #pragma vector=PORT1_VECTOR
    __interrupt void Port_1(void)
    {
     
        if( (P1IN & BIT3) != 0 ) // Si jáppuie sur le bouton línterruption se declenche et allume la led
        {
            P1OUT |= (BIT5);
        }
     
     
        P1OUT  &= ~(BIT5);; //reinitialise les sorties, on eteint la led une fois le bouton relache
        P1IFG &= ~(BIT1); //flag effacer
    }

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut complement
    Par exemple P8IES n'existe pas.. je ne vois par consequent pas comment configurer l'interruption

    et dois je nommer la 2nd interruption . #pragma vector=PORT2_VECTOR
    __interrupt void Port_2(void).....

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut Code
    Voila mon code pour la seconde interruption mais cela ne fonctionne pas...

    Code C : 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include <msp430.h>
     
     
     
    void main( void )
    {
     
     
     
        WDTCTL = WDTPW + WDTHOLD; // Arrêt du Watchdog
     
     
     
        P1DIR |= (BIT4+BIT5);       //initialisation des différents ports afin d'allumer des leds et vérifier que línterruption se declenche
        P1DIR &=~ (BIT3);
     
        P1OUT &=~ (BIT5);
        P1OUT |= (BIT4);
     
        P8DIR |= (BIT1);
        P8DIR &=~ (BIT2);
        P8OUT |= (BIT1);
        P2DIR |= (BIT3);
        P2OUT &=~ (BIT3);
     
        P2IES &= ~ (BIT2);
        P2IFG &= ~(BIT2);
        P2IE |= (BIT2);
     
     
        P1IES &= ~ (BIT3);//sur front montant         &= ~
        P1IFG &= ~(BIT3); //flag eteint
        P1IE |= (BIT3);    //Sur la pate P1.3 on fait l4interruption
     
        _BIS_SR (GIE); /* interruption générale activée */
     
     
     
     
        while(1)
        {
                //On ne fait rien, on attend que linterruption se declenche
     
        }
    }
     
     
    #pragma vector=PORT1_VECTOR
    __interrupt void Port_1(void)
    {
     
        if( (P1IN & BIT3) != 0 ) // Si jáppuie sur le bouton línterruption se declenche et allume la led
        {
            P1OUT |= (BIT5);
        }
     
     
        P1OUT  &= ~(BIT5); //reinitialise les sorties, on eteint la led une fois le bouton relache
        P1IFG &= ~(BIT1); //flag effacer
    }
     
     
    #pragma vector=PORT2_VECTOR
    __interrupt void Port_2(void)
    {
     
     
        if( (P8IN & BIT2) != 0 )
        {
            P2OUT |= (BIT3);
        }
     
     
        P2OUT &= ~(BIT3); //reinitialise les sorties
        P2IFG &= ~(BIT2); //flag effacer
    }

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Bonjour,
    Un coup d'oeil rapide sur le MSP430F5529, on voit que seuls les P1.0 à P1.7 et P2.0 à P2.7 peuvent être des interruptions. Difficile de déclencher une interruption sur P8.2!

    Le code de l'interruption pour P1.3 allume la LED pour l'éteindre immédiatement après (à moins que ça ne soit l'inverse). Si L'appui est détecté par une IT, le relâchement doit être détecté par un autre moyen car il a lieu très nettement plus tard (au moins 20ms), polling , autre IT, etc

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Pour compléter la réponse de dalfab, il faut savoir que beaucoup de microcontrôleurs ne permettent d'avoir le déclenchement d'interruptions via toutes leurs GPIO. C'est une erreur classique de choisir une pin en oubliant sa capacité à générer ce qui s'appelle généralement des external interrupts.

    Il est tout à fait possible détecter l'appui et le relâchement dans la même routine d'interruption. Il faut alors regarder l'état de la pin : haut pour un appui, bas pour un relachement. Seul (gros) hic : il faut gérer l'anti-rebond. Et là, c'est encore un autre problème

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Ici l'interruption est sur font montant, elle ne peut pas servir à détecter un niveau bas.
    A ma connaissance, on ne peut pas définir une interruption sur changement de niveau dans le MSP430, il faut choisir montant ou descendant.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Ah mince.... Je crois m'en souvenir maintenant, et je crois bien que tu as raison ^^

    Dans ce cas, une solution pourrait être de démarrer un timer dans l'interruption du bouton, qui déclenchera des interruptions régulières pour détecter le relâchement (toujours en gérant les rebonds...). Ou de tout faire en sampling dans l'interruption d'un timer si le système est peu chargé et que si on se fiche de la consommation.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous,
    merci pour vos réponses. J'ai modifié mon programme cela semble fonctionner ! j'ai un petit problème dans mon branchement mais c'est autre chose
    Code C : 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #include <msp430.h>
     
     
     
    void main( void )
    {
     
     
     
        WDTCTL = WDTPW + WDTHOLD; // Arrêt du Watchdog
     
     
    //BOUTON ROUGE
        P1DIR |= (BIT4+BIT5);       //initialisation des différents ports afin d'allumer des leds et vérifier que línterruption se declenche
        P1DIR &=~ (BIT3);
     
        P1OUT &=~ (BIT5);
        P1OUT |= (BIT4);
     
        //Bouton NOIR
        P2DIR |= (BIT0+BIT3);
        P2DIR &=~ (BIT2);
     
        P2OUT |= (BIT0);
        P2OUT &=~ (BIT3);
     
     
     
    //Paramètres des interruptions
     
        P1IES &= ~ (BIT3);//sur front montant         &= ~
        P1IFG &= ~(BIT3); //flag eteint
        P1IE |= (BIT3);    //Sur la pate P1.3 on fait l4interruption
     
        P2IES &= ~ (BIT2);
        P2IFG &= ~(BIT2);
        P2IE |= (BIT2);
     
     
        _BIS_SR (GIE); /* interruption générale activée */
     
     
     
     
        while(1)
        {
            P1OUT  &= ~(BIT5); //reinitialise les sorties, on eteint la led une fois le bouton relache
            P2OUT &= ~(BIT3); //reinitialise les sorties
                //On ne fait rien, on attend que linterruption se declenche
     
        }
        __bis_SR_register(GIE); // interrupts enabled
     
        __enable_interrupt(); // interrupts enabled
     
    }
     
     
    #pragma vector=PORT1_VECTOR //BOuton rouge
    __interrupt void Port_1(void)
    {
        P1IE  &= ~(BIT3);
        if( (P1IN & BIT3) == 0 ) // Si jáppuie sur le bouton línterruption se declenche et allume la led
        {
            P1OUT &= ~ (BIT5);
        }
        else
        {
            P1OUT |= (BIT5);
        }
     
     
        P1IFG &= ~(BIT3); //flag effacer
        P1IE |= (BIT3);
     
    }
     
     
    #pragma vector=PORT2_VECTOR
    __interrupt void Port_2(void)
    {
     
        P2IE  &= ~(BIT2); //activation interruption
        if( (P2IN & BIT7) == 0 )
        {
            P2OUT &= ~ (BIT3);
        }
        else
        {
            P2OUT |= (BIT3);
        }
     
     
        P2IFG &= ~(BIT2); //flag effacer
        P2IE |= (BIT2);
    }

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut Resistance pull down
    Re,

    A présent je rencontre un problème, je pense que pour le résoudre je dois ajouter une resistance de pull down mais je ne sais pas du tout comment faire,
    Connaissez vous la synthaxe ?

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    D'après ce que je lis sur le net, il faut utiliser PxREN et PxOUT une fois que le port est en sortie entrée pour choisir entre pullup et pulldown : http://www.argenox.com/library/msp43...pio-chapter-5/

  11. #11
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 185
    Points : 11 551
    Points
    11 551
    Par défaut
    Salut,
    Tu as un registre P1REN et un combinaison à faire avec P1OUT pour activer soit la pull-up ou soit la pull-down.

    Nom : Capture45.PNG
Affichages : 1029
Taille : 26,1 Ko

    Exemple :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	P1DIR &= ~BIT3 /* P1.3 en entrée */
    	P1IES |= BIT3; /* Interruption sur front descendant de  P1.3 */
     
    	P1REN |= BIT3; /* Activation pull-up */
    	P1OUT |= BIT3;
     
    	P1IFG &= ~BIT3; /* Flag effacer pour ne pas déclencher une interruption inattendue */
    	P1IE |= BIT3;  /* Interruption sur le port activer */
    	_BIS_SR (GIE); /* Interruption générale activée */
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  12. #12
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 185
    Points : 11 551
    Points
    11 551
    Par défaut
    @eliters48,
    J'ai du rater un train dans ton raisonnement car je ne comprends absolument pas comment tu es passé de ta demande initiale
    - P8.2 en front montant également

    A un programme qui utilise P1 et P2 ?????

    Pourquoi avoir mis autant de : _BIS_SR (GIE); avec des syntaxes différentes comme __bis_SR_register(GIE); ou encore __enable_interrupt(); ? C'est la même chose tout ça sauf que l'une est plus utilisé par le compilateur GCC, l'autre par IAR et l'autre par CCS (je ne sais plus dans quel ordre exactement)

    @Bktero,
    une fois que le port est en sortie entré pour choisir entre pullup et pulldown
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    PS : remarque très importante sur ce morceau du code précédent
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        while(1)
        {
            P1OUT  &= ~(BIT5); //reinitialise les sorties, on eteint la led une fois le bouton relache
            P2OUT &= ~(BIT3); //reinitialise les sorties
                //On ne fait rien, on attend que linterruption se declenche
     
        }
        __bis_SR_register(GIE); // interrupts enabled 
        __enable_interrupt(); // interrupts enabled

    Les lignes après } ne seront jamais exécutées !

    @Vincent : bien vu ! J'ai édité mon message !

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    Points : 4
    Points
    4
    Par défaut
    Pour être complet, je travaille sur un projet et le MSP a presque tout ses ports utilisé.. j'ai du modifié mes branchement pour pouvoir me raccorder sur les port P1.x et P2.x
    qui dit modifier les branchements dit modifier le code...

    Voila pourquoi j'étais parti sur des ports P8.x c'etait ce qui restait

    Les lignes après } ne seront jamais exécutées !
    merci pour la remarque, je supprime ce aui est apres

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

Discussions similaires

  1. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 11h33
  2. aide sur les composants de la RxLib 2.75
    Par mariustrezor dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/10/2004, 15h35
  3. problème sur le composant aspSmartUpload
    Par PrinceMaster77 dans le forum ASP
    Réponses: 8
    Dernier message: 23/09/2004, 11h17
  4. [C#] OnPaint(PaintEventArgs e) sur création Composant
    Par pc152 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/08/2004, 17h13
  5. Tri sur code hiérarchique
    Par cafou33 dans le forum SQL
    Réponses: 5
    Dernier message: 22/03/2004, 18h19

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