DEBUG 的时候发现中断时TAIV=10的时候也无法进入其中进行overflow++
/*P2.0和P1.2相连*/
#include <msp430x14x.h> //头文件,430
#include "LCD12864.h" // LCD12864
#include "delay.h" // 延迟时间函数
unsigned char *ms1="捕获标志:";
unsigned int start, end; // 上升和下降沿TAR
unsigned int overflow=0; // 溢出次数
unsigned int
time=0; // 高电平时间
void Init_Clk(void); //初始化时钟
void main()
{
Init_Clk(); //初始化时钟
Init_Lcd(); //初始化LCD
P2SEL |= BIT0; //P2.0在第2功能,ACLK为32768/8HZ 00000001
P2DIR |= BIT0; //P2.0为输出,ACLK
P1SEL |= BIT2; //P1.2为功能模块TA1,捕获功能
P1DIR &= ~BIT2; //P1.2输入方向,作为捕获输入
CCTL1 =CM0+SCS+CCIS_0+CAP+CCIE;
//输入上升沿捕获,CCI1A为捕获信号,容许CCIE // 捕获中断
TACTL =TASSEL_2+TACLR+TAIE+MC1 ;
//定时器A时钟信号选择SMCLK,1MHz,
//设置定时器A计数模式为连续增计模式
_EINT(); //开中断
Disp_HZ(0x80,ms1,10);
while(1)
{
Time = end-start;
//Time = (overflow*65535+(end-start));
Disp_4num(0x90,Time);
Disp_4num(0x88,end);
Disp_4num(0x8c,start);
Disp_4num(0x98,overflow);
}
}
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{
case 10: //定时器溢出中断
overflow++; //溢出计数加1
break;
case 2: //捕获中断, CCIFG1中断
if(CCTL1&CM0) //上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发
start=TAR; //记录初始时间
overflow=0; //溢出计数变量复位,这句很关键的,想想为什么要这样复位?
}
else if (CCTL1&CM1) //下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发
end=TAR; //用start, end, overflow计算脉冲宽度
}
break;
default:
break;
}
}
void Init_Clk(void)
{
unsigned int i;
WDTCTL = WDTPW+WDTHOLD; //停止看门狗
BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电时默认为关闭的
do
{
IFG1 &= ~OFIFG; //清振荡器失效标志
for(i= 0xff; i>0; i--); //延时,待稳定.
}
while ((IFG1 & OFIFG)!=0); //若振荡器失效标志有效,一直等待
BCSCTL2 |= SELM_2+DIVM_3; //使MCLK选择XT2且MCLK=XT2/8=1MHZ
BCSCTL2 |= SELS+DIVS_3; //使SMCLK选择XT2且SMCLK=XT2/8=1MHZ
}
一周热门 更多>