Dependencies:   MMA8451Q mbed

Fork of Lab3_latest_21_01_2015_aggiornata by SDI 2014/2015

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?

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