Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822 circular_buffer
main.cpp@7:e4f89c858e61, 2016-02-19 (annotated)
- Committer:
- agufal
- Date:
- Fri Feb 19 17:02:25 2016 +0000
- Revision:
- 7:e4f89c858e61
- Parent:
- 6:fa74a43cae81
- Child:
- 8:e7cafda76315
Ahora se parsean los datos recibidos en mg (de -8000 a 8000)
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| agufal | 6:fa74a43cae81 | 1 | /* |
| agufal | 6:fa74a43cae81 | 2 | * Esto es para la placa Xtrinsic-Sense Board de element14, mas |
| agufal | 6:fa74a43cae81 | 3 | * concretamente para el acelerometro MMA8491Q |
| agufal | 6:fa74a43cae81 | 4 | */ |
| agufal | 0:c123bc196680 | 5 | #include "mbed.h" |
| agufal | 0:c123bc196680 | 6 | |
| agufal | 0:c123bc196680 | 7 | I2C i2c(p30, p7); |
| agufal | 0:c123bc196680 | 8 | Serial pc(p9, p11); |
| agufal | 0:c123bc196680 | 9 | //LEDS |
| agufal | 0:c123bc196680 | 10 | DigitalOut led2(LED2); |
| agufal | 0:c123bc196680 | 11 | DigitalOut led1(LED1); |
| agufal | 0:c123bc196680 | 12 | DigitalOut led3(LED3); |
| agufal | 0:c123bc196680 | 13 | DigitalOut led4(LED4); |
| agufal | 0:c123bc196680 | 14 | |
| agufal | 5:d5dba5370918 | 15 | /***************************************************************************** |
| agufal | 5:d5dba5370918 | 16 | * El acelerometro tiene una maquina de estados basandose en enable |
| agufal | 5:d5dba5370918 | 17 | * Pagina 11 |
| agufal | 5:d5dba5370918 | 18 | * http://www.element14.com/community/servlet/JiveServlet/previewBody/54565-102-1-273580/Datasheet_MMA8491Q.pdf |
| agufal | 5:d5dba5370918 | 19 | *****************************************************************************/ |
| agufal | 4:a743917cd04c | 20 | DigitalOut EN(p16); |
| agufal | 4:a743917cd04c | 21 | |
| agufal | 4:a743917cd04c | 22 | /* |
| agufal | 5:d5dba5370918 | 23 | * Direccion del acelerometro: 0x55 << 1 = 0xAA |
| agufal | 4:a743917cd04c | 24 | * |
| agufal | 4:a743917cd04c | 25 | * Segun el datasheet los pasos son: |
| agufal | 4:a743917cd04c | 26 | * - Mandar un Start Condition, direccion 0x55 y bit de R/W a 0 para indicar escritura. El esclavo manda un ACK |
| agufal | 4:a743917cd04c | 27 | * - Transmitir la direccion del registro a leer. El esclavo manda un ACK |
| agufal | 4:a743917cd04c | 28 | * - Transmitir un Repeated Start Condition y luego "direccionar?" al acelerometro con bit de R/W a 1 (lectura del registro) |
| agufal | 4:a743917cd04c | 29 | * - El esclavo manda un ACK y transmite los datos del registro indicado |
| agufal | 5:d5dba5370918 | 30 | * - Transmitir un NACK y la señal de Stop |
| agufal | 5:d5dba5370918 | 31 | * |
| agufal | 5:d5dba5370918 | 32 | * Los rangos de datos para cada eje son: |
| agufal | 5:d5dba5370918 | 33 | * |
| agufal | 5:d5dba5370918 | 34 | * | Range ±8g |
| agufal | 5:d5dba5370918 | 35 | * 14-bit Data | (1 mg/count) |
| agufal | 5:d5dba5370918 | 36 | * ___________________|_______________ |
| agufal | 5:d5dba5370918 | 37 | * 01 1111 1111 1111 | +8.000g |
| agufal | 5:d5dba5370918 | 38 | * 01 1111 1111 1110 | +7.998g |
| agufal | 5:d5dba5370918 | 39 | * ... | ... |
| agufal | 5:d5dba5370918 | 40 | * 00 0000 0000 0000 | 0.000g |
| agufal | 5:d5dba5370918 | 41 | * 11 1111 1111 1111 | -0.001g |
| agufal | 5:d5dba5370918 | 42 | * ... | ... |
| agufal | 5:d5dba5370918 | 43 | * 10 0000 0000 0001 | -7.998g |
| agufal | 5:d5dba5370918 | 44 | * 10 0000 0000 0000 | -8.000g |
| agufal | 4:a743917cd04c | 45 | */ |
| agufal | 0:c123bc196680 | 46 | int main(){ |
| agufal | 0:c123bc196680 | 47 | |
| agufal | 7:e4f89c858e61 | 48 | const char ACCEL_ADDRESS = 0x55; |
| agufal | 4:a743917cd04c | 49 | |
| agufal | 6:fa74a43cae81 | 50 | char data_write[1]; |
| agufal | 4:a743917cd04c | 51 | char data_read[7]; |
| agufal | 4:a743917cd04c | 52 | |
| agufal | 4:a743917cd04c | 53 | data_read[0] = 0; |
| agufal | 4:a743917cd04c | 54 | data_read[1] = 0; |
| agufal | 4:a743917cd04c | 55 | data_read[2] = 0; |
| agufal | 4:a743917cd04c | 56 | data_read[3] = 0; |
| agufal | 4:a743917cd04c | 57 | data_read[4] = 0; |
| agufal | 4:a743917cd04c | 58 | data_read[5] = 0; |
| agufal | 6:fa74a43cae81 | 59 | data_read[6] = 0; |
| agufal | 0:c123bc196680 | 60 | |
| agufal | 0:c123bc196680 | 61 | led1 = 1; |
| agufal | 0:c123bc196680 | 62 | led2 = 1; |
| agufal | 0:c123bc196680 | 63 | led3 = 1; |
| agufal | 0:c123bc196680 | 64 | led4 = 1; |
| agufal | 0:c123bc196680 | 65 | |
| agufal | 4:a743917cd04c | 66 | i2c.frequency(100000); // Min: 0kHz, Max: 400kHz |
| agufal | 5:d5dba5370918 | 67 | |
| agufal | 4:a743917cd04c | 68 | EN = 0; // SHUTDOWN Mode |
| agufal | 4:a743917cd04c | 69 | wait(0.1); |
| Alexisfdi | 3:80ceedd5ffac | 70 | |
| Alexisfdi | 3:80ceedd5ffac | 71 | while(1){ |
| Alexisfdi | 3:80ceedd5ffac | 72 | |
| agufal | 4:a743917cd04c | 73 | pc.printf("-----------------------------------------\n"); |
| agufal | 4:a743917cd04c | 74 | |
| agufal | 4:a743917cd04c | 75 | EN = 1; // ACTIVE Mode -> STANDBY Mode |
| agufal | 4:a743917cd04c | 76 | |
| agufal | 5:d5dba5370918 | 77 | /***************************************************************************** |
| agufal | 5:d5dba5370918 | 78 | * Direccion del registro STATUS |
| agufal | 5:d5dba5370918 | 79 | * |
| agufal | 5:d5dba5370918 | 80 | * El registro status cambia diferentes bits para informar de si hay |
| agufal | 5:d5dba5370918 | 81 | * nuevos datos y estan disponibles (1 - Si, 0 - No): |
| agufal | 5:d5dba5370918 | 82 | * |
| agufal | 5:d5dba5370918 | 83 | * ZYXDR : Hay nuevos datos en alguno de los tres ejes |
| agufal | 5:d5dba5370918 | 84 | * ZDR : Hay datos para el eje Z |
| agufal | 5:d5dba5370918 | 85 | * YDR : Hay datos para el eje Y |
| agufal | 5:d5dba5370918 | 86 | * XDR : Hay datos para el eje X |
| agufal | 5:d5dba5370918 | 87 | * |
| agufal | 5:d5dba5370918 | 88 | * El formato del byte es: |
| agufal | 5:d5dba5370918 | 89 | * 0 0 0 0 ZYXDR ZDR YDR XDR |
| agufal | 5:d5dba5370918 | 90 | *****************************************************************************/ |
| agufal | 5:d5dba5370918 | 91 | data_write[0] = 0x00; |
| Alexisfdi | 3:80ceedd5ffac | 92 | |
| Alexisfdi | 3:80ceedd5ffac | 93 | i2c.start(); |
| Alexisfdi | 3:80ceedd5ffac | 94 | |
| agufal | 4:a743917cd04c | 95 | // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez. |
| agufal | 7:e4f89c858e61 | 96 | i2c.write(ACCEL_ADDRESS << 1, data_write, 1, true); |
| agufal | 4:a743917cd04c | 97 | |
| agufal | 7:e4f89c858e61 | 98 | i2c.read(ACCEL_ADDRESS << 1, data_read, 7, true); |
| Alexisfdi | 3:80ceedd5ffac | 99 | |
| Alexisfdi | 3:80ceedd5ffac | 100 | if(data_read[0] == 0) |
| Alexisfdi | 3:80ceedd5ffac | 101 | led1 = 0; |
| agufal | 4:a743917cd04c | 102 | else |
| agufal | 4:a743917cd04c | 103 | led1 = 1; |
| Alexisfdi | 3:80ceedd5ffac | 104 | |
| agufal | 7:e4f89c858e61 | 105 | //########### X ############# |
| agufal | 7:e4f89c858e61 | 106 | unsigned int ch0 = data_read[1]; |
| agufal | 7:e4f89c858e61 | 107 | ch0 = (ch0 << 6) | (data_read[2] >> 2); |
| Alexisfdi | 3:80ceedd5ffac | 108 | |
| agufal | 7:e4f89c858e61 | 109 | int x_l = ch0; // Necesitamos 32 bits |
| agufal | 7:e4f89c858e61 | 110 | if (x_l >= 0x2000) |
| agufal | 7:e4f89c858e61 | 111 | x_l -= 0x4000; |
| agufal | 7:e4f89c858e61 | 112 | |
| agufal | 7:e4f89c858e61 | 113 | long x = (1000 * x_l + 512) >> 10; |
| agufal | 7:e4f89c858e61 | 114 | |
| agufal | 7:e4f89c858e61 | 115 | pc.printf("X: "); |
| agufal | 4:a743917cd04c | 116 | |
| agufal | 7:e4f89c858e61 | 117 | /*if (x > 0x80000000){ |
| agufal | 7:e4f89c858e61 | 118 | pc.printf("-"); |
| agufal | 7:e4f89c858e61 | 119 | x = ~x + 1; |
| agufal | 7:e4f89c858e61 | 120 | } |
| Alexisfdi | 3:80ceedd5ffac | 121 | else |
| agufal | 7:e4f89c858e61 | 122 | pc.printf("+");*/ |
| agufal | 4:a743917cd04c | 123 | |
| agufal | 7:e4f89c858e61 | 124 | // Hola mantissa |
| agufal | 7:e4f89c858e61 | 125 | int r = x % 1000; |
| agufal | 7:e4f89c858e61 | 126 | char a = (char)(x / 1000); |
| agufal | 7:e4f89c858e61 | 127 | char b = (char)(r / 100); |
| agufal | 7:e4f89c858e61 | 128 | r %= 100; |
| agufal | 7:e4f89c858e61 | 129 | char c = (char)(r / 10); |
| agufal | 7:e4f89c858e61 | 130 | char d = (char)(r%10); |
| agufal | 7:e4f89c858e61 | 131 | |
| agufal | 7:e4f89c858e61 | 132 | pc.printf("dataread[1]: %x, dataread[2]: %x, x: %d\n", data_read[1], data_read[2], x); |
| Alexisfdi | 3:80ceedd5ffac | 133 | |
| agufal | 7:e4f89c858e61 | 134 | //########### Y ############# |
| agufal | 7:e4f89c858e61 | 135 | unsigned int ch1 = data_read[3]; |
| agufal | 7:e4f89c858e61 | 136 | ch1 = (ch1 << 6) | (data_read[4] >> 2); |
| agufal | 7:e4f89c858e61 | 137 | |
| agufal | 7:e4f89c858e61 | 138 | int y_l = ch1; |
| agufal | 7:e4f89c858e61 | 139 | if (y_l >= 0x2000) |
| agufal | 7:e4f89c858e61 | 140 | y_l -= 0x4000; |
| agufal | 7:e4f89c858e61 | 141 | |
| agufal | 7:e4f89c858e61 | 142 | long y = (1000 * y_l + 512) >> 10; |
| agufal | 7:e4f89c858e61 | 143 | |
| agufal | 7:e4f89c858e61 | 144 | pc.printf("Y: long: %d int %d ",sizeof(long),sizeof(int)); |
| agufal | 7:e4f89c858e61 | 145 | |
| agufal | 7:e4f89c858e61 | 146 | /* |
| agufal | 7:e4f89c858e61 | 147 | if (y > 0x80000000){ |
| agufal | 7:e4f89c858e61 | 148 | pc.printf("-"); |
| agufal | 7:e4f89c858e61 | 149 | y = ~y + 1; |
| agufal | 7:e4f89c858e61 | 150 | } |
| Alexisfdi | 3:80ceedd5ffac | 151 | else |
| agufal | 7:e4f89c858e61 | 152 | pc.printf("+"); |
| agufal | 7:e4f89c858e61 | 153 | */ |
| Alexisfdi | 3:80ceedd5ffac | 154 | |
| agufal | 7:e4f89c858e61 | 155 | // Hola mantissa |
| agufal | 7:e4f89c858e61 | 156 | r = y % 1000; |
| agufal | 7:e4f89c858e61 | 157 | a = (char)(y / 1000); |
| agufal | 7:e4f89c858e61 | 158 | b = (char)(r / 100); |
| agufal | 7:e4f89c858e61 | 159 | r %= 100; |
| agufal | 7:e4f89c858e61 | 160 | c = (char)(r / 10); |
| agufal | 7:e4f89c858e61 | 161 | d = (char)(r%10); |
| agufal | 7:e4f89c858e61 | 162 | |
| agufal | 7:e4f89c858e61 | 163 | pc.printf("yl %d y: %d\n", y_l, y); |
| agufal | 7:e4f89c858e61 | 164 | |
| agufal | 7:e4f89c858e61 | 165 | //########### Z ############# |
| agufal | 7:e4f89c858e61 | 166 | unsigned int ch2 = data_read[5]; |
| agufal | 7:e4f89c858e61 | 167 | ch2 = (ch2 << 6) | (data_read[6] >> 2); |
| agufal | 7:e4f89c858e61 | 168 | |
| agufal | 7:e4f89c858e61 | 169 | long z_l = ch2; |
| agufal | 7:e4f89c858e61 | 170 | if (z_l >= 0x2000) |
| agufal | 7:e4f89c858e61 | 171 | z_l -= 0x4000; |
| Alexisfdi | 3:80ceedd5ffac | 172 | |
| agufal | 7:e4f89c858e61 | 173 | long z = (1000 * z_l + 512) >> 10; |
| agufal | 7:e4f89c858e61 | 174 | |
| agufal | 7:e4f89c858e61 | 175 | pc.printf("Z: "); |
| agufal | 7:e4f89c858e61 | 176 | |
| agufal | 7:e4f89c858e61 | 177 | /* if (z > 0x80000000){ |
| agufal | 7:e4f89c858e61 | 178 | pc.printf("-"); |
| agufal | 7:e4f89c858e61 | 179 | z = ~z + 1; |
| agufal | 7:e4f89c858e61 | 180 | } |
| agufal | 7:e4f89c858e61 | 181 | else |
| agufal | 7:e4f89c858e61 | 182 | pc.printf("+");*/ |
| agufal | 7:e4f89c858e61 | 183 | |
| agufal | 7:e4f89c858e61 | 184 | // Hola mantissa |
| agufal | 7:e4f89c858e61 | 185 | r = z % 1000; |
| agufal | 7:e4f89c858e61 | 186 | a = (char)(z / 1000); |
| agufal | 7:e4f89c858e61 | 187 | b = (char)(r / 100); |
| agufal | 7:e4f89c858e61 | 188 | r %= 100; |
| agufal | 7:e4f89c858e61 | 189 | c = (char)(r / 10); |
| agufal | 7:e4f89c858e61 | 190 | d = (char)(r%10); |
| agufal | 7:e4f89c858e61 | 191 | |
| agufal | 7:e4f89c858e61 | 192 | pc.printf("dataread[5]: %x, dataread[6]: %x, z: %d\n", data_read[5], data_read[6], z); |
| agufal | 4:a743917cd04c | 193 | |
| agufal | 7:e4f89c858e61 | 194 | /* |
| agufal | 7:e4f89c858e61 | 195 | |
| agufal | 7:e4f89c858e61 | 196 | UNSIGNED CHAR |
| agufal | 7:e4f89c858e61 | 197 | |
| agufal | 7:e4f89c858e61 | 198 | HACER TODO SIN SIGNO Y LUEGO COMPROBAR EL BIT 14 PARA VER SI ES NEGATIVO |
| agufal | 7:e4f89c858e61 | 199 | SI ES NEGATIVO, HACER UNA OR CON FFFFFF |
| agufal | 7:e4f89c858e61 | 200 | |
| agufal | 7:e4f89c858e61 | 201 | EXTENDER SIGNO! |
| agufal | 7:e4f89c858e61 | 202 | |
| agufal | 7:e4f89c858e61 | 203 | Result = (1000 x data.DWord + 512) >> 10 |
| agufal | 7:e4f89c858e61 | 204 | 0x3FFF -0.001g |
| agufal | 7:e4f89c858e61 | 205 | 0x2001 -7.998g |
| agufal | 7:e4f89c858e61 | 206 | 0x2000 -8.000g |
| agufal | 7:e4f89c858e61 | 207 | |
| agufal | 7:e4f89c858e61 | 208 | 0x1FFF 8.000g |
| agufal | 7:e4f89c858e61 | 209 | 0x1FFE 7.998g |
| agufal | 7:e4f89c858e61 | 210 | 0x0000 0.000g |
| agufal | 7:e4f89c858e61 | 211 | |
| agufal | 7:e4f89c858e61 | 212 | */ |
| agufal | 7:e4f89c858e61 | 213 | |
| agufal | 4:a743917cd04c | 214 | i2c.read(0); // Enviamos un NACK (Espero) |
| Alexisfdi | 3:80ceedd5ffac | 215 | i2c.stop(); |
| Alexisfdi | 3:80ceedd5ffac | 216 | |
| agufal | 4:a743917cd04c | 217 | EN = 0; // SHUTDOWN Mode |
| agufal | 4:a743917cd04c | 218 | |
| agufal | 4:a743917cd04c | 219 | wait(0.1); |
| agufal | 5:d5dba5370918 | 220 | |
| Alexisfdi | 3:80ceedd5ffac | 221 | } |
| agufal | 0:c123bc196680 | 222 | } |
