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
Diff: main.cpp
- Revision:
- 4:a743917cd04c
- Parent:
- 3:80ceedd5ffac
- Child:
- 5:d5dba5370918
diff -r 80ceedd5ffac -r a743917cd04c main.cpp
--- a/main.cpp Mon Jan 18 16:26:04 2016 +0000
+++ b/main.cpp Wed Jan 20 10:48:50 2016 +0000
@@ -8,60 +8,112 @@
DigitalOut led3(LED3);
DigitalOut led4(LED4);
+DigitalOut EN(p16);
+
+/*
+ * Direccion del acelerometro: 0x55
+ * Como la direccion ocupa 7 bits + bit de R/W, en teoria seria 0xAA o 0xAB,
+ * pero no estamos seguros de si esa transformacion se hace directamente al
+ * llamar a write() y read() o lo tenemos que poner nosotros a mano.
+ *
+ * Segun el datasheet los pasos son:
+ * - Mandar un Start Condition, direccion 0x55 y bit de R/W a 0 para indicar escritura. El esclavo manda un ACK
+ * - Transmitir la direccion del registro a leer. El esclavo manda un ACK
+ * - Transmitir un Repeated Start Condition y luego "direccionar?" al acelerometro con bit de R/W a 1 (lectura del registro)
+ * - El esclavo manda un ACK y transmite los datos del registro indicado
+ * - Transmitir la señal de Stop
+ */
int main(){
+ const char WRITE_ADDRESS = 0xAA; // 0xAA
+ const char READ_ADDRESS = 0xAA; // 0xAB, 0x1D
+
char data_write[2];
+ char data_read[7];
+
+ data_read[0] = 0;
+ data_read[1] = 0;
+ data_read[2] = 0;
+ data_read[3] = 0;
+ data_read[4] = 0;
+ data_read[5] = 0;
+ data_read[6] = 0;
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 1;
- i2c.frequency(400000);
+ pc.printf("Starting\n");
+
+ i2c.frequency(100000); // Min: 0kHz, Max: 400kHz
+
+ /* El acelerometro tiene una maquina de estados basandose en enable
+ * Pagina 11
+ * http://www.element14.com/community/servlet/JiveServlet/previewBody/54565-102-1-273580/Datasheet_MMA8491Q.pdf
+ */
+ EN = 0; // SHUTDOWN Mode
+ wait(0.1);
while(1){
- data_write[0] = 0x00;
+ pc.printf("-----------------------------------------\n");
+
+ EN = 1; // ACTIVE Mode -> STANDBY Mode
+
+ data_write[0] = 0x00; // Direccion del registro STATUS
i2c.start();
- i2c.write(0xAB, data_write, 1);
+ // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez.
+ i2c.write(WRITE_ADDRESS, data_write, 1, true);
+
+ i2c.read(READ_ADDRESS, data_read, 7, true); // El true indica repeated start condition
- char data_read[7];
- i2c.read(0xAA, data_read, 7, true);
+ pc.printf("Status: %i\n", data_read[0]);
if(data_read[0] == 0)
led1 = 0;
+ else
+ led1 = 1;
+ // X
int ch0 =(data_read[1] << 6) | data_read[2] >> 2;
- if(ch0 < 0x00FF) //X
+ pc.printf("X: %i\n", ch0);
+
+ if (ch0 < 0x00FF)
led2 = 0;
else
led2 = 1;
+ // Y
int ch1 =(data_read[3] << 6) | data_read[4] >> 2;
+
+ pc.printf("Y: %i\n", ch1);
- if(ch1 < 0x00FF) //Y
+ if(ch1 < 0x00FF)
led3 = 0;
else
led3 = 1;
+ // Z
int ch2 =(data_read[5] << 6) | data_read[6] >> 2;
- if(ch2 < 0x00FF) //Z
+ pc.printf("Z: %i\n", ch2);
+
+ if(ch2 < 0x00FF)
led4 = 0;
else
led4 = 1;
- /*led1 = 1;
- led2 = 1;
- led3 = 1;
- led4 = 1;*/
+ i2c.read(0); // Enviamos un NACK (Espero)
i2c.stop();
- wait(0.2);
+ EN = 0; // SHUTDOWN Mode
+
+ wait(0.1);
}
/*i2c.write(0xAA, data_write, 1);
