#include<msp430x14x.h>
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
extern uchar sendstr(uchar sla,uchar suba,uchar s);
extern char resstr(uchar sla,uchar suba,int *s,uchar no);
uchar data[15];
uchar ADXL345_data[15];
int x_accel;
int y_accel;
int z_accel;
uchar x_accel_sign;
uchar y_accel_sign;
uchar z_accel_sign;
void ADXL345_init()
{
sendstr(0xA6,0x31,0x0B);
sendstr(0xA6,0x2D,0x08);
sendstr(0xA6,0x2E,0x80);
sendstr(0xA6,0x2C,0x0A);
sendstr(0xA6,0x2F,0x00);
}
void ADXL345_updata()
{
uchar j,sign[3],i;
int out,out1,out2;
int a[3];
int exc[3]={0x0010,-0x0003,-0x0003};
long float x[3];
float angle[3];
for(j=0;j<3;j++)
{
resstr(0xA6,0x33+2*j,&out2,1); //读高字节
resstr(0xA6,0x32+2*j,&out1,1); //读低字节
out=(out2<<8)+out1; //将高低字节合成一个数据
out=out-exc[j]; //偏移校准
a[j]=out;
if(out<0)
{
out=~out+1; //将补码恢复成原码
sign[j]=1; //加速度分量符号
}
else sign[j]=0; //
x[j]=out; //将数据放入加速度分量
}
angle[0]=x[0]/sqrt(x[2]*x[2]+x[1]*x[1]); //通过各轴上的分量,求角度
angle[0]=atan(angle[0])*180/3.1416;
angle[1]=x[1]/sqrt(x[2]*x[2]+x[0]*x[0]);
angle[1]=atan(angle[1])*180/3.1416;
angle[2]=x[2]/sqrt(x[1]*x[1]+x[0]*x[0]);
angle[2]=atan(angle[2])*180/3.1416;
x_accel=(int)(angle[0]+0.5);
y_accel=(int)(angle[1]+0.5);
z_accel=(int)(angle[2]+0.5);
x_accel_sign=sign[0];
y_accel_sign=sign[1];
z_accel_sign=sign[2];
if(z_accel_sign==1)
{
x_accel=180-x_accel;
/* if((x_accel_sign==1)&&(y_accel_sign==1))
{
x_accel=180-x_accel;
y_accel=180-y_accel;
}
if((x_accel_sign==1)&&(y_accel_sign==0))
{
x_accel=180-x_accel;
y_accel=180-y_accel;
}
if((x_accel_sign==0)&&(y_accel_sign==1))
{
x_accel=180-x_accel;
y_accel=180-y_accel;
}
if((x_accel_sign==0)&&(y_accel_sign==0))
{
x_accel=180-x_accel;
y_accel=180-y_accel;
}
*/
}
if(x_accel_sign)
ADXL345_data[0]='-';
else ADXL345_data[0]='+';
ADXL345_data[1]=(x_accel/100+'0');
ADXL345_data[2]=(x_accel%100/10+'0');
ADXL345_data[3]=(x_accel%10+'0');
ADXL345_data[4]=',';
if(y_accel_sign)
ADXL345_data[5]='-';
else ADXL345_data[5]='+';
ADXL345_data[6]=(y_accel/100+'0');
ADXL345_data[7]=(y_accel%100/10+'0');
ADXL345_data[8]=(y_accel%10+'0');
ADXL345_data[9]=',';
if(z_accel_sign)
ADXL345_data[10]='-';
else ADXL345_data[10]='+';
ADXL345_data[11]=(z_accel/100+'0');
ADXL345_data[12]=(z_accel%100/10+'0');
ADXL345_data[13]=(z_accel%10+'0');
ADXL345_data[14]=',';
for(i=4;i>0;i--)
{
if(((a[0]>>(4*(i-1)))&0x000F)>0x09) //A~F,转换成ISC码
data[4-i]=(((a[0]>>(4*(i-1)))&0x000F)-0x0A+'A');
else data[4-i]=(((a[0]>>(4*(i-1)))&0x000F)+'0'); //0~9转换成ISC码
}
data[4]=(',');
for(i=4;i>0;i--)
{
if(((a[1]>>(4*(i-1)))&0x000F)>0x09) //A~F,转换成ISC码
data[9-i]=(((a[1]>>(4*(i-1)))&0x000F)-0x0A+'A');
else data[9-i]=(((a[1]>>(4*(i-1)))&0x000F)+'0'); //0~9转换成ISC码
}
data[9]=(',');
for(i=4;i>0;i--)
{
if(((a[2]>>(4*(i-1)))&0x000F)>0x09) //A~F,转换成ISC码
data[14-i]=(((a[2]>>(4*(i-1)))&0x000F)-0x0A+'A');
else data[14-i]=(((a[2]>>(4*(i-1)))&0x000F)+'0'); //0~9转换成ISC码
}
data[14]=(',');
}