为了实现两路捕获,写了个简单的实验程序,可是老是出错,不知道原因。
程序大意是,一共有3个LED灯,其中一个不断的闪烁,表示主程序在运行。另两个分别表示代表两路捕获,捕获成功后,LED就会取反。问题是,只有CCI0A路捕获能正常工作,而CCI1A一旦捕获后,所有的LED都不再变化,就好像死机了一样。
void delay(int x)
{
while(x--);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
P4DIR = 0XFF; // P4 为输出
P4OUT = 0XFF; //初始值为1,使LED灯灭
P1SEL = 0xff; //P1 为外部功能,用于捕捉
TACTL = TASSEL_1 + MC_2; // ACLK为时钟源,连续模式
TACCTL0 |= 0x4000; //上升沿捕获
TACCTL0 |= CAP; //捕获模式
TACCTL0 |= CCIE; //捕获中断使能
TACCTL0 &= 0XCFFF; //输入为CCI0A路
TACCTL1 |= 0x4000; //上升沿捕获
TACCTL1 |= CAP; //捕获模式
TACCTL1 |= CCIE; //捕获中断使能
TACCTL1 &= 0XCFFF; //输入为CCI1A路
_EINT(); //开总中断
while(1)
{
P4OUT ^=BIT3; //取反P4.3,LED灯闪烁,示意主程序运行中
delay(10000);
}
}
//***********************************************************************
// Timer A0 中断服务程序, A0是指CCR0
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
P4OUT ^= BIT0; // CCI0A路捕获后,LED闪烁
}
//***********************************************************************
// Timer A3 中断服务程序, A3是指CCR1,CCR2,TAR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
P4OUT ^= BIT1; // CCI1A路捕获后,LED闪烁
} |