Hi.
I have tried your solution.
This is now my code.
/*
Hovedprosjekt Universitetet i Agder 2010
Måling av bevegelser
Lese av verdier via multiplekser
Laget av: Kristoffer Gudmundsen
Master: Arduino Nano
Slave: LIS3LV02DL akselerometer
Bruker Wire.h biblioteket for å kommunisere via i2c.
*/
#include <Wire.h>
#define i2cID 0x1D
#define outXhigh 0x29
#define outYhigh 0x2B
#define outZhigh 0x2D
#define outXlow 0x28
#define outYlow 0x2A
#define outZlow 0x2C
int var = 0;
void setup()
{
Wire.begin(); // join i2c buss.
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
Serial.begin(9600);
Serial.println("Wire.begin");
Wire.beginTransmission(0x1D);
Wire.send(0x20); //Control register 1
Wire.send(0x87); // Power up device, enable all axis, don`t selftest.
Wire.endTransmission();
}
void loop()
{
byte z_val_l, z_val_h, y_val_l, y_val_h, x_val_l, x_val_h;
word x_val; // word = unsigned int.
word y_val; // word = unsigned int.
word z_val; // word = unsigned int.
var++;
byte tmp = (var % 3) + 1; // tmp will be 1, 2, or 3
Serial.println(var, DEC);
switch(tmp)
{
case 1:
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
sendWireMessage(outXlow); // we want low x value
if(Wire.available())
{
x_val_l = Wire.receive();
}
sendWireMessage(outXhigh); // we want high x value
if(Wire.available())
{
x_val_h = Wire.receive();
}
x_val = word(x_val_h, x_val_l);
delay(250);
sendWireMessage(outYlow); // we want low Y value
if(Wire.available())
{
y_val_l = Wire.receive();
}
sendWireMessage(outYhigh); // we want high Y value
if(Wire.available())
{
y_val_h = Wire.receive();
}
y_val = word(y_val_h, y_val_l);
delay(250);
sendWireMessage(outZlow); // we want low Z value
if(Wire.available())
{
z_val_l = Wire.receive();
}
sendWireMessage(outZhigh); // we want high Z value
if(Wire.available())
{
z_val_h = Wire.receive();
}
z_val = word(z_val_h, z_val_l); // high = 8 bit, low = 8 bit.
delay(250);
Serial.println("Accelerometer 1 ");
Serial.println(x_val);
Serial.println(y_val);
Serial.println(z_val);
break;
case 2:
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
sendWireMessage(outXlow); // we want low x value
if(Wire.available())
{
x_val_l = Wire.receive();
}
sendWireMessage(outXhigh); // we want high x value
if(Wire.available())
{
x_val_h = Wire.receive();
}
x_val = word(x_val_h, x_val_l);
delay(250);
sendWireMessage(outYlow); // we want low Y value
if(Wire.available())
{
y_val_l = Wire.receive();
}
sendWireMessage(outYhigh); // we want high Y value
if(Wire.available())
{
y_val_h = Wire.receive();
}
y_val = word(y_val_h, y_val_l);
delay(250);
sendWireMessage(outZlow); // we want low Z value
if(Wire.available())
{
z_val_l = Wire.receive();
}
sendWireMessage(outZhigh); // we want high Z value
if(Wire.available())
{
z_val_h = Wire.receive();
}
z_val = word(z_val_h, z_val_l); // high = 8 bit, low = 8 bit.
delay(250);
Serial.println("Accelerometer 2 ");
Serial.println(x_val);
Serial.println(y_val);
Serial.println(z_val);
break;
case 3:
Serial.println("accelerometer 3 ");
break;
default:
Serial.println("Default ");
break;
}
}
void sendWireMessage(byte message){
//digitalWrite(7, LOW);
//digitalWrite(8, HIGH);
Wire.beginTransmission(i2cID);
Wire.send(message);
Wire.endTransmission();
Wire.requestFrom(i2cID, 1);
}
The problem is that all the collected values are now all zeroes.
To me it seems that every time it goes down to this session
void sendWireMessage(byte message){
//digitalWrite(7, LOW);
//digitalWrite(8, HIGH);
Wire.beginTransmission(i2cID);
Wire.send(message);
Wire.endTransmission();
Wire.requestFrom(i2cID, 1);
}
it forgets to keep the pin 7&8 pins HIGH or LOW.
Any ideas? Maybe if I can make it remember the values of the pin, and then make an if/else test inside the "void sendWireMessage" process?
Kris.