2017-05-13 1 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; 
} 

ınterrup 루틴을 입력 할 수 없습니다. I 플래그 플래그를 누를 때 버튼 플래그가 1이되지만 led가 변경되지 않으면 interrup.If를 입력 할 수 없다고 생각합니다. 지도부가 바뀌어야 해. 뭐가 잘못 됐니?C와의 인터럽트

+0

:

__bis_status_register(GIE); 

가 인터럽트 (그들은 항상 기본적으로 비활성화됩니다 인터럽트 핸들러 내부에없는 것을) 사용 여부를 확인하려면 인터럽트 처리기가 있습니다. 하지만 어떻게 설치 하시겠습니까? 인터럽트가 발생했을 때 보드를이 루틴이라고 부르는 방법은 무엇입니까? –

답변

3

전역 인터럽트는 프로그램 시작시 기본적으로 비활성화됩니다. main() 끝에 글로벌 인터럽트 활성화 (GIE) 비트를 설정하는 코드를 추가해야합니다. 가장 플랫폼 독립적 인 (실제로는 아님) 방법은 __enable_interrupts() 함수를 호출하는 것입니다.

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

는 다른 방법으로, 직접 GIE 비트를 설정 :

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