Driving
Dependencies: FSR LIS3DH USBDevice mbed
Fork of MMA8452_Demo by
main.cpp@0:0c17274c3b7c, 2014-03-04 (annotated)
- Committer:
- ashleymills
- Date:
- Tue Mar 04 17:51:27 2014 +0000
- Revision:
- 0:0c17274c3b7c
- Child:
- 1:e9981919b524
(Incomplete) test program for the MMA8452 accelerometer
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ashleymills | 0:0c17274c3b7c | 1 | #include "mbed.h" |
ashleymills | 0:0c17274c3b7c | 2 | #include "MMA8452.h" |
ashleymills | 0:0c17274c3b7c | 3 | |
ashleymills | 0:0c17274c3b7c | 4 | DigitalOut myled(LED1); |
ashleymills | 0:0c17274c3b7c | 5 | |
ashleymills | 0:0c17274c3b7c | 6 | Serial pc(USBTX,USBRX); |
ashleymills | 0:0c17274c3b7c | 7 | |
ashleymills | 0:0c17274c3b7c | 8 | #define LOG(...) pc.printf(__VA_ARGS__); pc.printf("\r\n"); |
ashleymills | 0:0c17274c3b7c | 9 | #define LOGX(...) pc.printf(__VA_ARGS__); |
ashleymills | 0:0c17274c3b7c | 10 | |
ashleymills | 0:0c17274c3b7c | 11 | void printByte(char b) { |
ashleymills | 0:0c17274c3b7c | 12 | LOG("%d%d%d%d%d%d%d%d", |
ashleymills | 0:0c17274c3b7c | 13 | (b&0x80)>>7, |
ashleymills | 0:0c17274c3b7c | 14 | (b&0x40)>>6, |
ashleymills | 0:0c17274c3b7c | 15 | (b&0x20)>>5, |
ashleymills | 0:0c17274c3b7c | 16 | (b&0x10)>>4, |
ashleymills | 0:0c17274c3b7c | 17 | (b&0x08)>>3, |
ashleymills | 0:0c17274c3b7c | 18 | (b&0x04)>>2, |
ashleymills | 0:0c17274c3b7c | 19 | (b&0x02)>>1, |
ashleymills | 0:0c17274c3b7c | 20 | (b&0x01) |
ashleymills | 0:0c17274c3b7c | 21 | ); |
ashleymills | 0:0c17274c3b7c | 22 | } |
ashleymills | 0:0c17274c3b7c | 23 | |
ashleymills | 0:0c17274c3b7c | 24 | void sampleMMA8452(MMA8452 *acc, int nsamples) { |
ashleymills | 0:0c17274c3b7c | 25 | int samples = 0; |
ashleymills | 0:0c17274c3b7c | 26 | int bufLen = 6; |
ashleymills | 0:0c17274c3b7c | 27 | char buffer[6]; |
ashleymills | 0:0c17274c3b7c | 28 | memset(&buffer,0x00,bufLen); |
ashleymills | 0:0c17274c3b7c | 29 | while(samples<nsamples) { |
ashleymills | 0:0c17274c3b7c | 30 | if(!acc->isXYZReady()) { |
ashleymills | 0:0c17274c3b7c | 31 | wait(0.01); |
ashleymills | 0:0c17274c3b7c | 32 | continue; |
ashleymills | 0:0c17274c3b7c | 33 | } |
ashleymills | 0:0c17274c3b7c | 34 | memset(&buffer,0x00,bufLen); |
ashleymills | 0:0c17274c3b7c | 35 | acc->readRawXYZ(buffer); |
ashleymills | 0:0c17274c3b7c | 36 | LOGX("Sample %d of %d: ",samples,nsamples); |
ashleymills | 0:0c17274c3b7c | 37 | for(int i=0; i<bufLen; i++) { |
ashleymills | 0:0c17274c3b7c | 38 | LOGX("%.2x ",buffer[i]); |
ashleymills | 0:0c17274c3b7c | 39 | } |
ashleymills | 0:0c17274c3b7c | 40 | LOG(" "); |
ashleymills | 0:0c17274c3b7c | 41 | samples++; |
ashleymills | 0:0c17274c3b7c | 42 | } |
ashleymills | 0:0c17274c3b7c | 43 | } |
ashleymills | 0:0c17274c3b7c | 44 | |
ashleymills | 0:0c17274c3b7c | 45 | int test() { |
ashleymills | 0:0c17274c3b7c | 46 | MMA8452 acc(p28, p27, 40000); |
ashleymills | 0:0c17274c3b7c | 47 | |
ashleymills | 0:0c17274c3b7c | 48 | acc.debugRegister(MMA8452_CTRL_REG_1); |
ashleymills | 0:0c17274c3b7c | 49 | |
ashleymills | 0:0c17274c3b7c | 50 | LOG("Entering standby"); |
ashleymills | 0:0c17274c3b7c | 51 | if(acc.standby()) { |
ashleymills | 0:0c17274c3b7c | 52 | LOG("Error putting MMA8452 in standby"); |
ashleymills | 0:0c17274c3b7c | 53 | return false; |
ashleymills | 0:0c17274c3b7c | 54 | } |
ashleymills | 0:0c17274c3b7c | 55 | |
ashleymills | 0:0c17274c3b7c | 56 | acc.debugRegister(MMA8452_CTRL_REG_1); |
ashleymills | 0:0c17274c3b7c | 57 | |
ashleymills | 0:0c17274c3b7c | 58 | LOG("Activating MMA8452"); |
ashleymills | 0:0c17274c3b7c | 59 | if(acc.activate()) { |
ashleymills | 0:0c17274c3b7c | 60 | LOG("Error activating MMA8452"); |
ashleymills | 0:0c17274c3b7c | 61 | return false; |
ashleymills | 0:0c17274c3b7c | 62 | } |
ashleymills | 0:0c17274c3b7c | 63 | |
ashleymills | 0:0c17274c3b7c | 64 | // test setting dynamic range |
ashleymills | 0:0c17274c3b7c | 65 | MMA8452::DynamicRange setRange = MMA8452::DYNAMIC_RANGE_UNKNOWN; |
ashleymills | 0:0c17274c3b7c | 66 | MMA8452::DynamicRange readRange = MMA8452::DYNAMIC_RANGE_UNKNOWN; |
ashleymills | 0:0c17274c3b7c | 67 | for(int i=0; i<=(int)MMA8452::DYNAMIC_RANGE_8G; i++) { |
ashleymills | 0:0c17274c3b7c | 68 | setRange = (MMA8452::DynamicRange)i; |
ashleymills | 0:0c17274c3b7c | 69 | if(acc.setDynamicRange(setRange)) { |
ashleymills | 0:0c17274c3b7c | 70 | LOG("Error setting dynamic range. Failing."); |
ashleymills | 0:0c17274c3b7c | 71 | return false; |
ashleymills | 0:0c17274c3b7c | 72 | } |
ashleymills | 0:0c17274c3b7c | 73 | readRange = acc.getDynamicRange(); |
ashleymills | 0:0c17274c3b7c | 74 | if(readRange!=setRange) { |
ashleymills | 0:0c17274c3b7c | 75 | LOG("Read dynamic range: 0x%x does not match set: 0x%x",readRange,setRange); |
ashleymills | 0:0c17274c3b7c | 76 | return false; |
ashleymills | 0:0c17274c3b7c | 77 | } |
ashleymills | 0:0c17274c3b7c | 78 | LOG("Success on dynamic range %d",i); |
ashleymills | 0:0c17274c3b7c | 79 | } |
ashleymills | 0:0c17274c3b7c | 80 | |
ashleymills | 0:0c17274c3b7c | 81 | // test setting data rate |
ashleymills | 0:0c17274c3b7c | 82 | for(int i=0; i<=(int)MMA8452::RATE_1_563; i++) { |
ashleymills | 0:0c17274c3b7c | 83 | if(acc.setDataRate((MMA8452::DataRateHz)i)) { |
ashleymills | 0:0c17274c3b7c | 84 | LOG("Error setting data rate. Failing."); |
ashleymills | 0:0c17274c3b7c | 85 | return false; |
ashleymills | 0:0c17274c3b7c | 86 | } |
ashleymills | 0:0c17274c3b7c | 87 | if(acc.getDataRate()!=(MMA8452::DataRateHz)i) { |
ashleymills | 0:0c17274c3b7c | 88 | LOG("Read data rate: 0x%x does not match set: 0x%x",acc.getDataRate(),(MMA8452::DataRateHz)i); |
ashleymills | 0:0c17274c3b7c | 89 | return false; |
ashleymills | 0:0c17274c3b7c | 90 | } |
ashleymills | 0:0c17274c3b7c | 91 | LOG("Success on data rate %d",i); |
ashleymills | 0:0c17274c3b7c | 92 | } |
ashleymills | 0:0c17274c3b7c | 93 | |
ashleymills | 0:0c17274c3b7c | 94 | // set bit depth to 8 and read some values |
ashleymills | 0:0c17274c3b7c | 95 | LOG("Sampling at BIT_DEPTH_8"); |
ashleymills | 0:0c17274c3b7c | 96 | acc.setBitDepth(MMA8452::BIT_DEPTH_8); |
ashleymills | 0:0c17274c3b7c | 97 | sampleMMA8452(&acc,10); |
ashleymills | 0:0c17274c3b7c | 98 | |
ashleymills | 0:0c17274c3b7c | 99 | // set bit depth to 12 and read some values |
ashleymills | 0:0c17274c3b7c | 100 | LOG("Sampling at BIT_DEPTH_12"); |
ashleymills | 0:0c17274c3b7c | 101 | acc.setDataRate(MMA8452::RATE_100); |
ashleymills | 0:0c17274c3b7c | 102 | acc.setBitDepth(MMA8452::BIT_DEPTH_12); |
ashleymills | 0:0c17274c3b7c | 103 | sampleMMA8452(&acc,10); |
ashleymills | 0:0c17274c3b7c | 104 | |
ashleymills | 0:0c17274c3b7c | 105 | return true; |
ashleymills | 0:0c17274c3b7c | 106 | } |
ashleymills | 0:0c17274c3b7c | 107 | |
ashleymills | 0:0c17274c3b7c | 108 | void loop() { |
ashleymills | 0:0c17274c3b7c | 109 | while(1) { |
ashleymills | 0:0c17274c3b7c | 110 | wait(1); |
ashleymills | 0:0c17274c3b7c | 111 | } |
ashleymills | 0:0c17274c3b7c | 112 | } |
ashleymills | 0:0c17274c3b7c | 113 | |
ashleymills | 0:0c17274c3b7c | 114 | int main() { |
ashleymills | 0:0c17274c3b7c | 115 | pc.baud(115200); |
ashleymills | 0:0c17274c3b7c | 116 | LOG("Begin"); |
ashleymills | 0:0c17274c3b7c | 117 | for(int i=0; i<20; i++) { |
ashleymills | 0:0c17274c3b7c | 118 | LOG(" "); |
ashleymills | 0:0c17274c3b7c | 119 | } |
ashleymills | 0:0c17274c3b7c | 120 | if(!test()) { |
ashleymills | 0:0c17274c3b7c | 121 | LOG("FAIL."); |
ashleymills | 0:0c17274c3b7c | 122 | loop(); |
ashleymills | 0:0c17274c3b7c | 123 | } |
ashleymills | 0:0c17274c3b7c | 124 | LOG("Tests passed"); |
ashleymills | 0:0c17274c3b7c | 125 | loop(); |
ashleymills | 0:0c17274c3b7c | 126 | } |