Rodrigo Miguez / Mbed 2 deprecated i2c_acelerometro

Dependencies:   BLE_API mbed nRF51822 circular_buffer

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?

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