with Starboard Orange

Dependencies:   TextLCD mbed

Freescale MMA7660FC accelometer with Startboard Orange.
Please visit http://bird.dip.jp/mt/archives/2012/05/31/2240.html

/media/uploads/masato/mma7660fc.jpg

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?

UserRevisionLine numberNew 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 }