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 :

Interruption sur MSP430G2553 [MSP430]


Sujet :

Embarqué

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Interruption sur MSP430G2553
    salut a tous je veux faire clignoter une des led de mon msp430G2553 a des freqences differentes en appuyant sur le bouton poussoir
    j'ai donc fait cela avec une interruption mais ca ne marche ,mon code est le suivant pouvez vous m'aider svp:

    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
    #include <msp430.h>
     
     
    	int vitesse=0;
     
    void main( void )
    {
     
    	WDTCTL = WDTPW + WDTHOLD; // Arrêt du Watchdog
     
    	//configuration entrée et sortie
    	P1DIR |=  BIT0;
    	P1DIR &=~ BIT3;
    	P1OUT &=~BIT0 ;
    	P1IN  |=BIT3 ;
     
    	P1SEL &= ~(0x09); // met à 0 les bits 0 et 3 du registre
    	P1SEL2 &= ~(0x09);
     
    	P1IES |= (BIT3);
    	P1IE |= (BIT3);
    	P1IFG &= ~(BIT3);
    while(1){
    	P1OUT ^= BIT0;
    	__delay_cycles(250000);}
     
     if(vitesse==1)
    {
    	__delay_cycles(150000);
    	}
    else
    {
    __delay_cycles(750000);
    	}
    	__enable_interrupt() ;
     
     
    }
    #pragma vector=PORT1_VECTOR
    		__interrupt void Port_1(void)
    {
     
    				if(vitesse ==1)
     
    					vitesse =0 ;
    				else
    					vitesse =1 ;
    P1OUT = 0x00;
    P1IFG &= ~(BIT3);
    }

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Salut,
    Tu utilises une LaunchPad je suppose ?

    J'ai plusieurs remarques :
    - Tu as fait une erreur avec les P1SEL et P1SEL2.
    - Tu as oublié d'activer GIE (global Interrupt Enabled) dans le registre du CPU, sans lui aucune interruption ne fonctionne même si tu les configures correctement.
    - Attention, si tu regardes bien ta launchpad + le schéma tu verra que la résistance de pull up, nécessaire à l'interrupteur, n'a pas été posé. Donc il faut activer la pull up qui est dans le micro.


    Voilà le code qui fonctionne, je l'ai testé sur ma carte.
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    #include <msp430g2553.h>
     
    int vitesse;
     
    #pragma vector=PORT1_VECTOR
    __interrupt void Port_1(void)
    {
    	/* en temps normal on regarde quelle flag a été activé mais ici on
    	 * n'a qu'un seul interrupteur et une seule entrée interruptible.
    	 *
    	 * */
     
    	P1IFG &= ~BIT3; /* flag effacer */
    	vitesse ^= 1;
     
    }
     
     
     
    int main (void)
    {
    	WDTCTL = WDTPW + WDTHOLD; /* Arrêt du Watchdog sinon il va nous géner */
    	vitesse = 0;
     
    	/* 1 - activation du périphérique cnocerné (qui sont multiplexés)
    	 *
    	 * pour rappel voir datasheet
    	 *
    	 * PxSEL2	PxSEL	Pin Function
    	 *   0 		  0		I/O function is selected.
    	 *   0 		  1 	Primary peripheral module function is selected.
    	 *   1 		  0 	Reserved. See device-specific data sheet.
    	 *   1 		  1 	Secondary peripheral module function is selected.
    	 *
    	 * */
     
    	/* Moi je veux régler le port I/O P1 */
    	P1SEL = 0x00; /* c'est la configuration par défaut mais c'est bien de le faire quand même */
    	P1SEL2 = 0x00;/* c'est la configuration par défaut mais c'est bien de le faire quand même */
     
     
     
    	/* 2 - configuration des broches d'entrées sorties
    	 *
    	 * P1.0 = sortie pour allumer la LED verte
    	 * P1.3 = entrée pour lire l'état de l'interrupteur
    	 *
    	 * */
    	P1DIR |= BIT0; /* P1.0 en sortie */
    	P1DIR &= ~BIT3; /* P1.3 en entrée, par défaut toutes les broches sont en entrées */
     
     
     
    	/* 3 - initialisation au démarrage
    	 *
    	 * P1.0 = 0 LED verte éteintes
    	 *
    	 * */
    	P1OUT &= ~BIT0; /* LED verte éteinte */
     
     
     
    	/* 4 - réglage de l'interruption
    	 *
    	 * interruption de P1.3 sur une transition état haut vers état bas
    	 *
    	 * */
    	P1IES |= BIT3; /* je choisi cette configuration (front descendant) a cause du hard */
     
     
     
    	/* 5 - nous avons besoin d'activer les résistances de pull up interne car sur le hard il n'y a pas
    	 *  de résistance de pull up et l'interrupteur est mal référencé sur l'entrée P1.6 (pas bien !)
    	 */
    	P1REN |= BIT3;
    	P1OUT |= BIT3;
     
     
     
    	/* 6 - activation de l'interruption
    	 *
    	 * on efface le flag
    	 * on active l'interruption + le global interrupt enable GIE (faut pas l'oublier celui là)
    	 *
    	 * */
    	P1IFG &= ~BIT3; /* flag effacer */
    	P1IE |= BIT3;  /* interruption sur le port activer */
    	_BIS_SR (GIE); /* interruption générale activée */
    	/* pourquoi cette syntaxe particulière ? parce qu'on vient faire des réglages dans le
    	 * Status register : un des registres du CPU interne et non celui d'un des périphériques
    	 */
     
     
     
    	/* Ok ! a partir de là, si j'appui sur l'interrupteur, je vais générer une interruption.
    	 * mon programme principale va s'arrêter pour lancer ma sousroutine d'interruption (ISR)
    	 *
    	 */
     
     
    	while (1)
    	{
    		if(vitesse == 0)
    		{
    			__delay_cycles(250000);
    		}
    		else
    		{
    			__delay_cycles(150000);
    		}
     
    		P1OUT ^= 1;
    	}
     
    	return 0;
    }
    Je l'ai commenté pour que tu comprennes et si tu as des questions n'hésite pas, on regardera la doc ensemble.
    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut mercii
    salut vincent, vraiment merci du code commenté et trés bien expliqué .j'avais reussi a corriger mon code et comme tu l'as souligné entre autre j'avais pas activé le PXREN .
    En gros le code marche
    Je suis en systeme embarqué donc vous aurez souvent de mes news

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Alors tant mieux
    Et à bientôt.
    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

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

Discussions similaires

  1. Utilisation du mode Wait For Interrupt sur STM8L151G6
    Par wiloui dans le forum Embarqué
    Réponses: 2
    Dernier message: 27/06/2014, 20h02
  2. [16f84] Aide pour une interruption sur port B
    Par spedy dans le forum Autres architectures
    Réponses: 3
    Dernier message: 12/09/2011, 18h08
  3. Problème d'interruption sur PIC16F877
    Par fidchell456 dans le forum C
    Réponses: 3
    Dernier message: 22/06/2010, 10h08
  4. Interruption sur RB0 [langage C]
    Par jorg1n dans le forum C
    Réponses: 11
    Dernier message: 28/02/2008, 16h57
  5. Interruption sur port série
    Par psl dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/06/2007, 20h26

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