![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Driving
Dependencies: FSR LIS3DH USBDevice mbed
Fork of MMA8452_Demo by
Diff: main.cpp
- Revision:
- 0:0c17274c3b7c
- Child:
- 1:e9981919b524
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 04 17:51:27 2014 +0000 @@ -0,0 +1,126 @@ +#include "mbed.h" +#include "MMA8452.h" + +DigitalOut myled(LED1); + +Serial pc(USBTX,USBRX); + +#define LOG(...) pc.printf(__VA_ARGS__); pc.printf("\r\n"); +#define LOGX(...) pc.printf(__VA_ARGS__); + +void printByte(char b) { + LOG("%d%d%d%d%d%d%d%d", + (b&0x80)>>7, + (b&0x40)>>6, + (b&0x20)>>5, + (b&0x10)>>4, + (b&0x08)>>3, + (b&0x04)>>2, + (b&0x02)>>1, + (b&0x01) + ); +} + +void sampleMMA8452(MMA8452 *acc, int nsamples) { + int samples = 0; + int bufLen = 6; + char buffer[6]; + memset(&buffer,0x00,bufLen); + while(samples<nsamples) { + if(!acc->isXYZReady()) { + wait(0.01); + continue; + } + memset(&buffer,0x00,bufLen); + acc->readRawXYZ(buffer); + LOGX("Sample %d of %d: ",samples,nsamples); + for(int i=0; i<bufLen; i++) { + LOGX("%.2x ",buffer[i]); + } + LOG(" "); + samples++; + } +} + +int test() { + MMA8452 acc(p28, p27, 40000); + + acc.debugRegister(MMA8452_CTRL_REG_1); + + LOG("Entering standby"); + if(acc.standby()) { + LOG("Error putting MMA8452 in standby"); + return false; + } + + acc.debugRegister(MMA8452_CTRL_REG_1); + + LOG("Activating MMA8452"); + if(acc.activate()) { + LOG("Error activating MMA8452"); + return false; + } + + // test setting dynamic range + MMA8452::DynamicRange setRange = MMA8452::DYNAMIC_RANGE_UNKNOWN; + MMA8452::DynamicRange readRange = MMA8452::DYNAMIC_RANGE_UNKNOWN; + for(int i=0; i<=(int)MMA8452::DYNAMIC_RANGE_8G; i++) { + setRange = (MMA8452::DynamicRange)i; + if(acc.setDynamicRange(setRange)) { + LOG("Error setting dynamic range. Failing."); + return false; + } + readRange = acc.getDynamicRange(); + if(readRange!=setRange) { + LOG("Read dynamic range: 0x%x does not match set: 0x%x",readRange,setRange); + return false; + } + LOG("Success on dynamic range %d",i); + } + + // test setting data rate + for(int i=0; i<=(int)MMA8452::RATE_1_563; i++) { + if(acc.setDataRate((MMA8452::DataRateHz)i)) { + LOG("Error setting data rate. Failing."); + return false; + } + if(acc.getDataRate()!=(MMA8452::DataRateHz)i) { + LOG("Read data rate: 0x%x does not match set: 0x%x",acc.getDataRate(),(MMA8452::DataRateHz)i); + return false; + } + LOG("Success on data rate %d",i); + } + + // set bit depth to 8 and read some values + LOG("Sampling at BIT_DEPTH_8"); + acc.setBitDepth(MMA8452::BIT_DEPTH_8); + sampleMMA8452(&acc,10); + + // set bit depth to 12 and read some values + LOG("Sampling at BIT_DEPTH_12"); + acc.setDataRate(MMA8452::RATE_100); + acc.setBitDepth(MMA8452::BIT_DEPTH_12); + sampleMMA8452(&acc,10); + + return true; +} + +void loop() { + while(1) { + wait(1); + } +} + +int main() { + pc.baud(115200); + LOG("Begin"); + for(int i=0; i<20; i++) { + LOG(" "); + } + if(!test()) { + LOG("FAIL."); + loop(); + } + LOG("Tests passed"); + loop(); +}