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.
Fork of Codice_Lab2_I2C_Lab3_SPI by
Revision 1:944348c50dd6, committed 2015-01-15
- Comitter:
- capopolito
- Date:
- Thu Jan 15 21:45:52 2015 +0000
- Parent:
- 0:4317f4b1a4b3
- Child:
- 2:53521a18c3de
- Commit message:
- Lab 2 modificata da Marco e settate le impostazioni sul Free fall / motion detection sulla base dell' AN4070
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Jan 14 11:29:52 2015 +0000
+++ b/main.cpp Thu Jan 15 21:45:52 2015 +0000
@@ -41,11 +41,17 @@
//FREAD=1 // attiva modalità fast read, per campionare con 8bit ed avere risoluzione di 8 bit
//ACTIVE=0 // setta l'avccelerometro in standby per settare anche altri registri
+char FF_MT_CFG = 0x15; //registera addres del FF_MT_CFG (Frefall/Motionn Configuration register (Read/Write)
+char INT_SOURCE = 0x0C;// register adderess del INT_SOURCE ( System Interrupt Status Register)
+// if SRC_FF_MT=1 indicates that the frefall/motion function interrupt is active.
+// This bit is asserted whenever "EA" bit i the FF_MT_SRC register is asserted adn the FF_MT interrupt has
+// been enabled
+char FF_MT_SRC = 0x16; // register address del FF_MT_SRC (Frefall/Motion Source Register
int main(void)
{
-
+ printf("inizio \n");
//impostazione dei registri con scrittura Single Byte Write
// setta impostazioni su CTRL_REG_1
@@ -70,8 +76,16 @@
i2c.stop();
// setta impostazioni su CTRL_REG_3
- data=0x00; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
+ data=0x08; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
// vedi data-sheet
+ //Bit 7-> FIFO GATE = 0
+ //Bit 6-> WAKE_TRANS = 0
+ //Bit 5-> WAKE_LNDRPT = 0
+ //Bit 4-> WAKE_PULSE = 0
+ //Bit 3-> WAKE_FF_MT = 1 Frefall/Motion function interrupt can wake up !
+ //Bit 2-> don't care
+ //Bit 1-> IPOL = 0
+ //Bit 0-> PP_OD = 0
i2c.start(); // dai lo start
i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
i2c.write(CTRL_REG_3); // scrivi l'indirizzo del CTRL_REG_3
@@ -79,32 +93,32 @@
i2c.stop();
// setta impostazioni su CTRL_REG_4
- data=0x00; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
+ data=0x04; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
+ // vedi data-sheet
// vedi data-sheet
+ //Bit 7-> IN_EN_ASLP = 0 ; se = 1 Auto-SLEEP/WAKE interrupt enabled
+ //Bit 6-> INT_EN_FIFO = 0
+ //Bit 5-> INT_EN_TRANS = 0
+ //Bit 4-> INT_EN_LNDPRT = 0
+ //Bit 3-> INT_EN_PULSE = 0
+ //Bit 2-> INT_EN_FF_MT = 1 Freefall/Motion interrupt enabled
+ //Bit 1-> don't care = 0
+ //Bit 0-> INT_EN_DRDY = 0
i2c.start(); // dai lo start
i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
i2c.write(CTRL_REG_4); // scrivi l'indirizzo del CTRL_REG_4
i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_4
i2c.stop();
- // setta impostazioni su CTRL_REG_5
- data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt in modalità sleep
+ // setta impostazioni su CTRL_REG_5 (NON UTILIZZATO!)
+ data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin
// vedi data-sheet
i2c.start(); // dai lo start
i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5
i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5
i2c.stop();
-
- // setta impostazioni su CTRL_REG_5
- data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt in modalità sleep
- // vedi data-sheet
- i2c.start(); // dai lo start
- i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
- i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5
- i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5
- i2c.stop();
-
+
// setta impostazioni su XYZ_DATA_CFG
data=0x00; //imposta data con le impostazioni del XYZ_DATA_CFG attineti alla dinamica che si vuole acquisire (+-2g)
// FS1=FS0=0 imposta la dinamica +-2g
@@ -113,6 +127,23 @@
i2c.write(XYZ_DATA_CFG); // scrivi l'indirizzo del XYZ_DATA_CFG
i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG
i2c.stop();
+
+ // setta impostazioni su FF_MT_CFG (Frefall/Motion Configuration Register (Read/Write)
+ data=0xF8; //imposta data con le impostazioni del FF_MT_SRC attineti quando vogliamo svegliare il dispositivo dal wake
+ //Bit 7-> ELE = 1 ;event flag latch enabled in FF_MT_SRC
+ //Bit 6-> OAE = 1 ;Motion Flag (OR combination)
+ //Bit 5-> ZEFE = 1 ;se = 0 asse Z event dection disabled ; se = 1 asse X raise event flag on measured acceleration value beyond present threshold
+ //Bit 4-> YEFE = 1 ;se = 0 asse Y event dection disabled ; se = 1 asse Y raise event flag on measured acceleration value beyond present threshold
+ //Bit 3-> XEFE = 1 ;se = 0 asse X event dection disabled ; se = 1 asse X raise event flag on measured acceleration value beyond present threshold
+ //Bit 2-> = 0 don't care
+ //Bit 1-> = 0 don't care
+ //Bit 0-> = 0 don't care
+ i2c.start(); // dai lo start
+ i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+ i2c.write(FF_MT_CFG); // scrivi l'indirizzo del FF_MT_CFG
+ i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_CFG
+ i2c.stop();
+
//attiva il dispositivo (esce da standby)
// setta impostazioni su CTRL_REG_1
@@ -138,32 +169,107 @@
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
PwmOut rled(LED1);
PwmOut gled(LED2);
- PwmOut bled(LED3);
-
+ PwmOut bled(LED3);
+
+
printf("MMA8451 ID: %d\n", acc.getWhoAmI());
+
+ char stato_FF_MT_SRC = 0x00 ;
+ char stato_INT_SOURCE = 0x00 ;
float x_axis, y_axis, z_axis;
while (true) {
- // float x, y, z;
- // x = abs(acc.getAccX());
- // y = abs(acc.getAccY());
- // z = abs(acc.getAccZ());
+ printf("sono dentro il while \n");
+ //lettura del registro di stato FF_MT_SRC (read only)
+ //Bit 7-> EA = 1 one or more event flag has been asserted
+ //Bit 6-> don't care
+ //Bit 5-> ZHE
+ //Bit 4-> ZHP
+ //Bit 3-> YHE
+ //Bit 2-> YHP
+ //Bit 1-> XHE
+ //Bit 0-> XHP
+
+ //lettura del registro di stato INT_SOURCE (read only)
+ //Bit 7-> SRC_ASLP = 1 one or more event flag has been asserted
+ //Bit 6-> SRC_FIFO
+ //Bit 5-> SRC_TRANS
+ //Bit 4-> SRC_LNDPRT
+ //Bit 3-> SRC_PULSE
+ //Bit 2-> SRC_FF_MT
+ //Bit 1-> DONT'CARE
+ //Bit 0-> SRC_DRDY
+
+ //lettura single byte read
+ i2c.start();
+ i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+ i2c.write(INT_SOURCE); // scrivi l'indirizzo del registro
+ i2c.start();
+ i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+ stato_INT_SOURCE=i2c.read(0);
+ i2c.stop();
+ printf("stato_INT_SOURCE: %1.2d \n", stato_INT_SOURCE);
+ //lettura single byte read
+ i2c.start();
+ i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+ i2c.write(FF_MT_SRC); // scrivi l'indirizzo del registro
+ i2c.start();
+ i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+ stato_FF_MT_SRC=i2c.read(0);
+ i2c.stop();
+ printf("stato_FF_MT_SRC: %1.2d \n", stato_FF_MT_SRC);
+ //controllo sullo stato
+ // se il flag SRC_FF_MT==1 (bit 7) del registro INT_SOURCE
+ if (stato_INT_SOURCE &&0x04 == 0x04) {
+ printf("Buongiorno \n");
//lettura degli assi con lettura Multiple Byte Read
+ // i2c.start();
+ // i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+ // i2c.write(OUT_X_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
+ // i2c.start();
+ // i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+ // x_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
+ // y_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
+ // z_axis=i2c.read(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
+ // i2c.stop();
+
+ //lettura degli assi con lettura Single Byte Read
+ // asse x
i2c.start();
i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
i2c.write(OUT_X_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
i2c.start();
i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
- x_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
- y_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
- z_axis=i2c.read(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
+ x_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su x_axis
+ i2c.stop();
+ // asse y
+ i2c.start();
+ i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+ i2c.write(OUT_Y_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Y
+ i2c.start();
+ i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+ y_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su y_axis
i2c.stop();
-
+ // asse Z
+ i2c.start();
+ i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+ i2c.write(OUT_Z_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Z
+ i2c.start();
+ i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+ z_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su z_axis
+ i2c.stop();
+
+ //accendo led
rled = 1.0f - x_axis/256;
gled = 1.0f - y_axis/256;
bled = 1.0f - z_axis/256;
wait(0.1f);
- printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis, y_axis, z_axis);
+ //scrivo sulla seriale
+ printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/256, y_axis/256, z_axis/256);
+ }
+ else {
+ printf("sto ancora dormendo\n");
+ }
}
}
