interrupt !

Phạm Minh

Thành Viên PIF
Có ai có code mẫu về interrupt nút nhấn mà nhấn một lần là một chương trình khác không ? Cho mình xin tham khảo đi .:-s
 

Phạm Minh

Thành Viên PIF
Cho em hỏi là em thấy trong datasheet có thể dùng hai ngắt được, vậy em dùng interrupt rồi dùng cả ngắt timer thì có sao ko anh:D
 

Võ Hồng Đức

Thành Viên PIF
Bạn thử code này, các ngắt đối với port khác bạn config tương tự
Code:
#include <msp430g2553.h>
 
void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;
    //P1SEL = BIT0 +BIT6;
    P1DIR |= BIT0+BIT6;
 
    P1DIR &= ~BIT3;
    P1IE |= BIT3;
    P1IES |=BIT3;
    P1IFG &= ~BIT3;
    P1REN |= BIT3;
    P1OUT|=BIT0;
    _bis_SR_register( GIE);
    while(1)
    {
        P1OUT ^=BIT0;
        __delay_cycles(500000);
    }
}
#pragma vector = PORT1_VECTOR
__interrupt void port1_isr()
{
    if ( P1IFG & BIT3)
    {
        P1OUT ^=BIT6 ;
        P1IFG &= ~BIT3;
        //P1IES ^= BIT3;
    }
 
}
 

Phạm Minh

Thành Viên PIF
Cho mình hỏi mình là sai chỗ nào, khi nhấn nút thì cả chương trình đứng yên.


void main(void)
{
WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer
// khai báo chân sẽ dùng
P1SEL = 0;
P1SEL2 = 0;
P2SEL = 0;
P2SEL2 = 0;
P2DIR |= 0XFF;
P2OUT |= 0XFF;
// cài đặt chăn nút nhấn là ở chân 3 với 4
//BCSCTL1 = CALBC1_1MHZ;
//DCOCTL = CALBC1_1MHZ;
P1DIR &=~ (0X08);
P1REN |= 0x08;
P1OUT |= 0x08;
P1IE |= 0x08;
P1IES |= 0x08;
P1IFG &=~(0x08);
__enable_interrupt();
while(1)
{
switch(a)
{
case 0:
{
led1();
break;
}
case 1:
{
led2();
break;
}
case 2:
{
port_init();
timer_a0_init();
break;
}
}
}

}
/************************Nut nhấn**************/
#pragma vector = PORT1_VECTOR
__interrupt void test(void)
{
if(P1IFG&BIT3)
{
if((P1IN&BIT3)==0)
{
while(BIT3==0)
a++;

if( a == 2)
{
a = 0;
}
if(a == 0)
{
a = 2;
}
}
P1IFG |=~ BIT3;
}
}
 

Võ Hồng Đức

Thành Viên PIF
lỗi là chưa xóa cờ ngắt, P1IFG |=~ BIT3;
à, còn trong phần ngắt thì không nên dùng vòng while
 

Phạm Minh

Thành Viên PIF
Em vẫn chưa hiểu lắm, anh có thể viết một đoạn code về nút nhấn được không anh . :)
 

Võ Hồng Đức

Thành Viên PIF
Nếu bạn muốn có nhiều nút nhấn thì khai báo, và trong ct ngắt thêm trường hợp vào
Code:
#include <msp430g2553.h>
int mode =1;
void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;
    //P1SEL = BIT0 +BIT6;
    P1DIR |= BIT0+BIT6;
 
    P1DIR &= ~BIT3;
    P1IE |= BIT3;
    P1IES |=BIT3;
    P1IFG &= ~BIT3;
    P1REN |= BIT3;
    P1OUT|=BIT0;
    _bis_SR_register( GIE);
    while(1)
    {
        switch( mode)
        {
            case 0:
                //put fuction 0
                P1OUT &= ~BIT0;
                break;
            case 1:
                //put function 1
                //example
                P1OUT |= BIT0;
                break;
            default:
                //put default function, if mode # 0,1
                break;
        }
    }
}
#pragma vector = PORT1_VECTOR
__interrupt void port1_isr()
{
    char int_flag = P1IFG;
    P1IFG &=~ (int_flag);
    switch( int_flag)
    {
        case BIT3:
            mode ^= 1;
            break;
        default:
            break;
 
    }
 
}
 
Top