为什么我只能够捕获一路呢?第二路不能够正常的工作呢?
#include <msp430x14x.h>
#include "LCD1602.h"
unsigned int upflag=0;
unsigned int downflag=0;
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
LcdInit();
P1DIR &=~ BIT2+BIT3;
P1SEL = BIT2+BIT3; //设置P1.2为端口功能模块使用,即做捕获源
TACTL = TASSEL_2 +TACLR +TAIE + MC1;//ACLK
CCTL1 = CM_1 +SCS +CAP +CCIE; //输入上升沿捕获,CCI0A为您捕获信号源
CCTL2 = CM_1 +SCS +CAP +CCIE; //输入上升沿捕获,CCI0A为您捕获信号源
_EINT();
while(1){
WriteCommand(0x80);
WriteData(upflag+0x30);
WriteCommand(0xC0);
WriteData(downflag+0x30);
}
}
/*******************************************
定时器A中断服务子函数
捕获待测信号上升沿
**********************************************/
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV) //向量查询
{
case 2: //捕获中断
if(CCTL1 & CM0) //捕获到上升沿
upflag++; TACCTL1 &=~CCIFG; break;
case 4:
if(CCTL2 & CM0) //捕获到上升沿
upflag++; TACCTL2 &=~CCIFG; break;
default:
break;
}
}
此帖出自
小平头技术问答
楼主,你这程序写的太蛋疼了,初始化了两个中断使能,但是只有一个中断处理函数,这怎么能行呢?你编译没发现问题吗?正确的是一个中断时能,上升沿使能,在中断处理函数里,在进行下降沿的处理。
示例:
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0(void)
{
if(TBCCTL0&CM1) //捕获到下降沿
{
TBCTL|=TBCLR;
TBCCTL0=(TBCCTL0&(~CM1))|CM0; //改为上升沿捕获:CM1置零,CM0置一
}
else if(TBCCTL0&CM0) //捕获到上升沿
{
width[i++]=TBCCR0; //记录下结束时间
TBCCTL0=(TBCCTL0&(~CM0))|CM1; //改为下降沿捕获:CM0置零,CM1置一
if(i==10) i=0;
}
}
一周热门 更多>