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 0:4317f4b1a4b3, committed 2015-01-14
- Comitter:
- serenabpolito
- Date:
- Wed Jan 14 11:29:52 2015 +0000
- Child:
- 1:944348c50dd6
- Commit message:
- jkj
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.lib Wed Jan 14 11:29:52 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/emilmont/code/MMA8451Q/#c4d879a39775
--- /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);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Jan 14 11:29:52 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5 \ No newline at end of file
