我们最近在做09年电赛的声音导引系统这个题目:小车上面的蜂鸣器发出信号,用三个接收器接收信号,处理后产生规则脉冲,连到单片机的三个端口上分别触发中断,然后通过三个中断的时间差来算出小车的坐标.以上是我们的大体思路.初次用C语言在单片机上编程,而且也是初次接触msp430,查了很多天资料才写出了下面这些代码,但是有几个问题始终是找不到答案,不得已才整段发到这里来希望能有朋友帮忙
1.在使用定时器A时,我可以不打开它的中断,仅使用它的计数功能吗?如果可以,它是不是从打开计数器开始每个机器周期数值加1?这个数值存在哪里,是CCR0吗(我另外开了一个程序发现CCR0的值一直都是0)?
2.我使用了p1.567作为三个中端口,它们作为中端口的时候是不是输入输出口都可以?我在网上看到有的程序是设成输入口可是有的程序是设成输出口.
3.我们算坐标的时候计算过程十分复杂,用到了sin,cos,反三角,目测这样写单片机的负担肯定很大,计算过程不短,可是我们能想到的只能这样算,请问这样算单片机能在1s中算出来吗?有没有什么简化的方**
希望有朋友帮忙解答.
附上程序:
#include<msp430g2253.h>
#include<math.h>
#define PI 3.1415926
unsigned int t1=0;
unsigned int t2=0;
unsigned int t3=0; //定义三个接收器的时刻变量
volatile int i=0;//定义全局变量,用于标记已到达的脉冲信号
//函数声明
void initcount() //计时初始化
{
unsigned int iq0; //延时标志
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for (iq0=0xFF; iq0>0; iq0--) //延时,等待XT2起振
{
}
}
while ((IFG1 & OFIFG)!= 0); //判断XT2是否起振
BCSCTL2=SELM_2+SELS; //选择MCLK、SMCLK为XT2
TACTL=TASSEL_1+TACLR; //定时器A,时钟源:ACLK,连续计数模式
}
void countbegin(unsigned char doit) //控制计数运行或者停止 doit==0:停止;doit==100:运行;其他:什么都不做
{
if(doit==0)
{
TACTL &= ~MC1; //关闭计数器
}
else if(doit==100)
{
TACTL |= MC_2+TACLR; //打开计数器
}
}
void initport() //端口初始化
{
//P1DIR=0x00; //P1.7 1.6 1.5为输入
P1IE=0xe0; //P1.7 1.6 1.5中断允许
P1IES=0x00; //上升沿触发
P1IFG=0; //中断标志清除,对于多源中断必须先清中断标志再打开中断
_EINT(); //总中断允许
}
void main(void)
{
double a,b,c,d12,d32,theta,r1;
WDTCTL = WDTPW + WDTHOLD;
initcount();
initport();
countbegin(100);
while(1) //等待中断
{
if(i==3)
{
d12=(t1-t2)/8000000*340;
d32=(t3-t2)/8000000*340;
a=d12*d12-1;
b=1-d32*d32;
c=(d32*d32-1)*d12+(1-d12*d12)*d32;
theta=asin(c/sqrt(a*a+b*b))-atan(a/b);
r1=(1-d32*d32)/(2*(cos(theta)+d32));
d32=r1*cos(theta);
d12=r1*sin(theta);
//计算坐标.d12--y,d32--x
t1=0;
t2=0;
t3=0;
i=0;//参数初始化,等待下一次蜂鸣信号
// 坐标无线发送
}
}
}
#pragma vector=PORT1_VECTOR
__interrupt void p1int(void)
{
if(i==0)
{
CCR0=0;
}
if((P1IFG&BIT5)==BIT5) //接收器1有信号
{
P1IFG&=~BIT5;//清除中断标志
t1=CCR0;//记录接收器1接收到的时刻
i++;//计数变量加1
}
if((P1IFG&BIT6)==BIT6) //接收器2有信号
{
P1IFG&=~BIT6;//清除中断标志
t2=CCR0;//记录接收器2接收到的时刻
i++;//计数变量加1
}
if((P1IFG&BIT7)==BIT7) //接收器3有信号
{
P1IFG&=~BIT7;//清除中断标志
t3=CCR0;//记录接收器3接收到的时刻
i++;//计数变量加1
}
}
|