Library for the MMA7660 triple axis accelerometer
Dependents: mbed_Shield_LCD_Accelerometer mbed_Shield_Accelerometer
Fork of MMA7660 by
MMA7660.cpp
- Committer:
- Sissors
- Date:
- 2012-10-14
- Revision:
- 0:7bc29a9ea016
- Child:
- 1:8997a1b348dd
File content as of revision 0:7bc29a9ea016:
#include "MMA7660.h" MMA7660::MMA7660(PinName sda, PinName scl, PinName interrupt) : _i2c(sda, scl) { _interrupt = interrupt; active = false; samplerate = 120; } //Since the MMA lacks a WHO_AM_I register, we can only check if there is a device that answers to the I2C address bool MMA7660::testConnection( void ) { if (_i2c.write(MMA7660_ADDRESS, NULL, 0) == 0 ) return true; else return false; } void MMA7660::setActive(bool state) { char modereg = read(MMA7660_MODE_R); modereg &= ~(1<<0); //If it somehow was in testmode, disable that if (modereg && (1<<2)) { modereg &= ~(1<<2); write(MMA7660_MODE_R, modereg); } modereg += state; write(MMA7660_MODE_R, modereg); } //Add timeout! void MMA7660::readData(int *data) { if (!active) { setActive(true); active = true; } char temp[3]; bool alert; do { alert = false; read(MMA7660_XOUT_R, temp, 3); for (int i = 0; i<3; i++) { if (temp[i] > 63) alert = true; if (temp[i] > 31) temp[i] += 128+64; data[i] = (signed char)temp[i]; } } while (alert); } void MMA7660::readData(float *data) { int intdata[3]; readData(intdata); for (int i = 0; i<3; i++) data[i] = intdata[i]/MMA7660_SENSITIVITY; } float MMA7660::getX( void ) { return getSingle(0); } float MMA7660::getY( void ) { return getSingle(1); } float MMA7660::getZ( void ) { return getSingle(2); } void MMA7660::write(char address, char data) { char temp[2]; temp[0]=address; temp[1]=data; _i2c.write(MMA7660_ADDRESS, temp, 2); } char MMA7660::read(char address) { char retval; _i2c.write(MMA7660_ADDRESS, &address, 1, true); _i2c.read(MMA7660_ADDRESS, &retval, 1); return retval; } void MMA7660::read(char address, char *data, int length) { _i2c.write(MMA7660_ADDRESS, &address, 1, true); _i2c.read(MMA7660_ADDRESS, data, length); } float MMA7660::getSingle( int number ) { if (!active) { setActive(true); active = true; } signed char temp; bool alert; do { alert = false; temp = read(MMA7660_XOUT_R + number); if (temp > 63) alert = true; if (temp > 31) temp += 128+64; } while (alert); return temp / MMA7660_SENSITIVITY; }