Driving

Dependencies:   FSR LIS3DH USBDevice mbed

Fork of MMA8452_Demo by Ivan Rush

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();
+}