Dependencies:   MMA8451Q mbed

Fork of Lab3_latest_21_01_2015_aggiornata by SDI 2014/2015

Committer:
serenabpolito
Date:
Wed Jan 14 11:29:52 2015 +0000
Revision:
0:4317f4b1a4b3
Child:
1:944348c50dd6
jkj

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)
serenabpolito 0:4317f4b1a4b3 6 PinName const SDA = PTE25;
serenabpolito 0:4317f4b1a4b3 7 PinName const SCL = PTE24;
serenabpolito 0:4317f4b1a4b3 8 #elif defined (TARGET_KL05Z)
serenabpolito 0:4317f4b1a4b3 9 PinName const SDA = PTB4;
serenabpolito 0:4317f4b1a4b3 10 PinName const SCL = PTB3;
serenabpolito 0:4317f4b1a4b3 11 #elif defined (TARGET_K20D50M)
serenabpolito 0:4317f4b1a4b3 12 PinName const SDA = PTB1;
serenabpolito 0:4317f4b1a4b3 13 PinName const SCL = PTB0;
serenabpolito 0:4317f4b1a4b3 14 #else
serenabpolito 0:4317f4b1a4b3 15 #error TARGET NOT DEFINED
serenabpolito 0:4317f4b1a4b3 16 #endif
serenabpolito 0:4317f4b1a4b3 17
serenabpolito 0:4317f4b1a4b3 18 #define MMA8451_I2C_ADDRESS (0x1d<<1)
serenabpolito 0:4317f4b1a4b3 19
serenabpolito 0:4317f4b1a4b3 20
serenabpolito 0:4317f4b1a4b3 21 //instanzia e inizializza oggettto i2c della clase I2C
serenabpolito 0:4317f4b1a4b3 22 I2C i2c(SDA,SCL); // SDA I2C data line pin
serenabpolito 0:4317f4b1a4b3 23 // SCL I2C clock line pin
serenabpolito 0:4317f4b1a4b3 24
serenabpolito 0:4317f4b1a4b3 25
serenabpolito 0:4317f4b1a4b3 26 char address_wr = 0x3A ; //byte per eseguire lettura: address_device + bit_wr(W=0)
serenabpolito 0:4317f4b1a4b3 27 char address_rd = 0x3B ; //byte per eseguire scrittura: address_device + bit_rd(R=1)
serenabpolito 0:4317f4b1a4b3 28 char CTRL_REG_1 = 0x2A ; // register address del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 29 char CTRL_REG_2 = 0x2B ; // register address del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 30 char CTRL_REG_3 = 0x2C ; // register address del CTRL_REG_3
serenabpolito 0:4317f4b1a4b3 31 char CTRL_REG_4 = 0x2D ; // register address del CTRL_REG_4
serenabpolito 0:4317f4b1a4b3 32 char CTRL_REG_5 = 0x2E ; // register address del CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 33 char data = 0xFA ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 34 char OUT_X_MSB = 0x01 ; // parte più significativa del registro contenete l'accelerazione sull'asse x
serenabpolito 0:4317f4b1a4b3 35 char OUT_Y_MSB = 0x03 ; // parte più significativa del registro contenete l'accelerazione sull'asse y
serenabpolito 0:4317f4b1a4b3 36 char OUT_Z_MSB = 0x05 ; // parte più significativa del registro contenete l'accelerazione sull'asse z
serenabpolito 0:4317f4b1a4b3 37 char XYZ_DATA_CFG = 0x0E;// register address del XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 38 //ASLP_RATE0 = ASLP_RATE1 = 1 \\ per settare modalità campionamento in sleep a f=1.56Hz
serenabpolito 0:4317f4b1a4b3 39 //DR2=DR1=DR0 =1 \\ per settare campionamento in wake a f=1.56Hz
serenabpolito 0:4317f4b1a4b3 40 //LNOISE=0 //non attiva ridzuione del rumore (tanto la frequenza di campionamento è bassa)
serenabpolito 0:4317f4b1a4b3 41 //FREAD=1 // attiva modalità fast read, per campionare con 8bit ed avere risoluzione di 8 bit
serenabpolito 0:4317f4b1a4b3 42 //ACTIVE=0 // setta l'avccelerometro in standby per settare anche altri registri
serenabpolito 0:4317f4b1a4b3 43
serenabpolito 0:4317f4b1a4b3 44
serenabpolito 0:4317f4b1a4b3 45
serenabpolito 0:4317f4b1a4b3 46 int main(void)
serenabpolito 0:4317f4b1a4b3 47 {
serenabpolito 0:4317f4b1a4b3 48
serenabpolito 0:4317f4b1a4b3 49 //impostazione dei registri con scrittura Single Byte Write
serenabpolito 0:4317f4b1a4b3 50
serenabpolito 0:4317f4b1a4b3 51 // setta impostazioni su CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 52 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 53 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 54 i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 55 i2c.write(data); // scrivi il "data" già inizializzato con le impostazioni del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 56 i2c.stop();
serenabpolito 0:4317f4b1a4b3 57
serenabpolito 0:4317f4b1a4b3 58 // setta impostazioni su CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 59 data=0x04; //imposta data con le impostazioni del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 60 //ST=0 disabilita il self-test
serenabpolito 0:4317f4b1a4b3 61 //RST=0 disabilita modalità reset
serenabpolito 0:4317f4b1a4b3 62 //bit 5 don't care
serenabpolito 0:4317f4b1a4b3 63 //SMODS0=SMODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in sleep
serenabpolito 0:4317f4b1a4b3 64 //SLPE=1 abilita l'autosleep
serenabpolito 0:4317f4b1a4b3 65 //MODS0=MODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in active
serenabpolito 0:4317f4b1a4b3 66 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 67 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 68 i2c.write(CTRL_REG_2); // scrivi l'indirizzo del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 69 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 70 i2c.stop();
serenabpolito 0:4317f4b1a4b3 71
serenabpolito 0:4317f4b1a4b3 72 // setta impostazioni su CTRL_REG_3
serenabpolito 0:4317f4b1a4b3 73 data=0x00; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
serenabpolito 0:4317f4b1a4b3 74 // vedi data-sheet
serenabpolito 0:4317f4b1a4b3 75 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 76 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 77 i2c.write(CTRL_REG_3); // scrivi l'indirizzo del CTRL_REG_3
serenabpolito 0:4317f4b1a4b3 78 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_3
serenabpolito 0:4317f4b1a4b3 79 i2c.stop();
serenabpolito 0:4317f4b1a4b3 80
serenabpolito 0:4317f4b1a4b3 81 // setta impostazioni su CTRL_REG_4
serenabpolito 0:4317f4b1a4b3 82 data=0x00; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
serenabpolito 0:4317f4b1a4b3 83 // vedi data-sheet
serenabpolito 0:4317f4b1a4b3 84 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 85 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 86 i2c.write(CTRL_REG_4); // scrivi l'indirizzo del CTRL_REG_4
serenabpolito 0:4317f4b1a4b3 87 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_4
serenabpolito 0:4317f4b1a4b3 88 i2c.stop();
serenabpolito 0:4317f4b1a4b3 89
serenabpolito 0:4317f4b1a4b3 90 // setta impostazioni su CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 91 data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt in modalità sleep
serenabpolito 0:4317f4b1a4b3 92 // vedi data-sheet
serenabpolito 0:4317f4b1a4b3 93 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 94 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 95 i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 96 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 97 i2c.stop();
serenabpolito 0:4317f4b1a4b3 98
serenabpolito 0:4317f4b1a4b3 99 // setta impostazioni su CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 100 data=0x00; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt in modalità sleep
serenabpolito 0:4317f4b1a4b3 101 // vedi data-sheet
serenabpolito 0:4317f4b1a4b3 102 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 103 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 104 i2c.write(CTRL_REG_5); // scrivi l'indirizzo del CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 105 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_5
serenabpolito 0:4317f4b1a4b3 106 i2c.stop();
serenabpolito 0:4317f4b1a4b3 107
serenabpolito 0:4317f4b1a4b3 108 // setta impostazioni su XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 109 data=0x00; //imposta data con le impostazioni del XYZ_DATA_CFG attineti alla dinamica che si vuole acquisire (+-2g)
serenabpolito 0:4317f4b1a4b3 110 // FS1=FS0=0 imposta la dinamica +-2g
serenabpolito 0:4317f4b1a4b3 111 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 112 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 113 i2c.write(XYZ_DATA_CFG); // scrivi l'indirizzo del XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 114 i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 115 i2c.stop();
serenabpolito 0:4317f4b1a4b3 116
serenabpolito 0:4317f4b1a4b3 117 //attiva il dispositivo (esce da standby)
serenabpolito 0:4317f4b1a4b3 118 // setta impostazioni su CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 119 data=0xFB ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati)
serenabpolito 0:4317f4b1a4b3 120 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 121 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 122 i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 123 i2c.write(data); // scrivi il "data" in le impostazioni del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 124 i2c.stop();
serenabpolito 0:4317f4b1a4b3 125
serenabpolito 0:4317f4b1a4b3 126 //lettura degli assi con lettura Multiple Byte Read
serenabpolito 0:4317f4b1a4b3 127 //float x_axis, y_axis, z_axis;
serenabpolito 0:4317f4b1a4b3 128 //i2c.start();
serenabpolito 0:4317f4b1a4b3 129 //i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 130 //i2c.write(OUT_X_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
serenabpolito 0:4317f4b1a4b3 131 //i2c.start();
serenabpolito 0:4317f4b1a4b3 132 //i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
serenabpolito 0:4317f4b1a4b3 133 //x_axis=i2c.write(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
serenabpolito 0:4317f4b1a4b3 134 //y_axis=i2c.write(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
serenabpolito 0:4317f4b1a4b3 135 //z_axis=i2c.write(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
serenabpolito 0:4317f4b1a4b3 136 //i2c.stop();
serenabpolito 0:4317f4b1a4b3 137
serenabpolito 0:4317f4b1a4b3 138 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
serenabpolito 0:4317f4b1a4b3 139 PwmOut rled(LED1);
serenabpolito 0:4317f4b1a4b3 140 PwmOut gled(LED2);
serenabpolito 0:4317f4b1a4b3 141 PwmOut bled(LED3);
serenabpolito 0:4317f4b1a4b3 142
serenabpolito 0:4317f4b1a4b3 143 printf("MMA8451 ID: %d\n", acc.getWhoAmI());
serenabpolito 0:4317f4b1a4b3 144
serenabpolito 0:4317f4b1a4b3 145 float x_axis, y_axis, z_axis;
serenabpolito 0:4317f4b1a4b3 146 while (true) {
serenabpolito 0:4317f4b1a4b3 147 // float x, y, z;
serenabpolito 0:4317f4b1a4b3 148 // x = abs(acc.getAccX());
serenabpolito 0:4317f4b1a4b3 149 // y = abs(acc.getAccY());
serenabpolito 0:4317f4b1a4b3 150 // z = abs(acc.getAccZ());
serenabpolito 0:4317f4b1a4b3 151 //lettura degli assi con lettura Multiple Byte Read
serenabpolito 0:4317f4b1a4b3 152 i2c.start();
serenabpolito 0:4317f4b1a4b3 153 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 154 i2c.write(OUT_X_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
serenabpolito 0:4317f4b1a4b3 155 i2c.start();
serenabpolito 0:4317f4b1a4b3 156 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
serenabpolito 0:4317f4b1a4b3 157 x_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su x_axis
serenabpolito 0:4317f4b1a4b3 158 y_axis=i2c.read(1); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su y_axis
serenabpolito 0:4317f4b1a4b3 159 z_axis=i2c.read(0); // scrive bit di AK (acknowlodgement) e salva il dato sul bus su z_axis
serenabpolito 0:4317f4b1a4b3 160 i2c.stop();
serenabpolito 0:4317f4b1a4b3 161
serenabpolito 0:4317f4b1a4b3 162 rled = 1.0f - x_axis/256;
serenabpolito 0:4317f4b1a4b3 163 gled = 1.0f - y_axis/256;
serenabpolito 0:4317f4b1a4b3 164 bled = 1.0f - z_axis/256;
serenabpolito 0:4317f4b1a4b3 165 wait(0.1f);
serenabpolito 0:4317f4b1a4b3 166 printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis, y_axis, z_axis);
serenabpolito 0:4317f4b1a4b3 167 }
serenabpolito 0:4317f4b1a4b3 168 }
serenabpolito 0:4317f4b1a4b3 169