Dependencies:   MMA8451Q mbed

main.cpp

Committer:
giogal
Date:
2015-01-20
Revision:
0:d0bdc26cb259
Child:
1:941ec2a0e942

File content as of revision 0:d0bdc26cb259:

#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 CNTRL_REG_3 0x2C
#define CNTRL_REG_4 0x2D
#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;

//funzione di conversione dell'accelerazione da un numero in CA2 al valore espresso in m/s
//viene richiamata per le accelerazioni su ognuno dei tre assi
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

int Inter=0;
void isr(){
    Inter=1;
    }
    
int main(void)
{
    //Classe I2C presente nella libreria mbed
    I2C i2c(SDA,SCL);
    
      //trasmettiamo 8 bit alla volta
    //POL = 0, PHA = 1
    device.format(8,1);
    //frequenza della trasmissione SPI
    device.frequency(500000);
    
    //Inizializzazione dell'accelerometro configurando pin e l'indirizzo
    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
    int address = MMA8451_I2C_ADDRESS;
    
    //variabili che ci servono nel programma
    float x, y, z;
    char stato=STATUS;
    char data_stato;
    
    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];
    
    InterruptIn trig(PTA15);
    
    //inizializziamo il registro di controllo a 0 per poterlo settare
    char data[2] = {CNTRL_REG_1, 0x00};
    i2c.write(address, data, 2);
    
    char wr_2[2] = {CNTRL_REG_2, 0x04};
    i2c.write(address, wr_2, 2);
    
    char wr_4[2] = {CNTRL_REG_4, 0x01};
    i2c.write(address, wr_4, 2);
    
    char wr_3[2] = {CNTRL_REG_3, 0x02};
    i2c.write(address, wr_3, 2);

    //settiamo il registro di controllo
    char wr_1[2]={CNTRL_REG_1, 0xFB};
    i2c.write(address,wr_1, 2);
    
   

    while (true) {
       
       //Si legge l'indirizzo di stato nell'accelerometro per vedere se ha
       //convertito nuovi valori di accelerazione
       trig.rise(&isr);
       if(Inter)
       {
        Inter = 0;
        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);
       
       //Richiamiamo la funzione di conversione per esprimere i
       //valori letti in float
       x = conversion(x_buffer);
       x = x*2.551 + 50;
       sprintf(x_str,"%f",x);
       //VAL_TO_SPI( x_str[0], x_str[1], 134);
       printf("X = %c %c", x_str[0], x_str[1]);
       printf("\r\n");
       
       y = conversion(y_buffer);
       y = y*2.551 + 50;
       sprintf(y_str,"%f",y);
       //VAL_TO_SPI( y_str[0], y_str[1], 132);
       printf("Y = %c %c", y_str[0], y_str[1]);
       printf("\r\n");
       
       z = conversion(z_buffer);
       z = z*2.551 + 50;
       sprintf(z_str,"%f",z);
       //VAL_TO_SPI( z_str[0], z_str[1], 130);
       printf("Z = %c %c", z_str[0], z_str[1]);
       printf("\r\n");
       
       printf("\n\r"); 
       
        }
       
        
    }
}


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*9.8/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;   
}