Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 2:aea5caec809c, committed 2011-04-12
- Comitter:
- shimniok
- Date:
- Tue Apr 12 18:21:44 2011 +0000
- Parent:
- 1:48d83c63d1d9
- Commit message:
- Added option to set I2C frequency, disabled IRQ during write/read of mag/acc registers due to apparent conflicts with interrupts during testing
Changed in this revision
| LSM303DLH.cpp | Show annotated file Show diff for this revision Revisions of this file |
| LSM303DLH.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 48d83c63d1d9 -r aea5caec809c LSM303DLH.cpp
--- a/LSM303DLH.cpp Fri Apr 08 07:29:51 2011 +0000
+++ b/LSM303DLH.cpp Tue Apr 12 18:21:44 2011 +0000
@@ -69,18 +69,26 @@
bool LSM303DLH::read_reg(int addr_i2c,int addr_reg, char *v)
{
char data = addr_reg;
- if ((LSM303DLH::_compass.write(addr_i2c, &data, 1) == 0) && (LSM303DLH::_compass.read(addr_i2c, &data, 1) == 0)){
+ bool result = false;
+
+ __disable_irq();
+ if ((_compass.write(addr_i2c, &data, 1) == 0) && (_compass.read(addr_i2c, &data, 1) == 0)){
*v = data;
- return true;
+ result = true;
}
- return false;
+ __enable_irq();
+ return result;
}
bool LSM303DLH::read_reg_short(int addr_i2c,int addr_reg, short *v)
{
char *pv = (char *)v;
- read_reg(addr_i2c,addr_reg+0,pv+1);
- return read_reg(addr_i2c,addr_reg+1,pv+0);
+ bool result;
+
+ result = read_reg(addr_i2c,addr_reg+0,pv+1);
+ result &= read_reg(addr_i2c,addr_reg+1,pv+0);
+
+ return result;
}
LSM303DLH::LSM303DLH(PinName sda, PinName scl):
@@ -134,13 +142,22 @@
{
short a_x, a_y, a_z;
short m_x, m_y, m_z;
+ //Timer t;
+ //int usec1, usec2;
+ //t.reset();
+ //t.start();
+
+ //usec1 = t.read_us();
read_reg_short(addr_acc, OUT_X_A, &a_x);
read_reg_short(addr_acc, OUT_Y_A, &a_y);
read_reg_short(addr_acc, OUT_Z_A, &a_z);
read_reg_short(addr_mag, OUT_X_M, &m_x);
read_reg_short(addr_mag, OUT_Y_M, &m_y);
read_reg_short(addr_mag, OUT_Z_M, &m_z);
+ //usec2 = t.read_us();
+
+ //if (debug) debug->printf("%d %d %d\n", usec1, usec2, usec2-usec1);
// Perform simple lowpass filtering
// Intended to stabilize heading despite
@@ -195,3 +212,8 @@
return heading;
}
+
+void LSM303DLH::frequency(int hz)
+{
+ _compass.frequency(hz);
+}
\ No newline at end of file
diff -r 48d83c63d1d9 -r aea5caec809c LSM303DLH.h
--- a/LSM303DLH.h Fri Apr 08 07:29:51 2011 +0000
+++ b/LSM303DLH.h Tue Apr 12 18:21:44 2011 +0000
@@ -63,7 +63,6 @@
*/
class LSM303DLH {
public:
-
/** Create a new interface for an LSM303DLH
*
* @param sda is the pin for the I2C SDA line
@@ -115,6 +114,12 @@
*/
float heading(vector from);
+ /** sets the I2C bus frequency
+ *
+ * @param frequency is the I2C bus/clock frequency, either standard (100000) or fast (400000)
+ */
+ void frequency(int hz);
+
private:
I2C _compass;
float _offset_x;