
Fork of Lab3_latest_21_01_2015_aggiornata by
Diff: main.cpp
- Revision:
- 0:4317f4b1a4b3
- Child:
- 1:944348c50dd6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jan 14 11:29:52 2015 +0000 @@ -0,0 +1,169 @@ +#include "mbed.h" +#include "MMA8451Q.h" +#include "I2C.h" + +#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) +PinName const SDA = PTE25; +PinName const SCL = PTE24; +#elif defined (TARGET_KL05Z) +PinName const SDA = PTB4; +PinName const SCL = PTB3; +#elif defined (TARGET_K20D50M) +PinName const SDA = PTB1; +PinName const SCL = PTB0; +#else + #error TARGET NOT DEFINED +#endif + +#define MMA8451_I2C_ADDRESS (0x1d<<1) + + +//instanzia e inizializza oggettto i2c della clase I2C +I2C i2c(SDA,SCL); // SDA I2C data line pin + // SCL I2C clock line pin + + +char address_wr = 0x3A ; //byte per eseguire lettura: address_device + bit_wr(W=0) +char address_rd = 0x3B ; //byte per eseguire scrittura: address_device + bit_rd(R=1) +char CTRL_REG_1 = 0x2A ; // register address del CTRL_REG_1 +char CTRL_REG_2 = 0x2B ; // register address del CTRL_REG_2 +char CTRL_REG_3 = 0x2C ; // register address del CTRL_REG_3 +char CTRL_REG_4 = 0x2D ; // register address del CTRL_REG_4 +char CTRL_REG_5 = 0x2E ; // register address del CTRL_REG_5 +char data = 0xFA ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1 +char OUT_X_MSB = 0x01 ; // parte più significativa del registro contenete l'accelerazione sull'asse x +char OUT_Y_MSB = 0x03 ; // parte più significativa del registro contenete l'accelerazione sull'asse y +char OUT_Z_MSB = 0x05 ; // parte più significativa del registro contenete l'accelerazione sull'asse z +char XYZ_DATA_CFG = 0x0E;// register address del XYZ_DATA_CFG +//ASLP_RATE0 = ASLP_RATE1 = 1 \\ per settare modalità campionamento in sleep a f=1.56Hz +//DR2=DR1=DR0 =1 \\ per settare campionamento in wake a f=1.56Hz +//LNOISE=0 //non attiva ridzuione del rumore (tanto la frequenza di campionamento è bassa) +//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 + + + +int main(void) +{ + + //impostazione dei registri con scrittura Single Byte Write + + // setta impostazioni su CTRL_REG_1 + i2c.start(); // dai lo start + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1 + i2c.write(data); // scrivi il "data" già inizializzato con le impostazioni del CTRL_REG_1 + i2c.stop(); + + // setta impostazioni su CTRL_REG_2 + data=0x04; //imposta data con le impostazioni del CTRL_REG_2 + //ST=0 disabilita il self-test + //RST=0 disabilita modalità reset + //bit 5 don't care + //SMODS0=SMODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in sleep + //SLPE=1 abilita l'autosleep + //MODS0=MODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in active + i2c.start(); // dai lo start + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(CTRL_REG_2); // scrivi l'indirizzo del CTRL_REG_2 + i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_2 + 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 + // 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_3); // scrivi l'indirizzo del CTRL_REG_3 + i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_3 + i2c.stop(); + + // setta impostazioni su CTRL_REG_4 + data=0x00; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt + // 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_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 + // 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 + i2c.start(); // dai lo start + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + 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(); + + //attiva il dispositivo (esce da standby) + // setta impostazioni su CTRL_REG_1 + data=0xFB ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati) + i2c.start(); // dai lo start + i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura + i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1 + i2c.write(data); // scrivi il "data" in le impostazioni del CTRL_REG_1 + i2c.stop(); + + //lettura degli assi con lettura Multiple Byte Read + //float x_axis, y_axis, z_axis; + //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.write(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis + //y_axis=i2c.write(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis + //z_axis=i2c.write(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis + //i2c.stop(); + + MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); + PwmOut rled(LED1); + PwmOut gled(LED2); + PwmOut bled(LED3); + + printf("MMA8451 ID: %d\n", acc.getWhoAmI()); + + 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()); + //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(); + + 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); + } +} +