
Fork of Lab3_latest_21_01_2015_aggiornata by
main.cpp@2:53521a18c3de, 2015-01-17 (annotated)
- Committer:
- capopolito
- Date:
- Sat Jan 17 09:27:25 2015 +0000
- Revision:
- 2:53521a18c3de
- Parent:
- 1:944348c50dd6
- Child:
- 3:f8f4a33c7aa2
Lab2_latest_version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
serenabpolito | 0:4317f4b1a4b3 | 1 | #include "mbed.h" |
serenabpolito | 0:4317f4b1a4b3 | 2 | #include "MMA8451Q.h" |
serenabpolito | 0:4317f4b1a4b3 | 3 | #include "I2C.h" |
serenabpolito | 0:4317f4b1a4b3 | 4 | |
serenabpolito | 0:4317f4b1a4b3 | 5 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
capopolito | 2:53521a18c3de | 6 | //PinName const INT1 = PTA14 ; //pin interrupt |
capopolito | 2:53521a18c3de | 7 | //PinName const INT2 = PTA15 ; //pin interrupt |
serenabpolito | 0:4317f4b1a4b3 | 8 | PinName const SDA = PTE25; |
serenabpolito | 0:4317f4b1a4b3 | 9 | PinName const SCL = PTE24; |
serenabpolito | 0:4317f4b1a4b3 | 10 | #elif defined (TARGET_KL05Z) |
serenabpolito | 0:4317f4b1a4b3 | 11 | PinName const SDA = PTB4; |
serenabpolito | 0:4317f4b1a4b3 | 12 | PinName const SCL = PTB3; |
serenabpolito | 0:4317f4b1a4b3 | 13 | #elif defined (TARGET_K20D50M) |
serenabpolito | 0:4317f4b1a4b3 | 14 | PinName const SDA = PTB1; |
serenabpolito | 0:4317f4b1a4b3 | 15 | PinName const SCL = PTB0; |
serenabpolito | 0:4317f4b1a4b3 | 16 | #else |
serenabpolito | 0:4317f4b1a4b3 | 17 | #error TARGET NOT DEFINED |
serenabpolito | 0:4317f4b1a4b3 | 18 | #endif |
serenabpolito | 0:4317f4b1a4b3 | 19 | |
serenabpolito | 0:4317f4b1a4b3 | 20 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
serenabpolito | 0:4317f4b1a4b3 | 21 | |
serenabpolito | 0:4317f4b1a4b3 | 22 | |
serenabpolito | 0:4317f4b1a4b3 | 23 | //instanzia e inizializza oggettto i2c della clase I2C |
serenabpolito | 0:4317f4b1a4b3 | 24 | I2C i2c(SDA,SCL); // SDA I2C data line pin |
serenabpolito | 0:4317f4b1a4b3 | 25 | // SCL I2C clock line pin |
serenabpolito | 0:4317f4b1a4b3 | 26 | |
serenabpolito | 0:4317f4b1a4b3 | 27 | |
capopolito | 2:53521a18c3de | 28 | char address_wr = 0x3A ; // byte per eseguire lettura: address_device + bit_wr(W=0) |
capopolito | 2:53521a18c3de | 29 | char address_rd = 0x3B ; // byte per eseguire scrittura: address_device + bit_rd(R=1) |
capopolito | 2:53521a18c3de | 30 | char CTRL_REG_1 = 0x2A ; //read/write // register address del CTRL_REG_1 |
capopolito | 2:53521a18c3de | 31 | char CTRL_REG_2 = 0x2B ; //read/write // register address del CTRL_REG_2 |
capopolito | 2:53521a18c3de | 32 | char CTRL_REG_3 = 0x2C ; //read/write // register address del CTRL_REG_3 |
capopolito | 2:53521a18c3de | 33 | char CTRL_REG_4 = 0x2D ; //read/write // register address del CTRL_REG_4 |
capopolito | 2:53521a18c3de | 34 | char CTRL_REG_5 = 0x2E ; //read/write // register address del CTRL_REG_5 |
capopolito | 2:53521a18c3de | 35 | char data = 0x00 ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1 |
capopolito | 2:53521a18c3de | 36 | char OUT_X_MSB = 0x01 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse x |
capopolito | 2:53521a18c3de | 37 | char OUT_Y_MSB = 0x03 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse y |
capopolito | 2:53521a18c3de | 38 | char OUT_Z_MSB = 0x05 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse z |
capopolito | 2:53521a18c3de | 39 | char XYZ_DATA_CFG = 0x0E; //read/write // register address del XYZ_DATA_CFG |
capopolito | 2:53521a18c3de | 40 | char FF_MT_CFG = 0x15; //read/write // registera addres del FF_MT_CFG (Frefall/Motionn Configuration register (Read/Write) |
capopolito | 2:53521a18c3de | 41 | char INT_SOURCE = 0x0C; //read only // register adderess del INT_SOURCE ( System Interrupt Status Register) |
capopolito | 2:53521a18c3de | 42 | char FF_MT_SRC = 0x16; //read only // register address del FF_MT_SRC (Frefall/Motion Source Register |
capopolito | 2:53521a18c3de | 43 | char ASLP_COUNT= 0x29; //read/write // register address SLEEP TIME-OUT COUNTER |
capopolito | 2:53521a18c3de | 44 | char WHO_AM_I = 0x0D; //read only // register address WHO_AM_I dice chi è ? |
capopolito | 2:53521a18c3de | 45 | char SYSMOD = 0x0B; //read only // register address SYSMOD System Mode Register |
serenabpolito | 0:4317f4b1a4b3 | 46 | |
serenabpolito | 0:4317f4b1a4b3 | 47 | int main(void) |
serenabpolito | 0:4317f4b1a4b3 | 48 | { |
capopolito | 1:944348c50dd6 | 49 | printf("inizio \n"); |
serenabpolito | 0:4317f4b1a4b3 | 50 | //impostazione dei registri con scrittura Single Byte Write |
serenabpolito | 0:4317f4b1a4b3 | 51 | |
serenabpolito | 0:4317f4b1a4b3 | 52 | // setta impostazioni su CTRL_REG_1 |
capopolito | 2:53521a18c3de | 53 | //data = 0x58 ; //->F_READ=0; acquisisco cmq un solo byte |
capopolito | 2:53521a18c3de | 54 | //data= 0x02;//solo F_READ=1; |
capopolito | 2:53521a18c3de | 55 | data = 0x5A ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1 |
capopolito | 2:53521a18c3de | 56 | //Bit 7-> ASLP_RATE1 = 0 |
capopolito | 2:53521a18c3de | 57 | //Bit 6-> ASLP_RATE0 = 1 -> // Il sample rate in sleep è 6.25 Hz vedi AN070 |
capopolito | 2:53521a18c3de | 58 | //Bit 5-> DR2 = 0 |
capopolito | 2:53521a18c3de | 59 | //Bit 4-> DR1 = 1 |
capopolito | 2:53521a18c3de | 60 | //Bit 3-> DR0 = 1 -> // Il sample rate in wake è 100 Hz vedi AN070 |
capopolito | 2:53521a18c3de | 61 | //Bit 2-> LNOISE = 0 |
capopolito | 2:53521a18c3de | 62 | //Bit 1-> F_READ = 1 -> //Faste read is enabled, acquissco un solo byte! |
capopolito | 2:53521a18c3de | 63 | //Bit 0-> ACTIVE = 0 -> //Mette il dispositivo in standby per settare gli altri registri |
serenabpolito | 0:4317f4b1a4b3 | 64 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 65 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 66 | i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1 |
serenabpolito | 0:4317f4b1a4b3 | 67 | i2c.write(data); // scrivi il "data" già inizializzato con le impostazioni del CTRL_REG_1 |
serenabpolito | 0:4317f4b1a4b3 | 68 | i2c.stop(); |
serenabpolito | 0:4317f4b1a4b3 | 69 | |
serenabpolito | 0:4317f4b1a4b3 | 70 | // setta impostazioni su CTRL_REG_2 |
serenabpolito | 0:4317f4b1a4b3 | 71 | data=0x04; //imposta data con le impostazioni del CTRL_REG_2 |
serenabpolito | 0:4317f4b1a4b3 | 72 | //ST=0 disabilita il self-test |
serenabpolito | 0:4317f4b1a4b3 | 73 | //RST=0 disabilita modalità reset |
serenabpolito | 0:4317f4b1a4b3 | 74 | //bit 5 don't care |
serenabpolito | 0:4317f4b1a4b3 | 75 | //SMODS0=SMODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in sleep |
capopolito | 2:53521a18c3de | 76 | //SLPE=1 abilita l'autosleep -> vedi AN070 |
serenabpolito | 0:4317f4b1a4b3 | 77 | //MODS0=MODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in active |
serenabpolito | 0:4317f4b1a4b3 | 78 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 79 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 80 | i2c.write(CTRL_REG_2); // scrivi l'indirizzo del CTRL_REG_2 |
serenabpolito | 0:4317f4b1a4b3 | 81 | i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_2 |
serenabpolito | 0:4317f4b1a4b3 | 82 | i2c.stop(); |
serenabpolito | 0:4317f4b1a4b3 | 83 | |
serenabpolito | 0:4317f4b1a4b3 | 84 | // setta impostazioni su CTRL_REG_3 |
capopolito | 2:53521a18c3de | 85 | //data=0x18; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep |
capopolito | 2:53521a18c3de | 86 | data=0x40; //imposta solo il wake_trans |
serenabpolito | 0:4317f4b1a4b3 | 87 | // vedi data-sheet |
capopolito | 1:944348c50dd6 | 88 | //Bit 7-> FIFO GATE = 0 |
capopolito | 2:53521a18c3de | 89 | //Bit 6-> WAKE_TRANS = 0 ->0 oppure a 1 non cambia! |
capopolito | 1:944348c50dd6 | 90 | //Bit 5-> WAKE_LNDRPT = 0 |
capopolito | 2:53521a18c3de | 91 | //Bit 4-> WAKE_PULSE = 1 |
capopolito | 2:53521a18c3de | 92 | //Bit 3-> WAKE_FF_MT = 1 (if=0disabled!) Frefall/Motion function interrupt can wake up ! |
capopolito | 1:944348c50dd6 | 93 | //Bit 2-> don't care |
capopolito | 1:944348c50dd6 | 94 | //Bit 1-> IPOL = 0 |
capopolito | 1:944348c50dd6 | 95 | //Bit 0-> PP_OD = 0 |
serenabpolito | 0:4317f4b1a4b3 | 96 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 97 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 98 | i2c.write(CTRL_REG_3); // scrivi l'indirizzo del CTRL_REG_3 |
serenabpolito | 0:4317f4b1a4b3 | 99 | i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_3 |
serenabpolito | 0:4317f4b1a4b3 | 100 | i2c.stop(); |
serenabpolito | 0:4317f4b1a4b3 | 101 | |
serenabpolito | 0:4317f4b1a4b3 | 102 | // setta impostazioni su CTRL_REG_4 |
capopolito | 2:53521a18c3de | 103 | //data=0x8C; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt |
capopolito | 2:53521a18c3de | 104 | data=0x80; // imposta solo l'Auto-SLEEP/WAKE interrupt |
capopolito | 1:944348c50dd6 | 105 | // vedi data-sheet |
capopolito | 2:53521a18c3de | 106 | //Bit 7-> IN_EN_ASLP = 1 ; se = 1 Auto-SLEEP/WAKE interrupt enabled -> vedi AN070 |
capopolito | 1:944348c50dd6 | 107 | //Bit 6-> INT_EN_FIFO = 0 |
capopolito | 1:944348c50dd6 | 108 | //Bit 5-> INT_EN_TRANS = 0 |
capopolito | 1:944348c50dd6 | 109 | //Bit 4-> INT_EN_LNDPRT = 0 |
capopolito | 2:53521a18c3de | 110 | //Bit 3-> INT_EN_PULSE = 1 Pulse interrupt enabled -> vedi AN070 |
capopolito | 2:53521a18c3de | 111 | //Bit 2-> INT_EN_FF_MT = 1 Freefall/Motion interrupt enabled -> vedi AN070 |
capopolito | 1:944348c50dd6 | 112 | //Bit 1-> don't care = 0 |
capopolito | 1:944348c50dd6 | 113 | //Bit 0-> INT_EN_DRDY = 0 |
serenabpolito | 0:4317f4b1a4b3 | 114 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 115 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 116 | i2c.write(CTRL_REG_4); // scrivi l'indirizzo del CTRL_REG_4 |
serenabpolito | 0:4317f4b1a4b3 | 117 | i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_4 |
serenabpolito | 0:4317f4b1a4b3 | 118 | i2c.stop(); |
serenabpolito | 0:4317f4b1a4b3 | 119 | |
capopolito | 2:53521a18c3de | 120 | // setta impostazioni su CTRL_REG_5 |
capopolito | 2:53521a18c3de | 121 | data=0x80; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin |
serenabpolito | 0:4317f4b1a4b3 | 122 | // vedi data-sheet |
capopolito | 2:53521a18c3de | 123 | //Bit 7-> INT_CFG_ASLP = 1 route the auto-sleep interrupt to INT1 ->vedi AN070 |
capopolito | 2:53521a18c3de | 124 | //Bit 6-> INT_CFG_FIFO = 0 |
capopolito | 2:53521a18c3de | 125 | //Bit 5-> INT_CFG_TRANS = 0 |
capopolito | 2:53521a18c3de | 126 | //Bit 4-> INT_CFG_LNDPRT = 0 |
capopolito | 2:53521a18c3de | 127 | //Bit 3-> INT_CFG_PULSE = 0 route the pulse interrupt to INT1 ->vedi AN070 |
capopolito | 2:53521a18c3de | 128 | //Bit 2-> INT_CFG_FF_MT = 0 route the Motion and Orientation interrupt to INT1 ->vedi AN070 |
capopolito | 2:53521a18c3de | 129 | //Bit 1-> DON'T CARE = 0 |
capopolito | 2:53521a18c3de | 130 | //Bit 0-> INT_CFG_DRDY = 0 |
serenabpolito | 0:4317f4b1a4b3 | 131 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 132 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 133 | i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5 |
serenabpolito | 0:4317f4b1a4b3 | 134 | i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5 |
serenabpolito | 0:4317f4b1a4b3 | 135 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 136 | |
serenabpolito | 0:4317f4b1a4b3 | 137 | // setta impostazioni su XYZ_DATA_CFG |
serenabpolito | 0:4317f4b1a4b3 | 138 | data=0x00; //imposta data con le impostazioni del XYZ_DATA_CFG attineti alla dinamica che si vuole acquisire (+-2g) |
serenabpolito | 0:4317f4b1a4b3 | 139 | // FS1=FS0=0 imposta la dinamica +-2g |
serenabpolito | 0:4317f4b1a4b3 | 140 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 141 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 142 | i2c.write(XYZ_DATA_CFG); // scrivi l'indirizzo del XYZ_DATA_CFG |
serenabpolito | 0:4317f4b1a4b3 | 143 | i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG |
serenabpolito | 0:4317f4b1a4b3 | 144 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 145 | |
capopolito | 1:944348c50dd6 | 146 | // setta impostazioni su FF_MT_CFG (Frefall/Motion Configuration Register (Read/Write) |
capopolito | 2:53521a18c3de | 147 | //data=0xF8; //imposta data con le impostazioni del FF_MT_SRC attineti quando vogliamo svegliare il dispositivo dal wake |
capopolito | 2:53521a18c3de | 148 | data=0x00; //non imposta nulla |
capopolito | 1:944348c50dd6 | 149 | //Bit 7-> ELE = 1 ;event flag latch enabled in FF_MT_SRC |
capopolito | 2:53521a18c3de | 150 | //Bit 6-> OAE = 0 ;Motion Flag (if=1 OR combination) (if=1 AND combination) |
capopolito | 1:944348c50dd6 | 151 | //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 |
capopolito | 1:944348c50dd6 | 152 | //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 |
capopolito | 1:944348c50dd6 | 153 | //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 |
capopolito | 1:944348c50dd6 | 154 | //Bit 2-> = 0 don't care |
capopolito | 1:944348c50dd6 | 155 | //Bit 1-> = 0 don't care |
capopolito | 1:944348c50dd6 | 156 | //Bit 0-> = 0 don't care |
capopolito | 1:944348c50dd6 | 157 | i2c.start(); // dai lo start |
capopolito | 1:944348c50dd6 | 158 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 1:944348c50dd6 | 159 | i2c.write(FF_MT_CFG); // scrivi l'indirizzo del FF_MT_CFG |
capopolito | 1:944348c50dd6 | 160 | i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_CFG |
capopolito | 1:944348c50dd6 | 161 | i2c.stop(); |
capopolito | 2:53521a18c3de | 162 | //setta impostazioni su ASLP_COUNT |
capopolito | 2:53521a18c3de | 163 | data=0xF0; //->impostato da me valore max |
capopolito | 2:53521a18c3de | 164 | //data=0x01; //impostato da me valore min |
capopolito | 2:53521a18c3de | 165 | //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!! |
capopolito | 2:53521a18c3de | 166 | i2c.start(); // dai lo start |
capopolito | 2:53521a18c3de | 167 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 168 | i2c.write(ASLP_COUNT); // scrivi l'indirizzo del ASLP_COUNT |
capopolito | 2:53521a18c3de | 169 | i2c.write(data); // scrivi il "data" contenete le impostazioni del ASLP_COUNT |
capopolito | 2:53521a18c3de | 170 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 171 | |
capopolito | 2:53521a18c3de | 172 | //!!! attiva il dispositivo (esce da standby) !!! |
serenabpolito | 0:4317f4b1a4b3 | 173 | // setta impostazioni su CTRL_REG_1 |
capopolito | 2:53521a18c3de | 174 | data=0x5B ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati) |
serenabpolito | 0:4317f4b1a4b3 | 175 | i2c.start(); // dai lo start |
serenabpolito | 0:4317f4b1a4b3 | 176 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 177 | i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1 |
serenabpolito | 0:4317f4b1a4b3 | 178 | i2c.write(data); // scrivi il "data" in le impostazioni del CTRL_REG_1 |
serenabpolito | 0:4317f4b1a4b3 | 179 | i2c.stop(); |
serenabpolito | 0:4317f4b1a4b3 | 180 | |
serenabpolito | 0:4317f4b1a4b3 | 181 | |
serenabpolito | 0:4317f4b1a4b3 | 182 | MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); |
serenabpolito | 0:4317f4b1a4b3 | 183 | PwmOut rled(LED1); |
serenabpolito | 0:4317f4b1a4b3 | 184 | PwmOut gled(LED2); |
capopolito | 1:944348c50dd6 | 185 | PwmOut bled(LED3); |
capopolito | 1:944348c50dd6 | 186 | |
capopolito | 2:53521a18c3de | 187 | |
capopolito | 2:53521a18c3de | 188 | char who_am_i = 0x00; |
capopolito | 2:53521a18c3de | 189 | //lettura single byte read del registro WHO_AM_I |
capopolito | 2:53521a18c3de | 190 | i2c.start(); |
capopolito | 2:53521a18c3de | 191 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 192 | i2c.write(WHO_AM_I); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 193 | i2c.start(); |
capopolito | 2:53521a18c3de | 194 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 195 | who_am_i=i2c.read(0); |
capopolito | 2:53521a18c3de | 196 | i2c.stop(); |
capopolito | 2:53521a18c3de | 197 | printf("mi chiamo: %1.2x \n", who_am_i); |
capopolito | 2:53521a18c3de | 198 | |
capopolito | 2:53521a18c3de | 199 | |
capopolito | 2:53521a18c3de | 200 | char ctrl_reg_1 = 0x00; |
capopolito | 2:53521a18c3de | 201 | //lettura single byte read del registro CTRL_REG_1 |
capopolito | 2:53521a18c3de | 202 | i2c.start(); |
capopolito | 2:53521a18c3de | 203 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 204 | i2c.write(CTRL_REG_1); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 205 | i2c.start(); |
capopolito | 2:53521a18c3de | 206 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 207 | ctrl_reg_1=i2c.read(0); |
capopolito | 2:53521a18c3de | 208 | i2c.stop(); |
capopolito | 2:53521a18c3de | 209 | printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1); |
capopolito | 2:53521a18c3de | 210 | |
capopolito | 2:53521a18c3de | 211 | char ctrl_reg_2 = 0x00; |
capopolito | 2:53521a18c3de | 212 | //lettura single byte read del registro CTRL_REG_2 |
capopolito | 2:53521a18c3de | 213 | i2c.start(); |
capopolito | 2:53521a18c3de | 214 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 215 | i2c.write(CTRL_REG_2); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 216 | i2c.start(); |
capopolito | 2:53521a18c3de | 217 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 218 | ctrl_reg_2=i2c.read(0); |
capopolito | 2:53521a18c3de | 219 | i2c.stop(); |
capopolito | 2:53521a18c3de | 220 | printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2); |
capopolito | 2:53521a18c3de | 221 | |
capopolito | 2:53521a18c3de | 222 | char ctrl_reg_3 = 0x00; |
capopolito | 2:53521a18c3de | 223 | //lettura single byte read del registro CTRL_REG_3 |
capopolito | 2:53521a18c3de | 224 | i2c.start(); |
capopolito | 2:53521a18c3de | 225 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 226 | i2c.write(CTRL_REG_3); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 227 | i2c.start(); |
capopolito | 2:53521a18c3de | 228 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 229 | ctrl_reg_3=i2c.read(0); |
capopolito | 2:53521a18c3de | 230 | i2c.stop(); |
capopolito | 2:53521a18c3de | 231 | printf("CTRL_REG_3: %1.2x \n", ctrl_reg_3); |
capopolito | 2:53521a18c3de | 232 | |
capopolito | 2:53521a18c3de | 233 | char ctrl_reg_4 = 0x00; |
capopolito | 2:53521a18c3de | 234 | //lettura single byte read del registro CTRL_REG_4 |
capopolito | 2:53521a18c3de | 235 | i2c.start(); |
capopolito | 2:53521a18c3de | 236 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 237 | i2c.write(CTRL_REG_4); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 238 | i2c.start(); |
capopolito | 2:53521a18c3de | 239 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 240 | ctrl_reg_4=i2c.read(0); |
capopolito | 2:53521a18c3de | 241 | i2c.stop(); |
capopolito | 2:53521a18c3de | 242 | printf("CTRL_REG_4: %1.2x \n", ctrl_reg_4); |
capopolito | 2:53521a18c3de | 243 | |
capopolito | 2:53521a18c3de | 244 | char ctrl_reg_5 = 0x00; |
capopolito | 2:53521a18c3de | 245 | //lettura single byte read del registro CTRL_REG_5 |
capopolito | 2:53521a18c3de | 246 | i2c.start(); |
capopolito | 2:53521a18c3de | 247 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 248 | i2c.write(CTRL_REG_5); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 249 | i2c.start(); |
capopolito | 2:53521a18c3de | 250 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 251 | ctrl_reg_5=i2c.read(0); |
capopolito | 2:53521a18c3de | 252 | i2c.stop(); |
capopolito | 2:53521a18c3de | 253 | printf("CTRL_REG_5: %1.2x \n", ctrl_reg_5); |
capopolito | 2:53521a18c3de | 254 | |
capopolito | 2:53521a18c3de | 255 | char ff_mt_cfg = 0x00; |
capopolito | 2:53521a18c3de | 256 | //lettura single byte read del registro FF_MT_CFG |
capopolito | 2:53521a18c3de | 257 | i2c.start(); |
capopolito | 2:53521a18c3de | 258 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 259 | i2c.write(FF_MT_CFG); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 260 | i2c.start(); |
capopolito | 2:53521a18c3de | 261 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 262 | ff_mt_cfg=i2c.read(0); |
capopolito | 2:53521a18c3de | 263 | i2c.stop(); |
capopolito | 2:53521a18c3de | 264 | printf("FF_MT_CFG: %1.2x \n", ff_mt_cfg); |
capopolito | 2:53521a18c3de | 265 | |
capopolito | 2:53521a18c3de | 266 | |
capopolito | 2:53521a18c3de | 267 | char int_source = 0x00; |
capopolito | 2:53521a18c3de | 268 | //lettura single byte read del registro INT_SOURCE |
capopolito | 2:53521a18c3de | 269 | i2c.start(); |
capopolito | 2:53521a18c3de | 270 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 271 | i2c.write(INT_SOURCE); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 272 | i2c.start(); |
capopolito | 2:53521a18c3de | 273 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 274 | int_source=i2c.read(0); |
capopolito | 2:53521a18c3de | 275 | i2c.stop(); |
capopolito | 2:53521a18c3de | 276 | printf("INT_SOURCE: %1.2x \n", int_source); |
capopolito | 2:53521a18c3de | 277 | |
capopolito | 2:53521a18c3de | 278 | char aslp_count = 0x00; |
capopolito | 2:53521a18c3de | 279 | //lettura single byte read del registro ASLP_COUNT |
capopolito | 2:53521a18c3de | 280 | i2c.start(); |
capopolito | 2:53521a18c3de | 281 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 282 | i2c.write(ASLP_COUNT); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 283 | i2c.start(); |
capopolito | 2:53521a18c3de | 284 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 285 | aslp_count=i2c.read(0); |
capopolito | 2:53521a18c3de | 286 | i2c.stop(); |
capopolito | 2:53521a18c3de | 287 | printf("ASLP_COUNT: %1.2x \n", aslp_count); |
serenabpolito | 0:4317f4b1a4b3 | 288 | |
capopolito | 1:944348c50dd6 | 289 | |
capopolito | 2:53521a18c3de | 290 | char sysmod = 0x00; |
capopolito | 1:944348c50dd6 | 291 | char stato_FF_MT_SRC = 0x00 ; |
capopolito | 1:944348c50dd6 | 292 | char stato_INT_SOURCE = 0x00 ; |
serenabpolito | 0:4317f4b1a4b3 | 293 | float x_axis, y_axis, z_axis; |
serenabpolito | 0:4317f4b1a4b3 | 294 | while (true) { |
capopolito | 2:53521a18c3de | 295 | printf("sono dentro il while \n"); |
capopolito | 2:53521a18c3de | 296 | printf("SYSMOD_pre_lettura: %1.2x \n", sysmod); |
capopolito | 1:944348c50dd6 | 297 | //lettura del registro di stato INT_SOURCE (read only) |
capopolito | 1:944348c50dd6 | 298 | //Bit 7-> SRC_ASLP = 1 one or more event flag has been asserted |
capopolito | 1:944348c50dd6 | 299 | //Bit 6-> SRC_FIFO |
capopolito | 1:944348c50dd6 | 300 | //Bit 5-> SRC_TRANS |
capopolito | 1:944348c50dd6 | 301 | //Bit 4-> SRC_LNDPRT |
capopolito | 1:944348c50dd6 | 302 | //Bit 3-> SRC_PULSE |
capopolito | 1:944348c50dd6 | 303 | //Bit 2-> SRC_FF_MT |
capopolito | 1:944348c50dd6 | 304 | //Bit 1-> DONT'CARE |
capopolito | 1:944348c50dd6 | 305 | //Bit 0-> SRC_DRDY |
capopolito | 1:944348c50dd6 | 306 | i2c.start(); |
capopolito | 1:944348c50dd6 | 307 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 1:944348c50dd6 | 308 | i2c.write(INT_SOURCE); // scrivi l'indirizzo del registro |
capopolito | 1:944348c50dd6 | 309 | i2c.start(); |
capopolito | 1:944348c50dd6 | 310 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 1:944348c50dd6 | 311 | stato_INT_SOURCE=i2c.read(0); |
capopolito | 1:944348c50dd6 | 312 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 313 | printf("stato_INT_SOURCE: %1.2d \n", stato_INT_SOURCE); |
capopolito | 2:53521a18c3de | 314 | //lettura del registro di stato FF_MT_SRC (read only) |
capopolito | 2:53521a18c3de | 315 | //Bit 7-> EA = 1 one or more event flag has been asserted |
capopolito | 2:53521a18c3de | 316 | //Bit 6-> don't care |
capopolito | 2:53521a18c3de | 317 | //Bit 5-> ZHE |
capopolito | 2:53521a18c3de | 318 | //Bit 4-> ZHP |
capopolito | 2:53521a18c3de | 319 | //Bit 3-> YHE |
capopolito | 2:53521a18c3de | 320 | //Bit 2-> YHP |
capopolito | 2:53521a18c3de | 321 | //Bit 1-> XHE |
capopolito | 2:53521a18c3de | 322 | //Bit 0-> XHP i2c.start(); |
capopolito | 1:944348c50dd6 | 323 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 1:944348c50dd6 | 324 | i2c.write(FF_MT_SRC); // scrivi l'indirizzo del registro |
capopolito | 1:944348c50dd6 | 325 | i2c.start(); |
capopolito | 1:944348c50dd6 | 326 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 1:944348c50dd6 | 327 | stato_FF_MT_SRC=i2c.read(0); |
capopolito | 1:944348c50dd6 | 328 | i2c.stop(); |
capopolito | 2:53521a18c3de | 329 | printf("stato_FF_MT_SRC: %1.2x \n", stato_FF_MT_SRC); |
capopolito | 2:53521a18c3de | 330 | // lettura single Byte Read contenuto di SYSMOD System Mode Register |
capopolito | 2:53521a18c3de | 331 | //Bit 7-> FGERR |
capopolito | 2:53521a18c3de | 332 | //Bit 6-> FGT_4 |
capopolito | 2:53521a18c3de | 333 | //Bit 5-> FGT_3 |
capopolito | 2:53521a18c3de | 334 | //Bit 4-> FGT_2 |
capopolito | 2:53521a18c3de | 335 | //Bit 3-> FGT_1 |
capopolito | 2:53521a18c3de | 336 | //Bit 2-> FGT_0 |
capopolito | 2:53521a18c3de | 337 | //Bit 1-> SYSMOD1 |
capopolito | 2:53521a18c3de | 338 | //Bit 0-> SYSMOD0 |
capopolito | 2:53521a18c3de | 339 | // SYSMOD[1:0] |
capopolito | 2:53521a18c3de | 340 | // System Mode. Default value: 00. |
capopolito | 2:53521a18c3de | 341 | // 00: STANDBY mode |
capopolito | 2:53521a18c3de | 342 | // 01: WAKE mode |
capopolito | 2:53521a18c3de | 343 | // 10: SLEEP mode |
capopolito | 2:53521a18c3de | 344 | i2c.start(); |
capopolito | 2:53521a18c3de | 345 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 2:53521a18c3de | 346 | i2c.write(SYSMOD); // scrivi l'indirizzo del registro |
capopolito | 2:53521a18c3de | 347 | i2c.start(); |
capopolito | 2:53521a18c3de | 348 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 2:53521a18c3de | 349 | sysmod=i2c.read(0); |
capopolito | 2:53521a18c3de | 350 | i2c.stop(); |
capopolito | 2:53521a18c3de | 351 | printf("SYSMOD_post_lettura: %1.2x \n", sysmod); |
capopolito | 1:944348c50dd6 | 352 | //controllo sullo stato |
capopolito | 1:944348c50dd6 | 353 | // se il flag SRC_FF_MT==1 (bit 7) del registro INT_SOURCE |
capopolito | 2:53521a18c3de | 354 | //if (stato_INT_SOURCE &&0x04 == 0x04) { |
capopolito | 2:53521a18c3de | 355 | //printf("INT1: %1.2x \n", INT1); |
capopolito | 2:53521a18c3de | 356 | //printf("INT2: %1.2x \n", INT2); |
capopolito | 2:53521a18c3de | 357 | wait(0.1f); |
capopolito | 2:53521a18c3de | 358 | if (sysmod &0x02 ==0x02) { // if SYSMOD1,SYSMOD0 = 1,0 |
capopolito | 2:53521a18c3de | 359 | wait(0.1f); |
capopolito | 2:53521a18c3de | 360 | printf("Sto dormendo sono in auto-sleep , SYSMOD: %1.2x \n",sysmod); |
capopolito | 2:53521a18c3de | 361 | rled = 0.0f; |
capopolito | 2:53521a18c3de | 362 | gled = 0.0f; |
capopolito | 2:53521a18c3de | 363 | bled = 0.0f; |
capopolito | 2:53521a18c3de | 364 | } //chiusra del if |
capopolito | 2:53521a18c3de | 365 | if (sysmod &0x01 ==0x01){ // if SYSMOD1,SYSMOD0 = 0,1 |
capopolito | 2:53521a18c3de | 366 | printf("Buongiorno motion and rotation mi hanno sveliato, , SYSMOD: %1.2x \n", sysmod); |
capopolito | 1:944348c50dd6 | 367 | //lettura degli assi con lettura Single Byte Read |
capopolito | 1:944348c50dd6 | 368 | // asse x |
serenabpolito | 0:4317f4b1a4b3 | 369 | i2c.start(); |
serenabpolito | 0:4317f4b1a4b3 | 370 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
serenabpolito | 0:4317f4b1a4b3 | 371 | i2c.write(OUT_X_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X |
serenabpolito | 0:4317f4b1a4b3 | 372 | i2c.start(); |
serenabpolito | 0:4317f4b1a4b3 | 373 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 1:944348c50dd6 | 374 | x_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su x_axis |
capopolito | 1:944348c50dd6 | 375 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 376 | // asse y |
capopolito | 1:944348c50dd6 | 377 | i2c.start(); |
capopolito | 1:944348c50dd6 | 378 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 1:944348c50dd6 | 379 | i2c.write(OUT_Y_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Y |
capopolito | 1:944348c50dd6 | 380 | i2c.start(); |
capopolito | 1:944348c50dd6 | 381 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 1:944348c50dd6 | 382 | y_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su y_axis |
serenabpolito | 0:4317f4b1a4b3 | 383 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 384 | // asse Z |
capopolito | 1:944348c50dd6 | 385 | i2c.start(); |
capopolito | 1:944348c50dd6 | 386 | i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura |
capopolito | 1:944348c50dd6 | 387 | i2c.write(OUT_Z_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Z |
capopolito | 1:944348c50dd6 | 388 | i2c.start(); |
capopolito | 1:944348c50dd6 | 389 | i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read |
capopolito | 1:944348c50dd6 | 390 | z_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su z_axis |
capopolito | 1:944348c50dd6 | 391 | i2c.stop(); |
capopolito | 1:944348c50dd6 | 392 | |
capopolito | 1:944348c50dd6 | 393 | //accendo led |
serenabpolito | 0:4317f4b1a4b3 | 394 | rled = 1.0f - x_axis/256; |
serenabpolito | 0:4317f4b1a4b3 | 395 | gled = 1.0f - y_axis/256; |
serenabpolito | 0:4317f4b1a4b3 | 396 | bled = 1.0f - z_axis/256; |
capopolito | 2:53521a18c3de | 397 | //wait(0.1f); |
capopolito | 1:944348c50dd6 | 398 | //scrivo sulla seriale |
capopolito | 2:53521a18c3de | 399 | printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64); |
capopolito | 2:53521a18c3de | 400 | } //chiusura secondo if |
capopolito | 2:53521a18c3de | 401 | }//chiusura del while |
capopolito | 2:53521a18c3de | 402 | }//chiusura del main |
serenabpolito | 0:4317f4b1a4b3 | 403 |