Hallo zusammen,
ich arbeite mit dem BMA150, der ähnlich ist zum BMA020. Den Sensor habe ich mit einem Robi von Conrad(PRO BOT 12
verbunden. Die Kommunikation zwischen den beiden Komponenten habe ich über die I2C Schnittstelle realisiert und ich programmiere auf der Plattform von Conrad mit Hilfe von C-Conrol (Programmiersprache ist Compact C, ähnlich zu C).
Eure Beiträge bzgl. dem Auslesen der Register hat mit gut geholfen. Es sollen die Beschleunigungen ausgelesen werden während mein Robi fährt.
Über Multithreads habe ich die beiden Programme verbunden, damit die zwei Programme nahe zu parallel ablaufen.
Der Robi fährt und ich bekomme auch Werte ausgelesen, nur ändern diese sich nur im Werteberecih von +/- 1g.
Wie kann ich festlegen, ob ich mit 2g, 4g oder 8g arbeiten möchte? Laut BOSCH Datenblatt steht dazu das Register 14 (Bit 3 und 4) zur Verfügung.
Aber muss ich jetzt in das Register reinschreiben?
Hab euch mal mein Programm angefügt.
Grüße TJ
Code:
//Die Beschleunigungen in x,y und z Richtung sollen mithilfe des BMA150 und dem PRO BOT128 ausgelesen werden
void main(void)
{
word adresse;
adresse=0x02;
int x_long,y_long,z_long;
unsigned int x_short,y_short,z_short;
float x,y,z;
byte bma_r,bma_w;
bma_r=0x71;
bma_w=0x70;
PRO_BOT128_INIT();
I2C_Init(I2C_100kHz);
DRIVE_INIT();
Thread_Start(1,thread1);
Thread_Delay(10);
/* Thread_Start(2,thread2);
Thread_Delay(10);*/
do
{
I2C_Start();
I2C_Write(0x70);
I2C_Write(adresse);
I2C_Stop();
I2C_Start();
I2C_Write(0x71);
x_short=I2C_Read_ACK();
x_long=I2C_Read_ACK();
x_long=(((x_long)*4)*+(x_short/64));
if (x_long > 511)
{
x_long= (x_long - 511);
x_long= (511 - x_long);
x_long= (x_long*(-1));
x= (x_long * 0.00390625);
}
else
{
x= (x_long * 0.00390625);
}
y_short=I2C_Read_ACK();
y_long=I2C_Read_ACK();
y_long=(((y_long)*4)+(y_short/64));
if (y_long > 511)
{
y_long= (y_long - 511);
y_long= (511 - y_long);
y_long= (y_long*(-1));
y= (y_long * 0.00390625);
}
else
{
y= (y_long * 0.00390625);
}
z_short=I2C_Read_ACK();
z_long=I2C_Read_NACK();
z_long=(((z_long)*4)+(z_short/64));
if (z_long > 511)
{
z_long= (z_long - 511);
z_long= (511 - z_long);
z_long= (z_long*(-1));
z= (z_long *0.00390625);
}
else
{
z= (z_long *0.00390625);
}
I2C_Stop();
float str[4];
str[1]=x;
str[2]=y;
str[3]=z;
Str_Printf(str,"%1.2f",x);
Msg_WriteChar(97);
Msg_WriteChar(120);
Msg_WriteChar(61);
Msg_WriteText(str);
Msg_WriteChar(13);
Str_Printf(str,"%1.2f",y);
Msg_WriteChar(97);
Msg_WriteChar(121);
Msg_WriteChar(61);
Msg_WriteText(str);
Msg_WriteChar(13);
Str_Printf(str,"%1.2f",z);
Msg_WriteChar(97);
Msg_WriteChar(122);
Msg_WriteChar(61);
Msg_WriteText(str);
Msg_WriteChar(13);
Msg_WriteChar(13);
}while(1);
}
Lesezeichen