senza wake_up

Dependencies:   MMA8451Q mbed

Committer:
giogal
Date:
Tue Jan 20 17:10:46 2015 +0000
Revision:
2:620019419136
Parent:
1:adb624063b97
x

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Thierro 0:ef6b25a481a5 1 #include "mbed.h"
Thierro 0:ef6b25a481a5 2 #include "MMA8451Q.h"
giogal 1:adb624063b97 3
Thierro 0:ef6b25a481a5 4 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
Thierro 0:ef6b25a481a5 5 PinName const SDA = PTE25;
Thierro 0:ef6b25a481a5 6 PinName const SCL = PTE24;
Thierro 0:ef6b25a481a5 7 #else
Thierro 0:ef6b25a481a5 8 #error TARGET NOT DEFINED
Thierro 0:ef6b25a481a5 9 #endif
Thierro 0:ef6b25a481a5 10
Thierro 0:ef6b25a481a5 11 #define MMA8451_I2C_ADDRESS (0x1d<<1)
Thierro 0:ef6b25a481a5 12 #define CNTRL_REG_1 0x2A
giogal 2:620019419136 13 #define CNTRL_REG_2 0x2B
giogal 2:620019419136 14 #define CNTRL_REG_3 0x2C
giogal 2:620019419136 15 #define CNTRL_REG_4 0x2D
Thierro 0:ef6b25a481a5 16 #define X_acc 0x01
Thierro 0:ef6b25a481a5 17 #define Y_acc 0x03
Thierro 0:ef6b25a481a5 18 #define Z_acc 0x05
Thierro 0:ef6b25a481a5 19 #define STATUS 0x00
Thierro 0:ef6b25a481a5 20
giogal 1:adb624063b97 21 //funzione di conversione dell'accelerazione da un numero in CA2 al valore espresso in m/s
giogal 1:adb624063b97 22 //viene richiamata per le accelerazioni su ognuno dei tre assi
Thierro 0:ef6b25a481a5 23 float conversion(char buf);
Thierro 0:ef6b25a481a5 24
giogal 2:620019419136 25 int Inter=0;
giogal 2:620019419136 26 void isr(){
giogal 2:620019419136 27 Inter=1;
giogal 2:620019419136 28 }
giogal 2:620019419136 29
Thierro 0:ef6b25a481a5 30 int main(void)
Thierro 0:ef6b25a481a5 31 {
giogal 1:adb624063b97 32 //Classe I2C presente nella libreria mbed
Thierro 0:ef6b25a481a5 33 I2C i2c(SDA,SCL);
giogal 1:adb624063b97 34
giogal 1:adb624063b97 35 //Inizializzazione dell'accelerometro configurando pin e l'indirizzo
Thierro 0:ef6b25a481a5 36 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
giogal 1:adb624063b97 37 int address = MMA8451_I2C_ADDRESS;
Thierro 0:ef6b25a481a5 38
giogal 1:adb624063b97 39 //variabili che ci servono nel programma
Thierro 0:ef6b25a481a5 40 float x, y, z;
Thierro 0:ef6b25a481a5 41 char stato=STATUS;
Thierro 0:ef6b25a481a5 42 char data_stato;
giogal 1:adb624063b97 43
Thierro 0:ef6b25a481a5 44 const char X_addr=X_acc;
Thierro 0:ef6b25a481a5 45 const char Y_addr=Y_acc;
Thierro 0:ef6b25a481a5 46 const char Z_addr=Z_acc;
giogal 1:adb624063b97 47
Thierro 0:ef6b25a481a5 48 char z_buffer;
Thierro 0:ef6b25a481a5 49 char y_buffer;
Thierro 0:ef6b25a481a5 50 char x_buffer;
giogal 2:620019419136 51 InterruptIn trig(PTA15);
giogal 2:620019419136 52
giogal 2:620019419136 53 PwmOut rled(LED1);
giogal 2:620019419136 54 PwmOut gled(LED2);
giogal 2:620019419136 55 PwmOut bled(LED3);
giogal 1:adb624063b97 56
giogal 1:adb624063b97 57 //inizializziamo il registro di controllo a 0 per poterlo settare
Thierro 0:ef6b25a481a5 58 char data[2] = {CNTRL_REG_1, 0x00};
Thierro 0:ef6b25a481a5 59 i2c.write(address, data, 2);
Thierro 0:ef6b25a481a5 60
giogal 2:620019419136 61 char wr_2[2] = {CNTRL_REG_2, 0x04};
giogal 2:620019419136 62 i2c.write(address, wr_2, 2);
giogal 2:620019419136 63
giogal 2:620019419136 64 char wr_4[2] = {CNTRL_REG_4, 0x01};
giogal 2:620019419136 65 i2c.write(address, wr_4, 2);
giogal 1:adb624063b97 66
giogal 2:620019419136 67 char wr_3[2] = {CNTRL_REG_3, 0x02};
giogal 2:620019419136 68 i2c.write(address, wr_3, 2);
giogal 2:620019419136 69
giogal 2:620019419136 70 //settiamo il registro di controllo
giogal 2:620019419136 71 char wr_1[2]={CNTRL_REG_1, 0xFB};
giogal 2:620019419136 72 i2c.write(address,wr_1, 2);
giogal 1:adb624063b97 73
giogal 2:620019419136 74
Thierro 0:ef6b25a481a5 75
Thierro 0:ef6b25a481a5 76 while (true) {
Thierro 0:ef6b25a481a5 77
giogal 1:adb624063b97 78 //Si legge l'indirizzo di stato nell'accelerometro per vedere se ha
giogal 1:adb624063b97 79 //convertito nuovi valori di accelerazione
Thierro 0:ef6b25a481a5 80 i2c.write(address,&stato,1,true);
Thierro 0:ef6b25a481a5 81 i2c.read(address,&data_stato,1,false);
Thierro 0:ef6b25a481a5 82
giogal 2:620019419136 83 trig.rise(&isr);
giogal 2:620019419136 84 if(Inter)
Thierro 0:ef6b25a481a5 85 {
giogal 2:620019419136 86 Inter = 0;
Thierro 0:ef6b25a481a5 87 z = 0;
Thierro 0:ef6b25a481a5 88 x = 0;
Thierro 0:ef6b25a481a5 89 y = 0;
Thierro 0:ef6b25a481a5 90 i2c.write(address,&Z_addr,1,true);
Thierro 0:ef6b25a481a5 91 i2c.read(address,&z_buffer,1,false);
Thierro 0:ef6b25a481a5 92
Thierro 0:ef6b25a481a5 93 i2c.write(address,&X_addr,1,true);
Thierro 0:ef6b25a481a5 94 i2c.read(address,&x_buffer,1,false);
Thierro 0:ef6b25a481a5 95
Thierro 0:ef6b25a481a5 96 i2c.write(address,&Y_addr,1,true);
Thierro 0:ef6b25a481a5 97 i2c.read(address,&y_buffer,1,false);
Thierro 0:ef6b25a481a5 98
giogal 1:adb624063b97 99 //Richiamiamo la funzione di conversione per esprimere i
giogal 1:adb624063b97 100 //valori letti in float
Thierro 0:ef6b25a481a5 101 x = conversion(x_buffer);
Thierro 0:ef6b25a481a5 102 printf("X= %f\n\r",x);
giogal 1:adb624063b97 103
Thierro 0:ef6b25a481a5 104 y = conversion(y_buffer);
Thierro 0:ef6b25a481a5 105 printf("Y= %f\n\r",y);
giogal 1:adb624063b97 106
Thierro 0:ef6b25a481a5 107 z = conversion(z_buffer);
Thierro 0:ef6b25a481a5 108 printf("Z= %f\n\r",z);
giogal 1:adb624063b97 109
Thierro 0:ef6b25a481a5 110 printf("\n\r");
giogal 1:adb624063b97 111
giogal 1:adb624063b97 112 //Regolo l'accensione dei led per verificare la presenza di accelerazioni
giogal 1:adb624063b97 113 rled = 1.0f - abs(x);
Thierro 0:ef6b25a481a5 114 gled = 1.0f - abs(y);
Thierro 0:ef6b25a481a5 115 bled = 1.0f - abs(z);
Thierro 0:ef6b25a481a5 116 }
Thierro 0:ef6b25a481a5 117
Thierro 0:ef6b25a481a5 118
Thierro 0:ef6b25a481a5 119 }
Thierro 0:ef6b25a481a5 120 }
Thierro 0:ef6b25a481a5 121
Thierro 0:ef6b25a481a5 122
Thierro 0:ef6b25a481a5 123 float conversion(char buf)
Thierro 0:ef6b25a481a5 124 {
giogal 1:adb624063b97 125 float val = 0;
Thierro 0:ef6b25a481a5 126 if( (buf/128) >= 1)
Thierro 0:ef6b25a481a5 127 {
Thierro 0:ef6b25a481a5 128 buf -= 128;
Thierro 0:ef6b25a481a5 129 val -= 128;
Thierro 0:ef6b25a481a5 130 }
Thierro 0:ef6b25a481a5 131
Thierro 0:ef6b25a481a5 132 if( (buf/64) >= 1)
Thierro 0:ef6b25a481a5 133 {
Thierro 0:ef6b25a481a5 134 buf-= 64;
Thierro 0:ef6b25a481a5 135 val += 64;
Thierro 0:ef6b25a481a5 136 }
Thierro 0:ef6b25a481a5 137 if( (buf/32) >= 1)
Thierro 0:ef6b25a481a5 138 {
Thierro 0:ef6b25a481a5 139 buf -=32;
Thierro 0:ef6b25a481a5 140 val += 32;
Thierro 0:ef6b25a481a5 141 }
Thierro 0:ef6b25a481a5 142 if( (buf/16) >= 1)
Thierro 0:ef6b25a481a5 143 {
Thierro 0:ef6b25a481a5 144 buf -=16;
Thierro 0:ef6b25a481a5 145 val += 16;
Thierro 0:ef6b25a481a5 146 }
Thierro 0:ef6b25a481a5 147 if( (buf/8) >= 1)
Thierro 0:ef6b25a481a5 148 {
Thierro 0:ef6b25a481a5 149 buf -=8;
Thierro 0:ef6b25a481a5 150 val += 8;
Thierro 0:ef6b25a481a5 151 }
Thierro 0:ef6b25a481a5 152 if( (buf/4) >= 1)
Thierro 0:ef6b25a481a5 153 {
Thierro 0:ef6b25a481a5 154 buf -= 4;
Thierro 0:ef6b25a481a5 155 val += 4;
Thierro 0:ef6b25a481a5 156 }
Thierro 0:ef6b25a481a5 157 if( (buf/2) >= 1)
Thierro 0:ef6b25a481a5 158 {
Thierro 0:ef6b25a481a5 159 buf -= 2;
Thierro 0:ef6b25a481a5 160 val += 2;
Thierro 0:ef6b25a481a5 161 }
Thierro 0:ef6b25a481a5 162 if( (buf/1) >= 1)
Thierro 0:ef6b25a481a5 163 {
Thierro 0:ef6b25a481a5 164 val+= 1;
Thierro 0:ef6b25a481a5 165 }
giogal 2:620019419136 166 val = (float) val*9.8/64;
Thierro 0:ef6b25a481a5 167 return val;
Thierro 0:ef6b25a481a5 168 }