Questa è la versione deifinitiva del codice del Lab2_I2C e del lab3_SPI (nell'altra c'era un commento sbagliato è do dovuto ripubblicarla)

Dependencies:   MMA8451Q mbed

Fork of Codice_Lab2_I2C_Lab3_SPI by SDI 2014/2015

Revision:
3:f8f4a33c7aa2
Parent:
2:53521a18c3de
Child:
4:c40acfb63133
--- a/main.cpp	Sat Jan 17 09:27:25 2015 +0000
+++ b/main.cpp	Tue Jan 20 11:09:06 2015 +0000
@@ -1,10 +1,15 @@
 #include "mbed.h"
 #include "MMA8451Q.h"
 #include "I2C.h"
+#include "SPI.h"
+#include "DigitalIn.h"
+
+//--prova--------------------------------------------
+//PinName const INT1 = PTA14 ; //pin interrupt
+//PinName const INT2 = PTA15 ; //pin interrupt
+//--prova--------------------------------------------
 
 #if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
-//PinName const INT1 = PTA14 ; //pin interrupt
-//PinName const INT2 = PTA15 ; //pin interrupt
 PinName const SDA = PTE25;
 PinName const SCL = PTE24;
 #elif defined (TARGET_KL05Z)
@@ -17,32 +22,45 @@
   #error TARGET NOT DEFINED
 #endif
 
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
+//--RELATIVI ALLA COMUNICAZIONE SPI------
+PinName const mosi = PTD2; //mosi SPI1_mosi
+PinName const miso = PTD3; //miso SPI1_miso
+PinName const sck  = PTD1; //sck SPI1_sck
+PinName const pcs0 = PTD0; //pcs0 SPI1_pcs0
+//--RELATIVI ALLA COMUNICAZIONE SPI------
 
-
+#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  
+                //  SCL I2C clock line pin
+//--prova------------------------------------------------------------
+//instanzia e inizializza oggetti int1 e int2 della classe DigitalIn
+DigitalIn int1(INT1); //inizializza int1
+DigitalIn int2(INT2); //inizializza int2
+//--prova------------------------------------------------------------
 
 
-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)
+//registri da impostare
 char CTRL_REG_1 = 0x2A ;  //read/write  // register address del CTRL_REG_1
 char CTRL_REG_2 = 0x2B ;  //read/write  // register address del CTRL_REG_2
 char CTRL_REG_3 = 0x2C ;  //read/write  // register address del CTRL_REG_3
 char CTRL_REG_4 = 0x2D ;  //read/write  // register address del CTRL_REG_4
-char CTRL_REG_5 = 0x2E ;  //read/write  // register address del CTRL_REG_5
-char data = 0x00 ;                      // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1
 char OUT_X_MSB = 0x01 ;   //read only   // parte più significativa del registro contenete l'accelerazione sull'asse x 
 char OUT_Y_MSB = 0x03 ;   //read only   // parte più significativa del registro contenete l'accelerazione sull'asse y
 char OUT_Z_MSB = 0x05 ;   //read only   // parte più significativa del registro contenete l'accelerazione sull'asse z
 char XYZ_DATA_CFG = 0x0E; //read/write  // register address del XYZ_DATA_CFG
-char FF_MT_CFG = 0x15;    //read/write  // registera addres del FF_MT_CFG (Frefall/Motionn Configuration register (Read/Write)
-char INT_SOURCE = 0x0C;   //read only   // register adderess del INT_SOURCE ( System Interrupt Status Register)
-char FF_MT_SRC = 0x16;    //read only   // register address del FF_MT_SRC (Frefall/Motion Source Register
 char ASLP_COUNT= 0x29;    //read/write  // register address SLEEP TIME-OUT COUNTER
-char WHO_AM_I = 0x0D;     //read only   // register address WHO_AM_I dice chi è ?
 char SYSMOD = 0x0B;       //read only   // register address  SYSMOD System Mode Register
+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 data = 0x00 ;                      // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1
+
+//--registri aggiunti e settati per prova ------------------------------------------------------------------
+char CTRL_REG_5 = 0x2E ;  //read/write  // register address del CTRL_REG_5
+char FF_MT_CFG = 0x15;    //read/write  // registera addres del FF_MT_CFG (Frefall/Motionn Configuration register
+char FF_MT_THS = 0x17;    //read/write  // register address del FF_MT_THS Freefall and Motion Threshold
+char FF_MT_COUNT = 0x18;  //read/write  //register address del FF_MT_COUNT Debounce Register
+//--registri aggiunti e settati per prova ---------------------------------------------------------------------
 
 int main(void)
 {
@@ -50,22 +68,27 @@
     //impostazione dei registri con scrittura Single Byte Write
     
     // setta impostazioni su CTRL_REG_1
-    //data = 0x58 ; //->F_READ=0; acquisisco cmq un solo byte
-    //data= 0x02;//solo F_READ=1;
-    data = 0x5A ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1
+    data = 0x58 ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1
     //Bit 7-> ASLP_RATE1  = 0 
     //Bit 6-> ASLP_RATE0  = 1 ->  // Il sample rate in sleep è 6.25 Hz vedi AN070
     //Bit 5-> DR2  = 0
     //Bit 4-> DR1  = 1    
     //Bit 3-> DR0  = 1 ->  // Il sample rate in wake è 100 Hz vedi AN070
     //Bit 2-> LNOISE = 0
-    //Bit 1-> F_READ = 1 -> //Faste read is enabled, acquissco un solo byte!
+    //Bit 1-> F_READ = 0 -> //Faste read is enabled, acquissco un solo byte!
     //Bit 0-> ACTIVE = 0 -> //Mette il dispositivo in standby per settare gli altri registri
     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();
+    //NOTE:
+            //La modalità "FAST READ", che si attiva asserendo il bit F_READ, può non essere impostata perchè 
+            //per campionare il dato con risoluzione 8 bit è sufficente leggere solo la parte
+            //significativa del dato contenuta nei registri OUT_MSB_X, Y e Z.
+            //Cambio la frequenz di campionamento, valore dell'ODR (Over Sampling Ratio),
+            //dalla modalità sleep alla modalità wake (in modo da accorgermi di essere in wake)    
+        
     
     // setta impostazioni su CTRL_REG_2
     data=0x04; //imposta data con le impostazioni del CTRL_REG_2
@@ -82,14 +105,13 @@
     i2c.stop();    
 
     // setta impostazioni su CTRL_REG_3
-    //data=0x18; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
-    data=0x40; //imposta solo il wake_trans
+    data=0x68; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
     // vedi data-sheet
     //Bit 7-> FIFO GATE   = 0 
-    //Bit 6-> WAKE_TRANS  = 0 ->0 oppure a 1 non cambia!
-    //Bit 5-> WAKE_LNDRPT = 0
-    //Bit 4-> WAKE_PULSE  = 1         
-    //Bit 3-> WAKE_FF_MT  = 1 (if=0disabled!) Frefall/Motion function interrupt can wake up !
+    //Bit 6-> WAKE_TRANS  = 1 
+    //Bit 5-> WAKE_LNDRPT = 1
+    //Bit 4-> WAKE_PULSE  = 0         
+    //Bit 3-> WAKE_FF_MT  = 1
     //Bit 2-> don't care
     //Bit 1-> IPOL  = 0
     //Bit 0-> PP_OD = 0
@@ -100,39 +122,21 @@
     i2c.stop();    
 
     // setta impostazioni su CTRL_REG_4
-    //data=0x8C; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
-    data=0x80;  // imposta solo l'Auto-SLEEP/WAKE interrupt
+    data=0xB5; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
     // vedi data-sheet
     //Bit 7-> IN_EN_ASLP    = 1 ; se = 1 Auto-SLEEP/WAKE interrupt enabled -> vedi AN070
     //Bit 6-> INT_EN_FIFO   = 0
-    //Bit 5-> INT_EN_TRANS  = 0
-    //Bit 4-> INT_EN_LNDPRT = 0         
-    //Bit 3-> INT_EN_PULSE  = 1 Pulse interrupt enabled -> vedi AN070 
-    //Bit 2-> INT_EN_FF_MT  = 1 Freefall/Motion interrupt enabled -> vedi AN070
+    //Bit 5-> INT_EN_TRANS  = 1
+    //Bit 4-> INT_EN_LNDPRT = 1         
+    //Bit 3-> INT_EN_PULSE  = 0  
+    //Bit 2-> INT_EN_FF_MT  = 1 
     //Bit 1-> don't care    = 0
-    //Bit 0-> INT_EN_DRDY   = 0
+    //Bit 0-> INT_EN_DRDY   = 1 ;// abilito data ready per motivi di logica interna pur no usandolo
     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=0x80; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin
-    // vedi data-sheet
-    //Bit 7-> INT_CFG_ASLP   = 1 route the auto-sleep interrupt to INT1 ->vedi AN070
-    //Bit 6-> INT_CFG_FIFO   = 0
-    //Bit 5-> INT_CFG_TRANS  = 0
-    //Bit 4-> INT_CFG_LNDPRT = 0         
-    //Bit 3-> INT_CFG_PULSE  = 0 route the pulse interrupt to INT1 ->vedi AN070 
-    //Bit 2-> INT_CFG_FF_MT  = 0 route the Motion and Orientation interrupt to INT1 ->vedi AN070
-    //Bit 1-> DON'T CARE   = 0
-    //Bit 0-> INT_CFG_DRDY   = 0
-    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)
@@ -143,11 +147,40 @@
     i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG
     i2c.stop();  
 
+    //setta impostazioni su ASLP_COUNT
+    data=0x0F; //->impostato da me valore max
+    //data=0x01; //impostato da me valore min
+    //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!!
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(ASLP_COUNT); // scrivi l'indirizzo del ASLP_COUNT
+    i2c.write(data);       // scrivi il "data" contenete le impostazioni del ASLP_COUNT
+    i2c.stop();    
+
+//---registri impostati per prova ---------------------------------
+
+    
+    // setta impostazioni su CTRL_REG_5 
+    data=0x81; //imposta data con le impostazioni del CTRL_REG_5 attineti alle gestioni dell'interupt nei pin
+    // vedi data-sheet
+    //Bit 7-> INT_CFG_ASLP   = 1 route the auto-sleep interrupt to INT1 ->vedi AN074
+    //Bit 6-> INT_CFG_FIFO   = 0
+    //Bit 5-> INT_CFG_TRANS  = 0
+    //Bit 4-> INT_CFG_LNDPRT = 0         
+    //Bit 3-> INT_CFG_PULSE  = 0 route the pulse interrupt to INT2 ->vedi AN074
+    //Bit 2-> INT_CFG_FF_MT  = 0 route the Motion and Orientation interrupt to INT2 ->vedi AN074
+    //Bit 1-> DON'T CARE   = 0
+    //Bit 0-> INT_CFG_DRDY   = 1 route the data-ready interrupt to INT1 ->vedi AN074
+    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 FF_MT_CFG (Frefall/Motion Configuration Register (Read/Write)
-    //data=0xF8; //imposta data con le impostazioni del FF_MT_SRC attineti quando vogliamo svegliare il dispositivo dal wake
-    data=0x00; //non imposta nulla
+    data=0xF8; //imposta data con le impostazioni del FF_MT_SRC attineti quando vogliamo svegliare il dispositivo dal wake
     //Bit 7-> ELE  = 1 ;event flag latch enabled in FF_MT_SRC 
-    //Bit 6-> OAE  = 0 ;Motion Flag (if=1 OR combination) (if=1 AND combination)
+    //Bit 6-> OAE  = 1 ;Motion Flag (if=1 OR combination) (if=1 AND combination)
     //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
     //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         
     //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
@@ -159,245 +192,227 @@
     i2c.write(FF_MT_CFG); // scrivi l'indirizzo del FF_MT_CFG
     i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_CFG
     i2c.stop();  
-    //setta impostazioni su ASLP_COUNT
-    data=0xF0; //->impostato da me valore max
-    //data=0x01; //impostato da me valore min
-    //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!!
+    
+
+    // setta impostazioni su FF_MT_THS  (Read/Write)
+    data=0x04; //imposta data con le impostazioni del FF_MT_THS 
     i2c.start(); // dai lo start
     i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-    i2c.write(ASLP_COUNT); // scrivi l'indirizzo del ASLP_COUNT
-    i2c.write(data); // scrivi il "data" contenete le impostazioni del ASLP_COUNT
+    i2c.write(FF_MT_THS); // scrivi l'indirizzo del FF_MT_THS
+    i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_THS
+    i2c.stop();  
+
+    // setta impostazioni su FF_MT_COUNT (Read/Write)
+    data=0x08; //imposta data con le impostazioni del FF_MT_COUNT 
+    i2c.start(); // dai lo start
+    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(FF_MT_COUNT); // scrivi l'indirizzo del FF_MT_COUNT
+    i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_COUNT
     i2c.stop();    
 
+//---registri impostati per prova ---------------------------------
+    
+    
     //!!! attiva il dispositivo (esce da standby) !!!
     // setta impostazioni su CTRL_REG_1
-    data=0x5B ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati)
-    i2c.start(); // dai lo start
+    data=0x5B ;            // 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.write(data);       // scrivi il "data" in le impostazioni del CTRL_REG_1
     i2c.stop();
 
-        
-    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    //PER ACCENDERE LED   
     PwmOut rled(LED1);
     PwmOut gled(LED2);
     PwmOut bled(LED3);    
     
+    //verifica della corretta scrittura dei registri, mediante lettura Single Byte Read
     
-    char who_am_i = 0x00; 
-    //lettura single byte read del registro WHO_AM_I
-    i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-    i2c.write(WHO_AM_I);  // scrivi l'indirizzo del registro
+    //lettura single byte read del registro CTRL_REG_1
+    char ctrl_reg_1 = 0x00; 
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-    who_am_i=i2c.read(0);
-    i2c.stop();
-    printf("mi chiamo: %1.2x \n", who_am_i);
-    
-    
-    char ctrl_reg_1 = 0x00; 
-    //lettura single byte read del registro CTRL_REG_1
-    i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(address_wr);  // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_1);  // scrivi l'indirizzo del registro
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+    i2c.write(address_rd);  // scrivi e passa l'indirizzo del dispositivo con bit di read
     ctrl_reg_1=i2c.read(0);
     i2c.stop();
-    printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1);
+    printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1); // in esadecimale
    
+    //lettura single byte read del registro CTRL_REG_2
     char ctrl_reg_2 = 0x00; 
-    //lettura single byte read del registro CTRL_REG_2
     i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(address_wr);  // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_2);  // scrivi l'indirizzo del registro
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+    i2c.write(address_rd);  // scrivi e passa l'indirizzo del dispositivo con bit di read
     ctrl_reg_2=i2c.read(0);
     i2c.stop();
-    printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2);
+    printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2); //in esadecimale
 
-     char ctrl_reg_3 = 0x00; 
     //lettura single byte read del registro CTRL_REG_3
+    char ctrl_reg_3 = 0x00; 
     i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(address_wr);  // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_3);  // scrivi l'indirizzo del registro
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+    i2c.write(address_rd);  // scrivi e passa l'indirizzo del dispositivo con bit di read
     ctrl_reg_3=i2c.read(0);
     i2c.stop();
-    printf("CTRL_REG_3: %1.2x \n", ctrl_reg_3);
+    printf("CTRL_REG_3: %1.2x \n", ctrl_reg_3); //in esadecimale
     
+    //lettura single byte read del registro CTRL_REG_4
      char ctrl_reg_4 = 0x00; 
-    //lettura single byte read del registro CTRL_REG_4
     i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(address_wr);  // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(CTRL_REG_4);  // scrivi l'indirizzo del registro
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+    i2c.write(address_rd);  // scrivi e passa l'indirizzo del dispositivo con bit di read
     ctrl_reg_4=i2c.read(0);
     i2c.stop();
-    printf("CTRL_REG_4: %1.2x \n", ctrl_reg_4);
-
-    char ctrl_reg_5 = 0x00; 
-    //lettura single byte read del registro CTRL_REG_5
-    i2c.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 registro
-    i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-    ctrl_reg_5=i2c.read(0);
-    i2c.stop();
-    printf("CTRL_REG_5: %1.2x \n", ctrl_reg_5);
-
-    char ff_mt_cfg = 0x00; 
-    //lettura single byte read del registro FF_MT_CFG
-    i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-    i2c.write(FF_MT_CFG);  // scrivi l'indirizzo del registro
+    printf("CTRL_REG_4: %1.2x \n", ctrl_reg_4); //in esadecimale
+    
+    //lettura single byte read del registro ASLP_COUNT
+    char aslp_count = 0x00; 
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-    ff_mt_cfg=i2c.read(0);
-    i2c.stop();
-    printf("FF_MT_CFG: %1.2x \n", ff_mt_cfg);
-
-    
-    char int_source = 0x00; 
-    //lettura single byte read del registro INT_SOURCE
-    i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-    i2c.write(INT_SOURCE);  // scrivi l'indirizzo del registro
-    i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-    int_source=i2c.read(0);
-    i2c.stop();
-    printf("INT_SOURCE: %1.2x \n", int_source);
-
-    char aslp_count = 0x00; 
-    //lettura single byte read del registro ASLP_COUNT
-    i2c.start();
-    i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+    i2c.write(address_wr);  // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
     i2c.write(ASLP_COUNT);  // scrivi l'indirizzo del registro
     i2c.start();
-    i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+    i2c.write(address_rd);  // scrivi e passa l'indirizzo del dispositivo con bit di read
     aslp_count=i2c.read(0);
     i2c.stop();
-    printf("ASLP_COUNT: %1.2x \n", aslp_count);
-
-
+    printf("ASLP_COUNT: %1.2x \n", aslp_count); //in esadecimale
+    
     char sysmod = 0x00;
-    char stato_FF_MT_SRC  = 0x00 ;
-    char stato_INT_SOURCE = 0x00 ;
     float x_axis, y_axis, z_axis;
+    //int int1_value = 0;
+    //int int2_value = 0;
     while (true) {
-    printf("sono dentro il while \n");    
-    printf("SYSMOD_pre_lettura: %1.2x \n", sysmod);
-    //lettura del registro di stato INT_SOURCE (read only)
-    //Bit 7-> SRC_ASLP   = 1 one or more event flag has been asserted 
-    //Bit 6-> SRC_FIFO
-    //Bit 5-> SRC_TRANS  
-    //Bit 4-> SRC_LNDPRT
-    //Bit 3-> SRC_PULSE    
-    //Bit 2-> SRC_FF_MT 
-    //Bit 1-> DONT'CARE
-    //Bit 0-> SRC_DRDY 
-        i2c.start();
-        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-        i2c.write(INT_SOURCE);  // scrivi l'indirizzo del registro
+        printf("SYSMOD_pre_read: %1.2x \n", sysmod);
+        wait(0.1);
+        //lettura dello stato dell'accelerometro wake o sleep
+       // lettura single Byte Read contenuto di SYSMOD System Mode Register
+        //  Bit 7-> FGERR   
+        //  Bit 6-> FGT_4   
+        //  Bit 5-> FGT_3  
+        //  Bit 4-> FGT_2  
+        //  Bit 3-> FGT_1  
+        //  Bit 2-> FGT_0  
+        //  Bit 1-> SYSMOD1   
+        //  Bit 0-> SYSMOD0   
+        //  SYSMOD[1:0]
+        //              System Mode. Default value: 00.
+        //              00: STANDBY mode
+        //              01: WAKE mode
+        //              10: SLEEP mode
         i2c.start();
-        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-        stato_INT_SOURCE=i2c.read(0);
-        i2c.stop();
-        printf("stato_INT_SOURCE: %1.2d \n", stato_INT_SOURCE);
-        //lettura del registro di stato FF_MT_SRC (read only)
-        //Bit 7-> EA   = 1 one or more event flag has been asserted 
-        //Bit 6-> don't care
-        //Bit 5-> ZHE  
-        //Bit 4-> ZHP  
-        //Bit 3-> YHE           
-        //Bit 2-> YHP  
-        //Bit 1-> XHE 
-        //Bit 0-> XHP     i2c.start();
-        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-        i2c.write(FF_MT_SRC);  // scrivi l'indirizzo del registro
+        i2c.write(address_wr);  // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+        i2c.write(SYSMOD);      // scrivi l'indirizzo del registro
         i2c.start();
-        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-        stato_FF_MT_SRC=i2c.read(0);
-        i2c.stop();
-        printf("stato_FF_MT_SRC: %1.2x \n", stato_FF_MT_SRC);
-   // lettura single Byte Read contenuto di SYSMOD System Mode Register
-            //Bit 7-> FGERR   
-            //Bit 6-> FGT_4   
-            //Bit 5-> FGT_3  
-            //Bit 4-> FGT_2  
-            //Bit 3-> FGT_1  
-            //Bit 2-> FGT_0  
-            //Bit 1-> SYSMOD1   
-            //Bit 0-> SYSMOD0   
-           // SYSMOD[1:0]
-           //                 System Mode. Default value: 00.
-           //                 00: STANDBY mode
-           //                 01: WAKE mode
-           //                 10: SLEEP mode
-        i2c.start();
-        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-        i2c.write(SYSMOD);  // scrivi l'indirizzo del registro
-        i2c.start();
-        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+        i2c.write(address_rd);  // scrivi e passa l'indirizzo del dispositivo con bit di read
         sysmod=i2c.read(0);
         i2c.stop();
-        printf("SYSMOD_post_lettura: %1.2x \n", sysmod);
-        //controllo sullo stato
-        // se il flag  SRC_FF_MT==1 (bit 7) del registro INT_SOURCE
-        //if (stato_INT_SOURCE &&0x04 == 0x04) {
-        //printf("INT1: %1.2x \n", INT1);
-        //printf("INT2: %1.2x \n", INT2);
+        printf("SYSMOD_post_read: %1.2x \n", sysmod);
         wait(0.1f);
-        if (sysmod &0x02 ==0x02) { // if SYSMOD1,SYSMOD0 = 1,0
-        wait(0.1f);
-        printf("Sto dormendo sono in auto-sleep , SYSMOD: %1.2x \n",sysmod);
-        rled = 0.0f;
-        gled = 0.0f;
-        bled = 0.0f;
+        if ( (sysmod &0x02) == 0x02) { // if SYSMOD1,SYSMOD0 = 1,0
+            wait(0.1f);
+            printf("I'm sleeping , SYSMOD: %1.2x \n",sysmod);
+            rled = 0.0f;
+            gled = 0.0f;
+            bled = 0.0f;
+            //---prova------------------------------------------------
+            //mette il dispositivo in standby
+            //setta impostazioni su CTRL_REG_1
+            data=0x5A ;            // 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();        
+            //attiva il dispositivo
+            //setta impostazioni su CTRL_REG_1
+            data=0x5B ;            // 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();
+            //int1_value=int1.read();
+            //int2_value=int2.read();
+            //printf("INT1_sleep: %1.2d \n",INT1);
+            //printf("INT2_sleep: %1.2d \n",INT2);
+           //---prova------------------------------------------------
+
         } //chiusra del if
-        if (sysmod &0x01 ==0x01){ // if SYSMOD1,SYSMOD0 = 0,1
-         printf("Buongiorno motion and rotation mi hanno sveliato, , SYSMOD: %1.2x \n", sysmod);      
-       //lettura degli assi con lettura Single Byte Read   
-       // asse x 
-        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(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su x_axis
-        i2c.stop();
-        // asse y
-        i2c.start();
-        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-        i2c.write(OUT_Y_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Y
-        i2c.start();
-        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-        y_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su y_axis
-        i2c.stop();
-        // asse Z
-        i2c.start();
-        i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
-        i2c.write(OUT_Z_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Z
-        i2c.start();
-        i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
-        z_axis=i2c.read(0); // scrive bit di NAK (no acknowlodgement) e salva il dato sul bus su z_axis
-        i2c.stop();  
-       
-        //accendo led
-        rled = 1.0f - x_axis/256;
-        gled = 1.0f - y_axis/256;
-        bled = 1.0f - z_axis/256;
-        //wait(0.1f);
-        //scrivo sulla seriale
-        printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64);
-        } //chiusura secondo if
-        }//chiusura del while
-}//chiusura del main
+        if ( (sysmod &0x01) ==0x01){ // if SYSMOD1,SYSMOD0 = 0,1
+            //---prova-------------------------------------------------
+            //int1_value=int1.read;
+            //int2_value=int2.read;
+            //printf("INT1_wake: %1.2d \n",INT1);
+            //printf("INT2_wake: %1.2d \n",INT2);
+            //---prova-------------------------------------------------
+            wait(0.1f);
+            printf("Good morning! , SYSMOD: %1.2x \n", sysmod);      
+            //lettura degli assi con lettura Single Byte Read   
+            // asse x 
+            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(0);    // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su x_axis
+            i2c.stop();
+            // asse y
+            i2c.start();
+            i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+            i2c.write(OUT_Y_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Y
+            i2c.start();
+            i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+            y_axis=i2c.read(0);    // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su y_axis
+            i2c.stop();
+            // asse Z
+            i2c.start();
+            i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
+            i2c.write(OUT_Z_MSB);  // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Z
+            i2c.start();
+            i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
+            z_axis=i2c.read(0);    // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su z_axis
+            i2c.stop();  
+            //accendo led
+            rled = 1.0f - x_axis/256;
+            gled = 1.0f - y_axis/256;
+            bled = 1.0f - z_axis/256;
+            //scrivo sulla seriale
+            printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64);
+            
+            //SCRIVO DATI SU DISPLAY A SETTE SEGMENTI MEDIANTE SPI
+            //comunicazione con SPI
+                int bits = 8;
+                int mode = 1;
+                spi.format(bits,mode);//definisce formato spi con 16 bit e pol=0 e pha=1
+                //di default la frequenza è 1MHz
+                
+                char character;
+                char lettura;
+                int i;
+               while(1)
+               {
+                int command_wr=128; //comando per la scrittura (10000DDD), di default nella locazione DDD=000
+                //int command_rd=0; //comando per la lettura (00000DDD), dib default nella locazione DDD=000
+               //for(i=0;i<7;i++)
+               //{
+                //character=(char)(65+i);
+               //scrittura
+                slave_select.write(0);
+                spi.write(133);
+                spi.write(3);
+                slave_select.write(1);
+                printf("Carattere in ingresso %c\n",character);
+                //command_wr++;
+                // }   
+            
+        } //close 2nd if
+    }//close while
+}//close main