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