Dependencies:   MMA8451Q mbed

Fork of Lab3_latest_21_01_2015_aggiornata by SDI 2014/2015

main.cpp

Committer:
capopolito
Date:
2015-01-17
Revision:
2:53521a18c3de
Parent:
1:944348c50dd6
Child:
3:f8f4a33c7aa2

File content as of revision 2:53521a18c3de:

#include "mbed.h"
#include "MMA8451Q.h"
#include "I2C.h"

#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)
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 ;  //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

int main(void)
{
    printf("inizio \n");
    //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
    //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 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();
    
    // 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 -> vedi AN070
    //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=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
    // 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 2-> don't care
    //Bit 1-> IPOL  = 0
    //Bit 0-> PP_OD = 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_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=0x8C; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
    data=0x80;  // imposta solo l'Auto-SLEEP/WAKE interrupt
    // 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 1-> don't care    = 0
    //Bit 0-> INT_EN_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_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)
    // 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();  

    // 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
    //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 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
    //Bit 2-> = 0  don't care
    //Bit 1-> = 0  don't care
    //Bit 0-> = 0  don't care
    i2c.start(); // dai lo 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 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!!!
    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();    

    //!!! 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
    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();

        
    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
    PwmOut rled(LED1);
    PwmOut gled(LED2);
    PwmOut bled(LED3);    
    
    
    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
    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(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
    ctrl_reg_1=i2c.read(0);
    i2c.stop();
    printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1);
   
    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(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
    ctrl_reg_2=i2c.read(0);
    i2c.stop();
    printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2);

     char ctrl_reg_3 = 0x00; 
    //lettura single byte read del registro CTRL_REG_3
    i2c.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 registro
    i2c.start();
    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);
    
     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(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
    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
    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(ASLP_COUNT);  // scrivi l'indirizzo del registro
    i2c.start();
    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);


    char sysmod = 0x00;
    char stato_FF_MT_SRC  = 0x00 ;
    char stato_INT_SOURCE = 0x00 ;
    float x_axis, y_axis, z_axis;
    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
        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.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
        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);
        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;
        } //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