2017-05-13 5 views
0
#include <msp430.h> 

#define BUTTON BIT3 // Port 1.3 
#define REDLED BIT0 // Port 1.0 
#define GRNLED BIT6 // Port 1.6 

#define ZERO 0x08 
#define ONE  0x48 
#define TWO  0x09 
#define THREE 0x49 

int counter = 0; 

int main(void) { 


// Watchdog setup 
WDTCTL = WDTPW + WDTHOLD; // stop watchdog (password + hold counter) 

// LED initial setup 
P1DIR |= REDLED + GRNLED;    // set P1.0 and P1.6 as output (1) pins 
P1OUT &= ~REDLED;      // Disable REDLED 
P1OUT &= ~GRNLED;      // Disable GRNLED 

// Button setup 
P1DIR &= ~BUTTON;      // button is an input 
P1OUT |= BUTTON;      // pull-up resistor 
P1REN |= BUTTON;      // resistor enabled 

P1IE |= 0x08;       //P1.3 interrupt enable 
P1IES &= ~0x08;       //lower edge 
P1IFG &= ~0x08;      //zero flag 
while(1){ 


    } 
} 
#pragma vector=PORT1_VECTOR 
__interrupt void Port_1(void){ 
     counter += 1; 
     counter = (counter % 4); 
     switch(counter){ 
      case 0: 
       P1OUT = ZERO; 
       break; 
      case 1: 
       P1OUT = ONE; 
       break; 
      case 2: 
       P1OUT = TWO; 
       break; 
      case 3: 
       P1OUT = THREE; 
       break; 
     } 

     P1IFG &= ~0x08; 
} 

ich die Unterbrechu nicht eingeben Routine .Ich geprüft Unterbre Flagge, wenn ich die Schaltfläche Flag wird 1, aber die LEDs bringen, werden nicht ändern, ich denke, dass ich nicht interrup.If kann ich geben kann, Die LED muss gewechselt werden. Was ist falsch?Interrupt mit C

+0

Sie haben einen Interrupt-Handler. Aber wie installierst du es, ich meine, wie sagst du dem Vorstand, diese Routine bei einem Interrupt aufzurufen? –

Antwort

3

Globale Interrupts sind standardmäßig beim Programmstart deaktiviert. Sie müssen Code hinzufügen, der das globale Interrupt-Aktivierungsbit (GIE) am Ende von main() setzt. Der plattformunabhängigste (nicht wirklich) Weg ist die Funktion __enable_interrupts().

#include <msp430.h> 
#include <intrinsics.h> 
... 
__enable_interrupts(); 

Alternativ können Sie die GIE Bit direkt:

__bis_status_register(GIE); 

Um zu überprüfen, ob Interrupts (nicht, dass innerhalb der Interrupt-Handler sie immer standardmäßig deaktiviert werden) aktiviert sind:

if (__get_SR_register() & GIE) { 
    printf("interrupts enabled\n"); 
} else { 
    printf("interrupts disabled\n"); 
}