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@4:a743917cd04c, 2016-01-20 (annotated)
- Committer:
- agufal
- Date:
- Wed Jan 20 10:48:50 2016 +0000
- Revision:
- 4:a743917cd04c
- Parent:
- 3:80ceedd5ffac
- Child:
- 5:d5dba5370918
- Agregados comentarios; - Nos faltaba poner un digital out ENABLE para que empezara a recoger datos; - La direccion es 0xAA siempre, porque el read y el write hacen "address | 0/1"; - Organizada un poco la salida del usb; - Parece que funciona!!!
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| agufal | 0:c123bc196680 | 1 | #include "mbed.h" |
| agufal | 0:c123bc196680 | 2 | |
| agufal | 0:c123bc196680 | 3 | I2C i2c(p30, p7); |
| agufal | 0:c123bc196680 | 4 | Serial pc(p9, p11); |
| agufal | 0:c123bc196680 | 5 | //LEDS |
| agufal | 0:c123bc196680 | 6 | DigitalOut led2(LED2); |
| agufal | 0:c123bc196680 | 7 | DigitalOut led1(LED1); |
| agufal | 0:c123bc196680 | 8 | DigitalOut led3(LED3); |
| agufal | 0:c123bc196680 | 9 | DigitalOut led4(LED4); |
| agufal | 0:c123bc196680 | 10 | |
| agufal | 4:a743917cd04c | 11 | DigitalOut EN(p16); |
| agufal | 4:a743917cd04c | 12 | |
| agufal | 4:a743917cd04c | 13 | /* |
| agufal | 4:a743917cd04c | 14 | * Direccion del acelerometro: 0x55 |
| agufal | 4:a743917cd04c | 15 | * Como la direccion ocupa 7 bits + bit de R/W, en teoria seria 0xAA o 0xAB, |
| agufal | 4:a743917cd04c | 16 | * pero no estamos seguros de si esa transformacion se hace directamente al |
| agufal | 4:a743917cd04c | 17 | * llamar a write() y read() o lo tenemos que poner nosotros a mano. |
| agufal | 4:a743917cd04c | 18 | * |
| agufal | 4:a743917cd04c | 19 | * Segun el datasheet los pasos son: |
| agufal | 4:a743917cd04c | 20 | * - Mandar un Start Condition, direccion 0x55 y bit de R/W a 0 para indicar escritura. El esclavo manda un ACK |
| agufal | 4:a743917cd04c | 21 | * - Transmitir la direccion del registro a leer. El esclavo manda un ACK |
| agufal | 4:a743917cd04c | 22 | * - Transmitir un Repeated Start Condition y luego "direccionar?" al acelerometro con bit de R/W a 1 (lectura del registro) |
| agufal | 4:a743917cd04c | 23 | * - El esclavo manda un ACK y transmite los datos del registro indicado |
| agufal | 4:a743917cd04c | 24 | * - Transmitir la señal de Stop |
| agufal | 4:a743917cd04c | 25 | */ |
| agufal | 0:c123bc196680 | 26 | int main(){ |
| agufal | 0:c123bc196680 | 27 | |
| agufal | 4:a743917cd04c | 28 | const char WRITE_ADDRESS = 0xAA; // 0xAA |
| agufal | 4:a743917cd04c | 29 | const char READ_ADDRESS = 0xAA; // 0xAB, 0x1D |
| agufal | 4:a743917cd04c | 30 | |
| agufal | 0:c123bc196680 | 31 | char data_write[2]; |
| agufal | 4:a743917cd04c | 32 | char data_read[7]; |
| agufal | 4:a743917cd04c | 33 | |
| agufal | 4:a743917cd04c | 34 | data_read[0] = 0; |
| agufal | 4:a743917cd04c | 35 | data_read[1] = 0; |
| agufal | 4:a743917cd04c | 36 | data_read[2] = 0; |
| agufal | 4:a743917cd04c | 37 | data_read[3] = 0; |
| agufal | 4:a743917cd04c | 38 | data_read[4] = 0; |
| agufal | 4:a743917cd04c | 39 | data_read[5] = 0; |
| agufal | 4:a743917cd04c | 40 | data_read[6] = 0; |
| agufal | 0:c123bc196680 | 41 | |
| agufal | 0:c123bc196680 | 42 | led1 = 1; |
| agufal | 0:c123bc196680 | 43 | led2 = 1; |
| agufal | 0:c123bc196680 | 44 | led3 = 1; |
| agufal | 0:c123bc196680 | 45 | led4 = 1; |
| agufal | 0:c123bc196680 | 46 | |
| agufal | 4:a743917cd04c | 47 | pc.printf("Starting\n"); |
| agufal | 4:a743917cd04c | 48 | |
| agufal | 4:a743917cd04c | 49 | i2c.frequency(100000); // Min: 0kHz, Max: 400kHz |
| agufal | 4:a743917cd04c | 50 | |
| agufal | 4:a743917cd04c | 51 | /* El acelerometro tiene una maquina de estados basandose en enable |
| agufal | 4:a743917cd04c | 52 | * Pagina 11 |
| agufal | 4:a743917cd04c | 53 | * http://www.element14.com/community/servlet/JiveServlet/previewBody/54565-102-1-273580/Datasheet_MMA8491Q.pdf |
| agufal | 4:a743917cd04c | 54 | */ |
| agufal | 4:a743917cd04c | 55 | EN = 0; // SHUTDOWN Mode |
| agufal | 4:a743917cd04c | 56 | wait(0.1); |
| Alexisfdi | 3:80ceedd5ffac | 57 | |
| Alexisfdi | 3:80ceedd5ffac | 58 | while(1){ |
| Alexisfdi | 3:80ceedd5ffac | 59 | |
| agufal | 4:a743917cd04c | 60 | pc.printf("-----------------------------------------\n"); |
| agufal | 4:a743917cd04c | 61 | |
| agufal | 4:a743917cd04c | 62 | EN = 1; // ACTIVE Mode -> STANDBY Mode |
| agufal | 4:a743917cd04c | 63 | |
| agufal | 4:a743917cd04c | 64 | data_write[0] = 0x00; // Direccion del registro STATUS |
| Alexisfdi | 3:80ceedd5ffac | 65 | |
| Alexisfdi | 3:80ceedd5ffac | 66 | i2c.start(); |
| Alexisfdi | 3:80ceedd5ffac | 67 | |
| agufal | 4:a743917cd04c | 68 | // Como con write ya mandamos la direccion, hacemos los dos primeros pasos a la vez. |
| agufal | 4:a743917cd04c | 69 | i2c.write(WRITE_ADDRESS, data_write, 1, true); |
| agufal | 4:a743917cd04c | 70 | |
| agufal | 4:a743917cd04c | 71 | i2c.read(READ_ADDRESS, data_read, 7, true); // El true indica repeated start condition |
| Alexisfdi | 3:80ceedd5ffac | 72 | |
| agufal | 4:a743917cd04c | 73 | pc.printf("Status: %i\n", data_read[0]); |
| Alexisfdi | 3:80ceedd5ffac | 74 | |
| Alexisfdi | 3:80ceedd5ffac | 75 | if(data_read[0] == 0) |
| Alexisfdi | 3:80ceedd5ffac | 76 | led1 = 0; |
| agufal | 4:a743917cd04c | 77 | else |
| agufal | 4:a743917cd04c | 78 | led1 = 1; |
| Alexisfdi | 3:80ceedd5ffac | 79 | |
| agufal | 4:a743917cd04c | 80 | // X |
| Alexisfdi | 3:80ceedd5ffac | 81 | int ch0 =(data_read[1] << 6) | data_read[2] >> 2; |
| Alexisfdi | 3:80ceedd5ffac | 82 | |
| agufal | 4:a743917cd04c | 83 | pc.printf("X: %i\n", ch0); |
| agufal | 4:a743917cd04c | 84 | |
| agufal | 4:a743917cd04c | 85 | if (ch0 < 0x00FF) |
| Alexisfdi | 3:80ceedd5ffac | 86 | led2 = 0; |
| Alexisfdi | 3:80ceedd5ffac | 87 | else |
| Alexisfdi | 3:80ceedd5ffac | 88 | led2 = 1; |
| Alexisfdi | 3:80ceedd5ffac | 89 | |
| agufal | 4:a743917cd04c | 90 | // Y |
| Alexisfdi | 3:80ceedd5ffac | 91 | int ch1 =(data_read[3] << 6) | data_read[4] >> 2; |
| agufal | 4:a743917cd04c | 92 | |
| agufal | 4:a743917cd04c | 93 | pc.printf("Y: %i\n", ch1); |
| Alexisfdi | 3:80ceedd5ffac | 94 | |
| agufal | 4:a743917cd04c | 95 | if(ch1 < 0x00FF) |
| Alexisfdi | 3:80ceedd5ffac | 96 | led3 = 0; |
| Alexisfdi | 3:80ceedd5ffac | 97 | else |
| Alexisfdi | 3:80ceedd5ffac | 98 | led3 = 1; |
| Alexisfdi | 3:80ceedd5ffac | 99 | |
| agufal | 4:a743917cd04c | 100 | // Z |
| Alexisfdi | 3:80ceedd5ffac | 101 | int ch2 =(data_read[5] << 6) | data_read[6] >> 2; |
| Alexisfdi | 3:80ceedd5ffac | 102 | |
| agufal | 4:a743917cd04c | 103 | pc.printf("Z: %i\n", ch2); |
| agufal | 4:a743917cd04c | 104 | |
| agufal | 4:a743917cd04c | 105 | if(ch2 < 0x00FF) |
| Alexisfdi | 3:80ceedd5ffac | 106 | led4 = 0; |
| Alexisfdi | 3:80ceedd5ffac | 107 | else |
| Alexisfdi | 3:80ceedd5ffac | 108 | led4 = 1; |
| Alexisfdi | 3:80ceedd5ffac | 109 | |
| Alexisfdi | 3:80ceedd5ffac | 110 | |
| agufal | 4:a743917cd04c | 111 | i2c.read(0); // Enviamos un NACK (Espero) |
| Alexisfdi | 3:80ceedd5ffac | 112 | i2c.stop(); |
| Alexisfdi | 3:80ceedd5ffac | 113 | |
| agufal | 4:a743917cd04c | 114 | EN = 0; // SHUTDOWN Mode |
| agufal | 4:a743917cd04c | 115 | |
| agufal | 4:a743917cd04c | 116 | wait(0.1); |
| Alexisfdi | 3:80ceedd5ffac | 117 | } |
| agufal | 2:96f52163ca48 | 118 | |
| Alexisfdi | 3:80ceedd5ffac | 119 | /*i2c.write(0xAA, data_write, 1); |
| agufal | 2:96f52163ca48 | 120 | |
| agufal | 2:96f52163ca48 | 121 | char data_read[7]; |
| agufal | 2:96f52163ca48 | 122 | i2c.read(0xAB, data_read, 7, true); |
| agufal | 2:96f52163ca48 | 123 | |
| agufal | 2:96f52163ca48 | 124 | if(data_read[0] == 0) |
| agufal | 2:96f52163ca48 | 125 | led1 = 0; |
| agufal | 0:c123bc196680 | 126 | |
| agufal | 2:96f52163ca48 | 127 | if(data_read[1] == 0) |
| agufal | 2:96f52163ca48 | 128 | led2 = 0; |
| agufal | 2:96f52163ca48 | 129 | |
| agufal | 2:96f52163ca48 | 130 | if(data_read[2] == 0) |
| agufal | 2:96f52163ca48 | 131 | led3 = 0; |
| agufal | 2:96f52163ca48 | 132 | |
| agufal | 2:96f52163ca48 | 133 | if(data_read[3] == 0) |
| agufal | 2:96f52163ca48 | 134 | led4 = 0; |
| agufal | 2:96f52163ca48 | 135 | |
| Alexisfdi | 3:80ceedd5ffac | 136 | i2c.stop();*/ |
| agufal | 2:96f52163ca48 | 137 | |
| agufal | 2:96f52163ca48 | 138 | //data_write[0] = 0x01; |
| agufal | 2:96f52163ca48 | 139 | //data_write[1] = 0x00; |
| agufal | 2:96f52163ca48 | 140 | //i2c.start(); |
| agufal | 2:96f52163ca48 | 141 | //int status = i2c.write(addr,data_write, 2); |
| agufal | 2:96f52163ca48 | 142 | |
| agufal | 2:96f52163ca48 | 143 | /*if (status != 0) { // Error |
| agufal | 0:c123bc196680 | 144 | while (1) { |
| agufal | 2:96f52163ca48 | 145 | |
| agufal | 0:c123bc196680 | 146 | } |
| agufal | 2:96f52163ca48 | 147 | } */ |
| agufal | 2:96f52163ca48 | 148 | |
| agufal | 2:96f52163ca48 | 149 | //bool haPasado = false; |
| agufal | 2:96f52163ca48 | 150 | |
| agufal | 2:96f52163ca48 | 151 | //i2c.frequency(200000); |
| agufal | 0:c123bc196680 | 152 | |
| agufal | 0:c123bc196680 | 153 | /*while(1){ |
| agufal | 2:96f52163ca48 | 154 | |
| agufal | 2:96f52163ca48 | 155 | i2c.start(); |
| agufal | 2:96f52163ca48 | 156 | |
| agufal | 2:96f52163ca48 | 157 | wait(0.5); |
| agufal | 2:96f52163ca48 | 158 | |
| agufal | 2:96f52163ca48 | 159 | int status = i2c.read(addr, data_read, 3); |
| agufal | 2:96f52163ca48 | 160 | |
| agufal | 2:96f52163ca48 | 161 | if (status == 0) |
| agufal | 2:96f52163ca48 | 162 | haPasado = true; |
| agufal | 2:96f52163ca48 | 163 | |
| agufal | 2:96f52163ca48 | 164 | if (!haPasado) |
| agufal | 2:96f52163ca48 | 165 | led4 = !led4; |
| agufal | 2:96f52163ca48 | 166 | |
| agufal | 2:96f52163ca48 | 167 | i2c.stop(); |
| agufal | 2:96f52163ca48 | 168 | |
| agufal | 2:96f52163ca48 | 169 | }*/ |
| agufal | 0:c123bc196680 | 170 | //i2c.start(); |
| agufal | 2:96f52163ca48 | 171 | /*data_write[0] = 0x00; |
| agufal | 0:c123bc196680 | 172 | i2c.write(addr, data_write, 1,1); |
| agufal | 0:c123bc196680 | 173 | |
| agufal | 0:c123bc196680 | 174 | i2c.read(addr, data_read, 2,0); |
| agufal | 0:c123bc196680 | 175 | |
| agufal | 0:c123bc196680 | 176 | int ch0 =(data_read[0]<<8) | data_read[1]; |
| agufal | 0:c123bc196680 | 177 | |
| agufal | 0:c123bc196680 | 178 | if (ch0 < 0x001FF){ |
| agufal | 0:c123bc196680 | 179 | |
| agufal | 0:c123bc196680 | 180 | led1 = 0; |
| agufal | 0:c123bc196680 | 181 | led2 = 1; |
| agufal | 0:c123bc196680 | 182 | led3 = 1; |
| agufal | 0:c123bc196680 | 183 | } |
| agufal | 0:c123bc196680 | 184 | else if (ch0 > 0x001FF && ch0 < 0x0FFF) { |
| agufal | 0:c123bc196680 | 185 | |
| agufal | 0:c123bc196680 | 186 | led1 = 1; |
| agufal | 0:c123bc196680 | 187 | led2 = 0; |
| agufal | 0:c123bc196680 | 188 | led3 = 1; |
| agufal | 0:c123bc196680 | 189 | |
| agufal | 0:c123bc196680 | 190 | } |
| agufal | 0:c123bc196680 | 191 | else { |
| agufal | 0:c123bc196680 | 192 | led1 = 1; |
| agufal | 0:c123bc196680 | 193 | led2 = 1; |
| agufal | 0:c123bc196680 | 194 | led3 = 0; |
| agufal | 0:c123bc196680 | 195 | } |
| agufal | 0:c123bc196680 | 196 | |
| agufal | 0:c123bc196680 | 197 | //pc.printf("channel 0: %x,%x \n", data_read[0], data_read[1]); |
| agufal | 0:c123bc196680 | 198 | |
| agufal | 0:c123bc196680 | 199 | wait(0.5); |
| agufal | 0:c123bc196680 | 200 | |
| agufal | 0:c123bc196680 | 201 | //i2c.stop(); |
| agufal | 0:c123bc196680 | 202 | } */ |
| agufal | 0:c123bc196680 | 203 | } |
