|
要写一个超声波测距的程序。
选用430的TimerA 的CCR1捕获
程序如下:
#include <msp430x16x.h>
#include "HCSR04.h "
#define uchar unsigned char
#define uint unsigned int
#define RISE 1
#define FALL 0
unsigned char Edge=1;//当前触发沿
uint m=0,temp[2],p,g=0;
double s;
float l;
uchar j=0;
unsigned long int t;
void Init_CLK(void)
{
unsigned int iq0;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
}
void Init_TA(void) //工作在捕获模式
{
TACTL |=TASSEL_2+ID_3+MC0+TACLR+TAIE; // 8M主系统时钟 8分频1M 1us 增计数
CCTL1 =CM0+CCIS_0+SCS+CAP+CCIE; //上升沿捕获 CCIA10 同步 捕获模式 开启中断允许
CCR0=50000; // 计时为0.05s
CCTL1 &=~CCIFG; // 清除CCR1中断标志
TACTL &=~TAIFG; // 清除定时器溢出中断标志
}
void Init_IO(void)
{
P1DIR &=~BIT2;
P1SEL |=BIT2; //输入模式 捕获
P1DIR |=BIT4;
P1SEL |=BIT4; //输入模式 捕获
P3DIR |=BIT6; //超声波配置
P3SEL &=~BIT6;
P3OUT &=~BIT6; // 给控制端开始低电平
}
void Send_Signal(void)
{
//P1OUT &=~BIT4;
SET_TRIG;
Delay_us(20);
CLR_TRIG;
}
void Delay_us(uchar n)
{
for(uchar p=0;p<n;p++)
for(uchar i=0;i<8;i++);
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Init_CLK();
Init_TA();
Init_IO();
_EINT();
while(1)
{
Send_Signal();
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_a1(void)
{
switch(TAIV)
{
case 2 :
if(Edge==RISE)
{
temp[j]= TACCR1; // temp[j]=TAR;
TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
Edge = FALL;//下降沿捕获标志
j++;
break;
}
else
{
_DINT();
temp[j]= TACCR1;
TACCR1 = 0;
TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = RISE;//上升沿捕获标志
j++;
_EINT();
}
case 10 : m++; break;
case 4 : break;
}
if(j==2)
{
if(temp[1]<temp[0]) m--;
p=temp[1]-temp[0];
j=0;
t=p+m*50000;
m=0;
}
CCTL1 &=~CCIFG; // 清除CCR1中断标志
TACTL &=~TAIFG; // 清除定时器溢出中断标志
}
我给捕获控制IO输入的是1K赫兹的方波。但是一直无法进入 TAIV的2 就是CCR1捕获中断。
不知道是什么原因,求高手讲解。
还有就是TAIV 中的TAIFG 就是是10 和定时器TACTL中的TAIFG(定时器溢出位)有什么区别?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|