当使用MSP430G2553
单片机用来捕获方波的上升沿来计算频率时遇到问题:
程序在进入中断时一直进入溢出中断,这是怎么回事?
用的是
tiMER1.2
下面是程序:
#include <msp430.h>
void Timer1Init();
int flag = 0;
unsigned long value = 0;
unsigned int result1_start,result1_end;
unsigned int index=0;
unsigned int temp;
/*
* main.c
*/
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
BCSCTL1=CALBC1_1MHZ;
DCOCTL=CALDCO_1MHZ;
//P2DIR &=~BIT5; //P2.5,为输入引脚
P2SEL |= BIT5; // P2.5 = (InputDirection + TA1.2) = CCIxB.2 --> CCR2,P2.5作为输入,CCI2B,指定输入
Timer1Init();
P1SEL |= BIT4;
P1DIR |= BIT4;
P1DIR |= BIT0;
P1OUT |= BIT0;
_EINT();
while(1)
{
value = result1_start;
}
}
void Timer1Init()
{
TA1CCTL2 = CAP + CCIS_1 + CM_3 + CCIE+SCS; // Capture CCIxB, both edge, interrupt enable.CCI2B->p2.5
TA1CTL |=TASSEL_2 + ID_0 + MC_2+ TAIE+TACLR ;//选择1M-SMCLK时钟,continuous mode
TA1CCR2=0;
//TACTL&=~CCIFG;
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TAIV_ISR(void)
{
switch(TA1IV)
{
case 4: //ccr2中断向量
if (TA1CCTL2&CCI) //上升沿触发
{
result1_start=TA1CCR2;//记录初始值
index=0;
break;
}
else
{
result1_end=TA1CCR2; //记录结束值
if(result1_end>result1_start)//结果比开始数值肖,表示溢出了一次或者几次,但是一般从0开始计数的话是不溢出的,这超声波实际测不了那么远,最多有个4米,5米的样子已经很好了
//TACTL|=TACLR;//这句貌似不需要
temp=result1_end-result1_start;
else
temp=result1_end+index*65535-result1_start;
index=0; //溢出清零
break;
}
case 2: break;
case 10: index++;P1OUT ^= BIT0;break; //溢出中断向量,其实就2,4,10号向量有用那些手册里也没说,用不到
default :break;
}
TACCTL1&=~COV
}
一周热门 更多>