laboratorio09/01/2015

Dependencies:   MMA8451Q mbed

main.cpp

Committer:
giogal
Date:
2015-01-20
Revision:
1:1df877428dff
Parent:
0:03ec17aefbcc
Child:
2:4a0b5f2947d1

File content as of revision 1:1df877428dff:

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

#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
  PinName const SDA = PTE25;
  PinName const SCL = PTE24;
  #else
  #error TARGET NOT DEFINED
#endif

#define MMA8451_I2C_ADDRESS (0x1d<<1)
#define CNTRL_REG_1 0x2A
#define CNTRL_REG_2 0x2B
#define X_acc 0x01
#define Y_acc 0x03
#define Z_acc 0x05
#define STATUS 0x00

PinName const MOSI = PTD2;
PinName const MISO = PTD3;
PinName const SCK = PTD1;
PinName const SS = PTD0;

float conversion(char buf);

//funzione che trasmette ad uno schermo in SPI i valori delle accelerazioni in codice ascii
void VAL_TO_SPI( char tens, char unit, int pos_unit);

//inizializzazione dell protocollo SPI
SPI device(MOSI, MISO, SCK); // mosi, miso, clock

float x, y, z;

int main(void)
{
    
    I2C i2c(SDA,SCL);
    
    
    //trasmettiamo 8 bit alla volta
    //POL = 0, PHA = 1
    device.format(8,1);
    //frequenza della trasmissione SPI
    device.frequency(500000);
    
    
    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
    
    int address = MMA8451_I2C_ADDRESS;
   
    char stato=STATUS;
    char addr_reg2=CNTRL_REG_2;
    char data_stato;
    char stato_reg2;
    const char X_addr=X_acc;
    const char Y_addr=Y_acc;
    const char Z_addr=Z_acc;
    char z_buffer;
    char y_buffer;
    char x_buffer;
    char x_str[8];
    char y_str[8];
    char z_str[8];
   
   //inizializziamo il registro di controllo a 0 per poterlo settare
    char data[2] = {CNTRL_REG_1, 0x00};
    i2c.write(address, data, 2);
    
    
     i2c.write(address,&addr_reg2,1,true);
       i2c.read(address,&stato_reg2,1,false);
    
    char data_reg2[2] = {CNTRL_REG_2, (stato_reg2 |4)};
    i2c.write(address, data_reg2, 2);
    
    //settiamo il registro di controllo
    char data_reg1[2]={CNTRL_REG_1, 0xFB};
    i2c.write(address,data_reg1, 2);

    while (true) {
       
       i2c.write(address,&stato,1,true);
       i2c.read(address,&data_stato,1,false);
       
       if(data_stato & 8 == 8)
       {
        z = 0;
        x = 0;
        y = 0;
       i2c.write(address,&Z_addr,1,true);
       i2c.read(address,&z_buffer,1,false);
       
       i2c.write(address,&X_addr,1,true);
       i2c.read(address,&x_buffer,1,false);
       
       i2c.write(address,&Y_addr,1,true);
       i2c.read(address,&y_buffer,1,false);
       
       x = conversion(x_buffer);
       
       y = conversion(y_buffer);
       
       z = conversion(z_buffer);

       }
       x = x*2.551 + 50;
       sprintf(x_str,"%f",x);
       VAL_TO_SPI( x_str[0], x_str[1], 134);
       printf("ciao");
       
       y = y*2.551 + 50;
       sprintf(y_str,"%f",y);
       VAL_TO_SPI( y_str[0], y_str[1], 132);
       
       z = z*2.551 + 50;
       sprintf(z_str,"%f",z);
       VAL_TO_SPI( z_str[0], z_str[1], 130);
        
    }
}

  
float conversion(char buf)
{
    float val=0;
    if( (buf/128) >= 1)
       {
            buf -= 128; 
            val -= 128;  
        }
       
       if( (buf/64) >= 1)
       {
            buf-= 64;
            val += 64;
       }
       if( (buf/32) >= 1)
       {
            buf -=32;
            val += 32;
       }
       if( (buf/16) >= 1)
       {
            buf -=16;
            val += 16;
       }
       if( (buf/8) >= 1)
       {
            buf -=8;
            val += 8;
       }
       if( (buf/4) >= 1)
       {
            buf -= 4;
            val += 4;
       }
       if( (buf/2) >= 1)
       {
            buf -= 2;
            val += 2;
       }
       if( (buf/1) >= 1)
       {
            val+= 1;
       }
    val = (float) val/64;
    return val;
}

void VAL_TO_SPI( char tens, char unit, int pos_unit)
{
    int pos_tens;
    pos_tens = pos_unit + 1;
    DigitalOut  (SS,0);
    device.write(pos_unit);
    device.write(unit);
    DigitalOut  (SS,1);
    DigitalOut  (SS,0);
    device.write(pos_tens);
    device.write(tens);
    DigitalOut  (SS,1);
    return;   
}