Hi,
I am interfacing MSP430F5529 with sensor breakout board LSM5DS0. When I am trying to print the serial data in serial monitor, It is nicely printed. But when I try to convert the raw data to a unit value and try to print it, nothing is coming up in the monitor. I am using energia platform. the raw value that can be printed is in integer format and the unit value that can't be printed is in float format.Can anybody explain what is happening actually: I am sharing my code here:
// Wire Master Reader
// by Nicholas Zambetti <http://www.zambetti.com>
// Demonstrates use of the Wire library
// Reads data from an I2C/TWI slave device
// Refer to the "Wire Slave Sender" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
#define LED RED_LED
#define xmAddress 0x1D
#define gAddress 0x6B
////////////////////////////
// LSM9DS0 Gyro Registers //
////////////////////////////
#define WHO_AM_I_G 0x0F
#define CTRL_REG1_G 0x20
#define CTRL_REG2_G 0x21
#define CTRL_REG3_G 0x22
#define CTRL_REG4_G 0x23
#define CTRL_REG5_G 0x24
#define REFERENCE_G 0x25
#define STATUS_REG_G 0x27
#define OUT_X_L_G 0x28
#define OUT_X_H_G 0x29
#define OUT_Y_L_G 0x2A
#define OUT_Y_H_G 0x2B
#define OUT_Z_L_G 0x2C
#define OUT_Z_H_G 0x2D
#define FIFO_CTRL_REG_G 0x2E
#define FIFO_SRC_REG_G 0x2F
#define INT1_CFG_G 0x30
#define INT1_SRC_G 0x31
#define INT1_THS_XH_G 0x32
#define INT1_THS_XL_G 0x33
#define INT1_THS_YH_G 0x34
#define INT1_THS_YL_G 0x35
#define INT1_THS_ZH_G 0x36
#define INT1_THS_ZL_G 0x37
#define INT1_DURATION_G 0x38
//////////////////////////////////////////
// LSM9DS0 Accel/Magneto (XM) Registers //
//////////////////////////////////////////
#define OUT_TEMP_L_XM 0x05
#define OUT_TEMP_H_XM 0x06
#define STATUS_REG_M 0x07
#define OUT_X_L_M 0x08
#define OUT_X_H_M 0x09
#define OUT_Y_L_M 0x0A
#define OUT_Y_H_M 0x0B
#define OUT_Z_L_M 0x0C
#define OUT_Z_H_M 0x0D
#define WHO_AM_I_XM 0x0F
#define INT_CTRL_REG_M 0x12
#define INT_SRC_REG_M 0x13
#define INT_THS_L_M 0x14
#define INT_THS_H_M 0x15
#define OFFSET_X_L_M 0x16
#define OFFSET_X_H_M 0x17
#define OFFSET_Y_L_M 0x18
#define OFFSET_Y_H_M 0x19
#define OFFSET_Z_L_M 0x1A
#define OFFSET_Z_H_M 0x1B
#define REFERENCE_X 0x1C
#define REFERENCE_Y 0x1D
#define REFERENCE_Z 0x1E
#define CTRL_REG0_XM 0x1F
#define CTRL_REG1_XM 0x20
#define CTRL_REG2_XM 0x21
#define CTRL_REG3_XM 0x22
#define CTRL_REG4_XM 0x23
#define CTRL_REG5_XM 0x24
#define CTRL_REG6_XM 0x25
#define CTRL_REG7_XM 0x26
#define STATUS_REG_A 0x27
#define OUT_X_L_A 0x28
#define OUT_X_H_A 0x29
#define OUT_Y_L_A 0x2A
#define OUT_Y_H_A 0x2B
#define OUT_Z_L_A 0x2C
#define OUT_Z_H_A 0x2D
#define FIFO_CTRL_REG 0x2E
#define FIFO_SRC_REG 0x2F
#define INT_GEN_1_REG 0x30
#define INT_GEN_1_SRC 0x31
#define INT_GEN_1_THS 0x32
#define INT_GEN_1_DURATION 0x33
#define INT_GEN_2_REG 0x34
#define INT_GEN_2_SRC 0x35
#define INT_GEN_2_THS 0x36
#define INT_GEN_2_DURATION 0x37
#define CLICK_CFG 0x38
#define CLICK_SRC 0x39
#define CLICK_THS 0x3A
#define TIME_LIMIT 0x3B
#define TIME_LATENCY 0x3C
#define TIME_WINDOW 0x3D
#define ACT_THS 0x3E
#define ACT_DUR 0x3F
#define gODR 0xF
#include <Wire.h>
float mRes;
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(115200); // start serial for output
}
void loop()
{
readMag();
delay(100);
}
int I2CreadByte(uint8_t address, uint8_t subAddress)
{
uint8_t data;
Wire.beginTransmission(address);
Wire.write(subAddress);
Wire.endTransmission(false);
Wire.requestFrom(address, (uint8_t)1);
while (Wire.available() < 1); // Wait until data becomes available
data = Wire.read(); // Read register data into `data` variable
Wire.endTransmission(); // End I2C transmission
return data;
}
void I2CreadBytes(uint8_t address, uint8_t subAddress, uint8_t * dest,
uint8_t count)
{
// Begin I2C transmission and send device address
Wire.beginTransmission(address);
// Next send the register to be read. OR with 0x80 to indicate multi-read.
Wire.write(subAddress | 0x80);
// End write, but send a restart to keep connection alive:
Wire.endTransmission(false);
// Request `count` bytes of data from the device
Wire.requestFrom(address, count);
// Wait until the data has been read in
while (Wire.available() < count);
// Store all `count` bytes into the given destination array.
for (int i=0; i<count ;i++)
dest[i] = Wire.read();
// End I2C Transmission
Wire.endTransmission();
}
void I2CwriteByte(uint8_t address, uint8_t subAddress, uint8_t data)
{
Wire.beginTransmission(address);
Wire.write(subAddress); // Write register to be written to
Wire.write(data); // Transmit byte to write
Wire.endTransmission(); // End I2C transmission
}
void dev_init()
{
calcmRes(); // Calculate Gs / ADC tick, stored in mRes variable
}
void calcgRes()
{
float gRes = 2000.0 / 32768.0;
}
void calcmRes()
{
float mRes = 2.0 / 32768.0 ;
}
float calcMag(float mag)
{
// Return the mag raw reading times our pre-calculated Gs / (ADC tick):
return mRes * mag;
}
void xmWriteByte(uint8_t subAddress, uint8_t data)
{
I2CwriteByte(xmAddress, subAddress, data);
}
void readMag()
{
uint8_t temp[6]; // We'll read six bytes from the mag into temp
int16_t mx,my,mz;
// float q;
xmReadBytes(OUT_X_L_M, temp, 6); // Read 6 bytes, beginning at OUT_X_L_M
mx = (temp[1] << 8) | temp[0]; // Store x-axis values into mx
my = (temp[3] << 8) | temp[2]; // Store y-axis values into my
mz = (temp[5] << 8) | temp[4]; // Store z-axis values into mz
Serial.print("M: ");
Serial.print(mx);
Serial.print(" ");
Serial.print(my);
Serial.print(" ");
Serial.print(mz);
Serial.print(" ");
Serial.print("M: ");
Serial.print(calcMag((float)mx));
Serial.print(" ");
Serial.print(calcMag((float)my));
Serial.print(" ");
Serial.print(calcMag((float)mz));
Serial.print(" ");
}