[C14][Giải đáp] Interrupt I/O cho msp430G2553

thanh xuân

Ban Chủ Nhiệm
Trích mail của 1 bạn:
Em chào cô ạ, cô ơi, em đang học về interrupt I/O cho msp430G2553 thì bị vướng chỗ này ạ:
- Báo lỗi ở các dòng if ( P2IFG.3) : #18 expected a ")"
- Sau khi bỏ các lệnh trong phần interrupt ( bỏ if ( P2IFG.3 )) thì chương trình không chạy đoạn while(1) trong main.
- Bỏ dòng : _BIS_SR(LPM4_bits + GIE); thì chương trình chạy phần while(1) trong main nhưng không chạy ngắt khi nhấn nút.
Em đã em lại nhiều lần nhưng vẫn không biết sai chỗ nào, rất mong được sự hướng dẫn của cô, em cảm ơn cô nhiều ạ!
Code:
#include <msp430.h>
void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
 
    DCOCTL = 0;                //tao 1MHZ
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;
    // config
    P1SEL=0;
    P1SEL2=0;
    P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
 
    // iNTERRUPT
    P2IE |= BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P2IES |= BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
    P2IFG &= ~BIT3 + ~BIT4 + ~BIT5 + ~BIT6 + ~BIT7;
    _BIS_SR(LPM4_bits + GIE);
 
 
    //main DK // example code
    while(1)
    {
        P1OUT = BIT0 + BIT1;
        _delay_cycles(1000000);
        P1OUT = BIT3 + BIT4;
        _delay_cycles(1000000);
        P1OUT = BIT0 + BIT3;
        _delay_cycles(1000000);
        P1OUT = BIT1 + BIT4;
        _delay_cycles(1000000);
    }
}
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
    P1OUT = 0x00;
    if(P2IFG.3)
    {
        P1OUT = BIT1;
        while (1)
        {
            if((P1IN & BIT5)==0) break;
            P1OUT = BIT1 + BIT2 + BIT3;
        }
    }
    else if(P2IFG.4)
        P1OUT = BIT2;
    else if (P2IFG.5)
        P1OUT = BIT3;
    else if (P2IFG.6)
        P1OUT=BIT4;
    else if (P2IFG.7)
    {
        P1OUT = 0x00;
        WDTCTL = 0; // reset MCU
    }
 
    P2IFG &= ~BIT3 + ~BIT4 + ~BIT5 + ~BIT6 + ~BIT7;
 
}
 

thanh xuân

Ban Chủ Nhiệm
Xin chào bạn!
Đầu tiên rất đáng khích lệ tinh thần tự học của bạn. Không biết trong thời gian chờ đợi bạn đã tìm ra câu trả lời cho mình chưa.:D

1> Báo lỗi ở các dòng if ( P2IFG.3) : #18 expected a ")"
Ở đây bạn muốn kiểm tra có ngắt ở pin P2.3 không phải không?. để truy cập bit 3 của thanh ghi P2IF ta không sử dụng cú pháp trên dc nhé. Bạn nên tập làm quen với mặt nạ bit ví dụ ở đây có thể sửa lại là :
Code:
(P2IFG&BIT3==BIT3)
Tương tự cho các dòng if còn lại.
2> Sau khi bỏ các lệnh trong phần interrupt ( bỏ if ( P2IFG.3 )) thì chương trình không chạy đoạn while(1) trong main.
Ok! ở đây bạn có dòng lệnh
Code:
_BIS_SR(LPM4_bits + GIE);
dòng lệnh này đưa mcu vào Low-Power Mode 4 bạn có thể tham khảo thêm trang 42 tài liệu MSP430x2xx Family User's Guide (Rev. I). Ở trạng thái này "CPU and all clocks disabled" :gach.
3> Bỏ dòng : _BIS_SR(LPM4_bits + GIE); thì chương trình chạy phần while(1) trong main nhưng không chạy ngắt khi nhấn nút.
Bạn bỏ đã tắt đi ngắt toàn cục nhé. vì vậy không có ngắt bình thường nào được hoạt động.
Vậy để trả lời câu 2 và 3 bạn chỉ cần sửa lại lệnh
Code:
_BIS_SR(LPM4_bits + GIE);
thành
Code:
_BIS_SR(GIE);
Các bạn có câu hỏi nên đăng lên 4rum để các bạn cùng tham khảo và mau nhận dc câu trả lời nhé :la:
Thân!
 
Cho em hỏi cái thanh ghi P2IF là thanh ghi gì thế ? tại em xem tài liệu mà không có nhắc đến thanh ghi này, với lại em chỉ thấy có 2 vector ngắt là Timer0_A1_vector và Timer0_A0_vector sao lại có vector ngắt Port2_vector, anh chị có thể giải thích cho em không ạ, em cảm ơn
 

Chuckles

Thành Viên PIF
Cho em hỏi cái thanh ghi P2IF là thanh ghi gì thế ? tại em xem tài liệu mà không có nhắc đến thanh ghi này, với lại em chỉ thấy có 2 vector ngắt là Timer0_A1_vector và Timer0_A0_vector sao lại có vector ngắt Port2_vector, anh chị có thể giải thích cho em không ạ, em cảm ơn
Thì tại không có thanh ghi đó nên trong tài liệu mới không có, chỉ có thanh ghi PxIFG là cờ ngắt cho các chân của các port.
Ngắt thì có nhiều vector lắm bạn à, các cái tên dễ hiểu dễ nhớ như Timer0_A0_vector hay Port1_vector được định nghĩa trong file msp430.h, mở ra đọc tìm hiểu bạn nhé.
 
Top