2017-05-02 2 views
0

J'ai un problème avec les voyants. 2 boutons en entrée et 3 voyants et 7 segments en sortie. Si nous poussons en appuyant une fois sur le bouton, nous pouvons observer "1" sur l'afficheur à 7 segments. Lorsque le bouton de confirmation est enfoncé, le voyant vert s'allume 1 seconde plus tard après que le bouton de confirmation est enfoncé.Utilisation des interruptions de port et des temporisateurs sur CCS

Si on appuie deux fois sur le bouton de sélection, on peut observer "2" sur l'afficheur à 7 segments. Lorsque vous appuyez sur le bouton de confirmation, le voyant jaune s'allume 2 secondes plus tard, après quoi le bouton de confirmation est enfoncé.

Si nous poussons trois fois le bouton de sélection, nous pouvons observer "3" sur l'affichage à 7 segments. Lorsque le bouton de confirmation est enfoncé, le voyant rouge s'allume 3 secondes plus tard, après quoi le bouton de confirmation est enfoncé.

Je dois utiliser les interruptions de port et les minuteurs. Je ne pouvais pas trouver comment les LED seront allumées 1,2 et 3 secondes plus tard. Mon code fonctionne mais quand j'appuie sur le bouton de confirmation, il est allumé instantanément et parfois retardé. Je ne comprends pas. Et segments retardés, aussi. Voici mon code:

#include <msp430.h> 

#define BUTTON1 0x04 //confirmation Button P1.2 
#define BUTTON2 0x02 

#define Yellow (P1OUT |= 0x10) 
#define Red (P1OUT |= 0x20) 
#define Green (P1OUT |= 0x08) 
#define LedOff (P1OUT &= ~0x38) 


int counter =0; 

int main(void) { 
    WDTCTL = WDTPW|WDTHOLD; 

    P2SEL &= ~0x40; 
    P1DIR |= (BIT5|BIT4|BIT3); // Set the LEDs on P1.5, P1.4, P1.3 as outputs 
    P1OUT = 0; 


    P2DIR |= (0x01|0x02|0x04|0x08|0x10|0x20|0x40); //segments 

    P1OUT = LedOff; 
    P2OUT = ~0x7F; 

    P1IE =BUTTON2|BUTTON1; // interrupt enable 
    P1IES=BUTTON2|BUTTON1; //interrupt edge select from high to low 
    P1IFG=0x00; 

    BCSCTL3 |= LFXT1S_2; 

    TACTL = TASSEL_2|ID_1|MC_3|TAIE|TACLR; 
    TACCR0 = 3000; 



    _enable_interrupts();//enable all interrupts 


    LPM0; 
} 

#pragma vector=TIMER0_A1_VECTOR 

__interrupt void bahar(void){ 

          if(P1IFG==BUTTON2){ 
           P2OUT = ~0x7F; 
           counter++; 
             if(counter==1){ 
              P2OUT = 0x06; // 1 
             } 
             if (counter == 2) { 
              P2OUT = 0x5b; // 2 
              } 
             if (counter == 3) { 
               P2OUT = 0x4F; // 3 
               counter =0; 
             } 

          } 

          if(P1IFG==BUTTON1){ 
           P1OUT =LedOff; 
           if (counter == 1) { 
               Green; 
               } 
              if (counter == 2) { 
               Yellow; 
              } 
              if (counter == 0) { 
               Red; 
              } 
             // TACTL |= TACLR; 
             } 
          P1IFG=0x00; //clear the interrupt flag 
} 

Répondre

0

P1OUT =LedOff; substitué par obtient P1OUT =(P1OUT &= ~0x38)

De plus, vous utilisez l'interruption de la minuterie pour gérer l'entrée utilisateur. Cela signifie que votre pression sur le bouton définira le drapeau d'interruption du bouton, mais ce n'est qu'après l'expiration de votre minuterie que cette valeur est vérifiée. La DEL est actuellement définie dans cette même routine.

  • Vous devez utiliser le gestionnaire d'interruption gpio pour gérer les interruptions de bouton.
  • Votre interruption gpio doit démarrer la minuterie avec le délai d'attente souhaité.
  • Votre gestionnaire d'interruption de minuterie doit désactiver le minuteur et allumer le voyant souhaité.