with Starboard Orange
Freescale MMA7660FC accelometer with Startboard Orange.
Please visit http://bird.dip.jp/mt/archives/2012/05/31/2240.html
main.cpp@2:4679f396cfdd, 2013-03-19 (annotated)
- Committer:
- masato
- Date:
- Tue Mar 19 12:40:17 2013 +0000
- Revision:
- 2:4679f396cfdd
- Parent:
- 1:dc5d150d4fa6
Freescale MMA7660 and Startboard Orange
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masato | 1:dc5d150d4fa6 | 1 | #include "mbed.h" |
masato | 1:dc5d150d4fa6 | 2 | #include "TextLCD.h" |
masato | 1:dc5d150d4fa6 | 3 | |
masato | 1:dc5d150d4fa6 | 4 | TextLCD lcd( p24, p26, p27, p28, p29, p30 ); // rs, e, d0-d3 |
masato | 1:dc5d150d4fa6 | 5 | |
masato | 1:dc5d150d4fa6 | 6 | #define USE_INTR 1 |
masato | 1:dc5d150d4fa6 | 7 | |
masato | 1:dc5d150d4fa6 | 8 | I2C i2c(p9, p10); // sda, scl |
masato | 1:dc5d150d4fa6 | 9 | #if USE_INTR |
masato | 1:dc5d150d4fa6 | 10 | InterruptIn orientationInt(p5); |
masato | 1:dc5d150d4fa6 | 11 | #else |
masato | 1:dc5d150d4fa6 | 12 | DigitalIn orientationInt(p5); |
masato | 1:dc5d150d4fa6 | 13 | #endif |
masato | 1:dc5d150d4fa6 | 14 | Serial pc(USBTX, USBRX); // tx, rx |
masato | 1:dc5d150d4fa6 | 15 | DigitalOut flash(LED4); |
masato | 1:dc5d150d4fa6 | 16 | |
masato | 1:dc5d150d4fa6 | 17 | const int MMA7660 = 0x4c; |
masato | 1:dc5d150d4fa6 | 18 | // define the I2C register address |
masato | 1:dc5d150d4fa6 | 19 | const char XOUT = 0x00; |
masato | 1:dc5d150d4fa6 | 20 | const char YOUT = 0x01; |
masato | 1:dc5d150d4fa6 | 21 | const char ZOUT = 0x02; |
masato | 1:dc5d150d4fa6 | 22 | const char TILT = 0x03; |
masato | 1:dc5d150d4fa6 | 23 | const char SRST = 0x04; |
masato | 1:dc5d150d4fa6 | 24 | const char SPCNT = 0x05; |
masato | 1:dc5d150d4fa6 | 25 | const char INTSU = 0x06; |
masato | 1:dc5d150d4fa6 | 26 | const char MODE = 0x07; |
masato | 1:dc5d150d4fa6 | 27 | const char SR = 0x08; |
masato | 1:dc5d150d4fa6 | 28 | const char PDET = 0x09; |
masato | 1:dc5d150d4fa6 | 29 | const char PD = 0x0A; |
masato | 1:dc5d150d4fa6 | 30 | |
masato | 1:dc5d150d4fa6 | 31 | void i2c_write(int addr, char *p, int n) { |
masato | 1:dc5d150d4fa6 | 32 | int i, r; |
masato | 2:4679f396cfdd | 33 | |
masato | 1:dc5d150d4fa6 | 34 | i2c.start(); |
masato | 1:dc5d150d4fa6 | 35 | r = i2c.write(addr << 1); // write mode |
masato | 1:dc5d150d4fa6 | 36 | for (i = 0; i < n; i++) { |
masato | 1:dc5d150d4fa6 | 37 | r = i2c.write((int)*p++); |
masato | 1:dc5d150d4fa6 | 38 | } |
masato | 1:dc5d150d4fa6 | 39 | i2c.stop(); |
masato | 1:dc5d150d4fa6 | 40 | // wait(0.1); |
masato | 1:dc5d150d4fa6 | 41 | } |
masato | 1:dc5d150d4fa6 | 42 | |
masato | 1:dc5d150d4fa6 | 43 | int i2c_read(int addr, int reg) { |
masato | 1:dc5d150d4fa6 | 44 | int r; |
masato | 2:4679f396cfdd | 45 | |
masato | 1:dc5d150d4fa6 | 46 | i2c.start(); |
masato | 1:dc5d150d4fa6 | 47 | r = i2c.write(addr << 1); // set read bit |
masato | 1:dc5d150d4fa6 | 48 | r = i2c.write(reg); |
masato | 1:dc5d150d4fa6 | 49 | i2c.start(); |
masato | 1:dc5d150d4fa6 | 50 | r = i2c.write((addr << 1) | 1); // set read bit |
masato | 1:dc5d150d4fa6 | 51 | r = i2c.read(0); // read the data with nack |
masato | 1:dc5d150d4fa6 | 52 | i2c.stop(); |
masato | 1:dc5d150d4fa6 | 53 | return r; |
masato | 1:dc5d150d4fa6 | 54 | } |
masato | 1:dc5d150d4fa6 | 55 | |
masato | 1:dc5d150d4fa6 | 56 | void configureMMA7760() { |
masato | 1:dc5d150d4fa6 | 57 | char cmd[4]; |
masato | 1:dc5d150d4fa6 | 58 | int r; |
masato | 1:dc5d150d4fa6 | 59 | |
masato | 1:dc5d150d4fa6 | 60 | // i2c.frequency(400000); |
masato | 1:dc5d150d4fa6 | 61 | // pc.printf("START\r\n"); |
masato | 1:dc5d150d4fa6 | 62 | cmd[0] = MODE; cmd[1] = 0x00; i2c_write(MMA7660, cmd, 2); // Standby Modes |
masato | 1:dc5d150d4fa6 | 63 | cmd[0] = SPCNT; cmd[1] = 0x00; i2c_write(MMA7660, cmd, 2); // No sleep count |
masato | 1:dc5d150d4fa6 | 64 | cmd[0] = INTSU; cmd[1] = 0x03; i2c_write(MMA7660, cmd, 2); // Configure GINT Interrupt |
masato | 1:dc5d150d4fa6 | 65 | cmd[0] = PDET; cmd[1] = 0xE0; i2c_write(MMA7660, cmd, 2); // No tap detection enabled |
masato | 1:dc5d150d4fa6 | 66 | cmd[0] = SR; cmd[1] = 0x34; i2c_write(MMA7660, cmd, 2); // 8 samples/s, TILT debounce filter = 2 |
masato | 1:dc5d150d4fa6 | 67 | cmd[0] = PD; cmd[1] = 0x00; i2c_write(MMA7660, cmd, 2); // No tap detection debounce count enabled |
masato | 1:dc5d150d4fa6 | 68 | cmd[0] = MODE; cmd[1] = 0x41; i2c_write(MMA7660, cmd, 2); // No tap detection debounce count enabled |
masato | 1:dc5d150d4fa6 | 69 | } |
masato | 1:dc5d150d4fa6 | 70 | |
masato | 1:dc5d150d4fa6 | 71 | int se(int r) { |
masato | 1:dc5d150d4fa6 | 72 | if (r & 0x20) return (int)(signed char)(r | 0xe0); |
masato | 1:dc5d150d4fa6 | 73 | else return r & 0x1f; |
masato | 1:dc5d150d4fa6 | 74 | } |
masato | 1:dc5d150d4fa6 | 75 | |
masato | 1:dc5d150d4fa6 | 76 | void orientation() { |
masato | 1:dc5d150d4fa6 | 77 | int r; |
masato | 1:dc5d150d4fa6 | 78 | |
masato | 1:dc5d150d4fa6 | 79 | r = i2c_read(MMA7660, TILT); |
masato | 1:dc5d150d4fa6 | 80 | // if (r) pc.printf("read error %02x\r\n", r); |
masato | 1:dc5d150d4fa6 | 81 | pc.printf("orientation %02x\r\n", r); |
masato | 1:dc5d150d4fa6 | 82 | |
masato | 1:dc5d150d4fa6 | 83 | if (r & 0x40) { |
masato | 1:dc5d150d4fa6 | 84 | pc.printf("Alert\r\n"); |
masato | 1:dc5d150d4fa6 | 85 | goto XYZ; |
masato | 1:dc5d150d4fa6 | 86 | } |
masato | 1:dc5d150d4fa6 | 87 | if (r & 0x80) { |
masato | 1:dc5d150d4fa6 | 88 | pc.printf("Shake\r\n"); |
masato | 1:dc5d150d4fa6 | 89 | } |
masato | 1:dc5d150d4fa6 | 90 | if (r & 0x20) { |
masato | 1:dc5d150d4fa6 | 91 | pc.printf("Tap\r\n"); |
masato | 1:dc5d150d4fa6 | 92 | } |
masato | 1:dc5d150d4fa6 | 93 | |
masato | 1:dc5d150d4fa6 | 94 | int PoLa = (r >> 2) & 0x07; |
masato | 1:dc5d150d4fa6 | 95 | int BaFro = r & 0x03; |
masato | 1:dc5d150d4fa6 | 96 | |
masato | 1:dc5d150d4fa6 | 97 | lcd.locate( 0, 0 ); |
masato | 1:dc5d150d4fa6 | 98 | switch (PoLa) { |
masato | 1:dc5d150d4fa6 | 99 | case 1: |
masato | 1:dc5d150d4fa6 | 100 | pc.printf("Left\r\n"); lcd.printf( "Left " ); break; |
masato | 1:dc5d150d4fa6 | 101 | case 2: |
masato | 1:dc5d150d4fa6 | 102 | pc.printf("Right\r\n"); lcd.printf( "Right" );break; |
masato | 1:dc5d150d4fa6 | 103 | case 5: |
masato | 1:dc5d150d4fa6 | 104 | pc.printf("Down\r\n"); lcd.printf( "Down " );break; |
masato | 1:dc5d150d4fa6 | 105 | case 6: |
masato | 1:dc5d150d4fa6 | 106 | pc.printf("Up\r\n"); lcd.printf( "Up " ); break; |
masato | 1:dc5d150d4fa6 | 107 | defaut: |
masato | 1:dc5d150d4fa6 | 108 | default: lcd.printf( " " ); break; |
masato | 1:dc5d150d4fa6 | 109 | } |
masato | 1:dc5d150d4fa6 | 110 | lcd.locate( 8, 0 ); |
masato | 1:dc5d150d4fa6 | 111 | switch (BaFro) { |
masato | 1:dc5d150d4fa6 | 112 | case 1: pc.printf("Front\r\n"); lcd.printf( "Front" );break; |
masato | 1:dc5d150d4fa6 | 113 | case 2: pc.printf("Back\r\n"); lcd.printf( "Back " );break; |
masato | 1:dc5d150d4fa6 | 114 | default: lcd.printf( " " ); break; |
masato | 1:dc5d150d4fa6 | 115 | } |
masato | 1:dc5d150d4fa6 | 116 | #if 1 |
masato | 1:dc5d150d4fa6 | 117 | XYZ: |
masato | 1:dc5d150d4fa6 | 118 | lcd.locate(0, 1); |
masato | 1:dc5d150d4fa6 | 119 | r = i2c_read(MMA7660, XOUT); |
masato | 1:dc5d150d4fa6 | 120 | if (r & 0x40) { lcd.printf(" "); } |
masato | 1:dc5d150d4fa6 | 121 | else { lcd.printf("%4d", se(r)); } |
masato | 1:dc5d150d4fa6 | 122 | |
masato | 1:dc5d150d4fa6 | 123 | // lcd.locate(4, 1); |
masato | 1:dc5d150d4fa6 | 124 | r = i2c_read(MMA7660, YOUT); |
masato | 1:dc5d150d4fa6 | 125 | if (r & 0x40) { lcd.printf(" "); } |
masato | 1:dc5d150d4fa6 | 126 | else { lcd.printf("%4d", se(r)); } |
masato | 1:dc5d150d4fa6 | 127 | |
masato | 1:dc5d150d4fa6 | 128 | // lcd.locate(8, 1); |
masato | 1:dc5d150d4fa6 | 129 | r = i2c_read(MMA7660, ZOUT); |
masato | 1:dc5d150d4fa6 | 130 | if (r & 0x40) { lcd.printf(" "); } |
masato | 1:dc5d150d4fa6 | 131 | else { lcd.printf("%4d", se(r)); } |
masato | 1:dc5d150d4fa6 | 132 | #endif |
masato | 1:dc5d150d4fa6 | 133 | } |
masato | 1:dc5d150d4fa6 | 134 | |
masato | 1:dc5d150d4fa6 | 135 | void intr() { |
masato | 1:dc5d150d4fa6 | 136 | char cmd[2]; |
masato | 1:dc5d150d4fa6 | 137 | pc.printf("int!\r\n"); |
masato | 1:dc5d150d4fa6 | 138 | orientation(); |
masato | 1:dc5d150d4fa6 | 139 | cmd[0] = MODE; cmd[1] = 0x00; i2c_write(MMA7660, cmd, 2); // Standby Modes |
masato | 1:dc5d150d4fa6 | 140 | cmd[0] = MODE; cmd[1] = 0x41; i2c_write(MMA7660, cmd, 2); // Standby Modes |
masato | 1:dc5d150d4fa6 | 141 | } |
masato | 1:dc5d150d4fa6 | 142 | |
masato | 1:dc5d150d4fa6 | 143 | int main() { |
masato | 1:dc5d150d4fa6 | 144 | int i; |
masato | 1:dc5d150d4fa6 | 145 | |
masato | 1:dc5d150d4fa6 | 146 | pc.baud(115200) ; |
masato | 1:dc5d150d4fa6 | 147 | pc.printf("MMA7760 test..\r\n") ; |
masato | 1:dc5d150d4fa6 | 148 | |
masato | 1:dc5d150d4fa6 | 149 | configureMMA7760(); |
masato | 1:dc5d150d4fa6 | 150 | |
masato | 1:dc5d150d4fa6 | 151 | lcd.locate( 0, 0 ); |
masato | 1:dc5d150d4fa6 | 152 | lcd.printf( "MMA7760: Ready" ); |
masato | 1:dc5d150d4fa6 | 153 | wait(1); |
masato | 1:dc5d150d4fa6 | 154 | lcd.cls(); |
masato | 1:dc5d150d4fa6 | 155 | // lcd.locate( 0, 0 ); |
masato | 1:dc5d150d4fa6 | 156 | orientation(); |
masato | 1:dc5d150d4fa6 | 157 | |
masato | 1:dc5d150d4fa6 | 158 | #if USE_INTR |
masato | 1:dc5d150d4fa6 | 159 | // orientation(); |
masato | 1:dc5d150d4fa6 | 160 | orientationInt.fall(&intr); |
masato | 1:dc5d150d4fa6 | 161 | i = 0; |
masato | 1:dc5d150d4fa6 | 162 | while (1) { |
masato | 1:dc5d150d4fa6 | 163 | // if (i == 0) orientation(); |
masato | 1:dc5d150d4fa6 | 164 | flash = !flash; |
masato | 1:dc5d150d4fa6 | 165 | wait(0.5); |
masato | 1:dc5d150d4fa6 | 166 | i++; |
masato | 1:dc5d150d4fa6 | 167 | if (i > 10) i = 0; |
masato | 1:dc5d150d4fa6 | 168 | } |
masato | 1:dc5d150d4fa6 | 169 | #else |
masato | 1:dc5d150d4fa6 | 170 | while (1) { |
masato | 1:dc5d150d4fa6 | 171 | flash = !flash; |
masato | 1:dc5d150d4fa6 | 172 | orientation(); |
masato | 1:dc5d150d4fa6 | 173 | wait(5); |
masato | 1:dc5d150d4fa6 | 174 | } |
masato | 1:dc5d150d4fa6 | 175 | #endif |
masato | 0:8ab239852e4b | 176 | } |