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é

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 52
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 605
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 605
    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.

+ 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, 10h33
  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, 14h35
  3. problème sur le composant aspSmartUpload
    Par PrinceMaster77 dans le forum ASP
    Réponses: 8
    Dernier message: 23/09/2004, 10h17
  4. [C#] OnPaint(PaintEventArgs e) sur création Composant
    Par pc152 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/08/2004, 16h13
  5. Tri sur code hiérarchique
    Par cafou33 dans le forum SQL
    Réponses: 5
    Dernier message: 22/03/2004, 17h19

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