Testing MMA7455L using SPI.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
espresso3389
Date:
Fri Jul 23 11:21:39 2010 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r d342154843ce main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jul 23 11:21:39 2010 +0000
@@ -0,0 +1,197 @@
+// Testing MMA7455L SPI
+#include "mbed.h"
+
+SPI spi(p5, p6, p7);
+DigitalOut cs(p19);
+InterruptIn int1(p15), int2(p16);
+Serial pc(USBTX, USBRX);
+DigitalOut led1(LED1), led2(LED2), led3(LED3);
+
+int read(int reg) {
+    cs = 0;
+    int v = spi.write(reg << 1);
+    cs = 1;
+    return v;
+}
+
+void write(int reg, int val) {
+    cs = 0;
+    spi.write(0x80 | (reg << 1));
+    spi.write(val);
+    cs = 1;
+}
+
+int read10(int reg) {
+    cs = 0;
+    int v = spi.write(reg << 1);
+    v |= spi.write((reg + 1) << 1) << 8;
+    
+    if(v & 0x200)
+        v = v - 1024;
+    
+    cs = 1;
+    return v;
+}
+
+int readSensorDirect(int sensor) {
+    return read10(sensor * 2);
+}
+
+const int SENSBUFSIZE = 100;
+int sensbuf[3][SENSBUFSIZE];
+int sens_ptr = 0;
+
+void reset()
+{
+    for(int i = 0; i < 3; i++)
+    {
+        int offset = readSensorDirect(i);
+        write(0x10 + i * 2, offset * 2);
+    }
+    memset(sensbuf, 0, sizeof(sensbuf));
+}
+
+void accumulate()
+{
+    for(int i = 0; i < 3; i++)
+        sensbuf[i][sens_ptr] = readSensorDirect(i);
+    sens_ptr++;
+    if(sens_ptr == SENSBUFSIZE)
+        sens_ptr = 0;
+}
+
+int readSensor(int sensor)
+{
+    int* buf = sensbuf[sensor];
+    int a = 0;
+    for(int i = 0; i < SENSBUFSIZE; i++)
+        a += buf[i];
+    return a;
+}
+
+void int1_raised() {
+    pc.printf("1\n");
+    //pc.printf("1: %06d,%06d,%06d\n", readX(), readY(), readZ());
+}
+
+void int2_raised() {
+    pc.printf("2\n");
+    //pc.printf("2: %06d,%06d,%06d\n", readX(), readY(), readZ());
+}
+
+const int INDSIZE = 5;
+const int FULLSIZE = INDSIZE * 2 + 1;
+
+void bar(char* ind, int v)
+{
+    memcpy(ind, "..........|.........." + (10 - INDSIZE), FULLSIZE);
+    if(v < 0)
+    {
+        char* p = ind + INDSIZE - 1;
+        for(int i = 0; i < INDSIZE; i++)
+        {
+            if(v) *p = '#';
+            p--;
+            v /= 5;
+        }
+    }
+    else
+    {
+        char* p = ind + INDSIZE + 1;
+        for(int i = 0; i < INDSIZE; i++)
+        {
+            if(v) *p = '#';
+            p++;
+            v /= 8;
+        }
+    }
+}
+
+int main() {
+
+    wait_ms(300);
+
+    spi.format(8, 0);
+    spi.frequency(1 * 1000* 1000);
+
+    // Device ID
+    read(0xf);
+    pc.printf("WHOAMI: %02X\n", read(0xf));
+
+    // $16: Mode Control Register
+    // 0x0: Standby Mode
+    // 0x1: Measurement Mode
+    // 0x2: Level Detection Mode
+    // 0x3: Pulse Detection
+    int mode = 0x2;
+
+    // 0x0: 8g
+    // 0x8: 4g
+    // 0x4: 2g
+    int glv = 0x0;
+
+    read(0x16);
+    write(0x16, glv | mode);
+    pc.printf("Mode Control Register: %02X\n", read(0x16));
+
+    // Optimal Settings for Freefall using Level Detection
+    // 1. THOPT=0 Absolute Condition
+    // 2. ZDA=0 Enable Z, YDA=0 Enable Y, XDA=0 Enable X
+    write(0x18, read(0x18) & 0x87);
+    // 3. Negative AND Logia Set LDPL
+    write(0x19, read(0x19) & 0x1);
+    // 4. Set Threshold = 1 g
+    write(0x1a, 0x10);
+    
+    /*
+    // Optimal Settings for Motion using Level Detection
+    // 1. THOPT=0 Absolute Condition
+    // 2. ZDA=1 Disable Z, YDA=0 Enable Y, XDA=0 Enable X
+    write(0x18, (read(0x18) & 0x87) | 0x20);
+    // 3. Positive OR Logic Clear LDPL
+    write(0x19, read(0x19) & 0xfe);
+    // Set Threshold to 2 g
+    write(0x1a, 0x20);
+    */
+
+    /*
+    // Optimal Settings for Single Pulse Detection
+    // 1. Positive OR Logic PDPL=0
+    write(0x19, read(0x19) & 0xfd);
+    // 2. X,Y,Z enabled
+    write(0x18, read(0x18) & 0x87);
+    // 3. PDTH (Pulse Threshold) set to 4 g
+    write(0x1b, 0x40);
+    // 4. PD (Pulse Duration) set to 8 ms
+    write(0x1c, 0x80);
+    */
+
+    int1.rise(int1_raised);
+    int2.rise(int2_raised);
+    
+    reset();
+    for(int i = 0;; i++)
+    {
+        wait_us(100);
+        accumulate();
+        
+        int x = readSensor(0);
+        int y = readSensor(1);
+        int z = readSensor(2);
+        led1 = x / 100;
+        led2 = y / 100;
+        led3 = z / 100;
+
+        if (i % 100 == 0)
+        {
+            char buf[FULLSIZE * 3 + 3];
+            memset(buf, ' ', FULLSIZE * 3 + 2);
+            buf[FULLSIZE * 3 + 2] = 0;
+            bar(buf, x);
+            bar(buf + FULLSIZE + 1, y);
+            bar(buf + (FULLSIZE + 1) * 2, z);
+        
+            pc.printf("P:%s\n", buf);
+        }
+    }
+}
diff -r 000000000000 -r d342154843ce mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Jul 23 11:21:39 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9114680c05da