nammerda

Dependencies:   MMA8451Q mbed

Committer:
giogal
Date:
Tue Jan 20 17:54:31 2015 +0000
Revision:
0:d0bdc26cb259
Child:
1:941ec2a0e942
ciao;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giogal 0:d0bdc26cb259 1 #include "mbed.h"
giogal 0:d0bdc26cb259 2 #include "MMA8451Q.h"
giogal 0:d0bdc26cb259 3
giogal 0:d0bdc26cb259 4 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
giogal 0:d0bdc26cb259 5 PinName const SDA = PTE25;
giogal 0:d0bdc26cb259 6 PinName const SCL = PTE24;
giogal 0:d0bdc26cb259 7 #else
giogal 0:d0bdc26cb259 8 #error TARGET NOT DEFINED
giogal 0:d0bdc26cb259 9 #endif
giogal 0:d0bdc26cb259 10
giogal 0:d0bdc26cb259 11 #define MMA8451_I2C_ADDRESS (0x1d<<1)
giogal 0:d0bdc26cb259 12 #define CNTRL_REG_1 0x2A
giogal 0:d0bdc26cb259 13 #define CNTRL_REG_2 0x2B
giogal 0:d0bdc26cb259 14 #define CNTRL_REG_3 0x2C
giogal 0:d0bdc26cb259 15 #define CNTRL_REG_4 0x2D
giogal 0:d0bdc26cb259 16 #define X_acc 0x01
giogal 0:d0bdc26cb259 17 #define Y_acc 0x03
giogal 0:d0bdc26cb259 18 #define Z_acc 0x05
giogal 0:d0bdc26cb259 19 #define STATUS 0x00
giogal 0:d0bdc26cb259 20
giogal 0:d0bdc26cb259 21 PinName const MOSI = PTD2;
giogal 0:d0bdc26cb259 22 PinName const MISO = PTD3;
giogal 0:d0bdc26cb259 23 PinName const SCK = PTD1;
giogal 0:d0bdc26cb259 24 PinName const SS = PTD0;
giogal 0:d0bdc26cb259 25
giogal 0:d0bdc26cb259 26 //funzione di conversione dell'accelerazione da un numero in CA2 al valore espresso in m/s
giogal 0:d0bdc26cb259 27 //viene richiamata per le accelerazioni su ognuno dei tre assi
giogal 0:d0bdc26cb259 28 float conversion(char buf);
giogal 0:d0bdc26cb259 29
giogal 0:d0bdc26cb259 30 //funzione che trasmette ad uno schermo in SPI i valori delle accelerazioni in codice ascii
giogal 0:d0bdc26cb259 31 void VAL_TO_SPI( char tens, char unit, int pos_unit);
giogal 0:d0bdc26cb259 32
giogal 0:d0bdc26cb259 33 //inizializzazione dell protocollo SPI
giogal 0:d0bdc26cb259 34 SPI device(MOSI, MISO, SCK); // mosi, miso, clock
giogal 0:d0bdc26cb259 35
giogal 0:d0bdc26cb259 36 int Inter=0;
giogal 0:d0bdc26cb259 37 void isr(){
giogal 0:d0bdc26cb259 38 Inter=1;
giogal 0:d0bdc26cb259 39 }
giogal 0:d0bdc26cb259 40
giogal 0:d0bdc26cb259 41 int main(void)
giogal 0:d0bdc26cb259 42 {
giogal 0:d0bdc26cb259 43 //Classe I2C presente nella libreria mbed
giogal 0:d0bdc26cb259 44 I2C i2c(SDA,SCL);
giogal 0:d0bdc26cb259 45
giogal 0:d0bdc26cb259 46 //trasmettiamo 8 bit alla volta
giogal 0:d0bdc26cb259 47 //POL = 0, PHA = 1
giogal 0:d0bdc26cb259 48 device.format(8,1);
giogal 0:d0bdc26cb259 49 //frequenza della trasmissione SPI
giogal 0:d0bdc26cb259 50 device.frequency(500000);
giogal 0:d0bdc26cb259 51
giogal 0:d0bdc26cb259 52 //Inizializzazione dell'accelerometro configurando pin e l'indirizzo
giogal 0:d0bdc26cb259 53 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
giogal 0:d0bdc26cb259 54 int address = MMA8451_I2C_ADDRESS;
giogal 0:d0bdc26cb259 55
giogal 0:d0bdc26cb259 56 //variabili che ci servono nel programma
giogal 0:d0bdc26cb259 57 float x, y, z;
giogal 0:d0bdc26cb259 58 char stato=STATUS;
giogal 0:d0bdc26cb259 59 char data_stato;
giogal 0:d0bdc26cb259 60
giogal 0:d0bdc26cb259 61 const char X_addr=X_acc;
giogal 0:d0bdc26cb259 62 const char Y_addr=Y_acc;
giogal 0:d0bdc26cb259 63 const char Z_addr=Z_acc;
giogal 0:d0bdc26cb259 64
giogal 0:d0bdc26cb259 65 char z_buffer;
giogal 0:d0bdc26cb259 66 char y_buffer;
giogal 0:d0bdc26cb259 67 char x_buffer;
giogal 0:d0bdc26cb259 68
giogal 0:d0bdc26cb259 69 char x_str[8];
giogal 0:d0bdc26cb259 70 char y_str[8];
giogal 0:d0bdc26cb259 71 char z_str[8];
giogal 0:d0bdc26cb259 72
giogal 0:d0bdc26cb259 73 InterruptIn trig(PTA15);
giogal 0:d0bdc26cb259 74
giogal 0:d0bdc26cb259 75 //inizializziamo il registro di controllo a 0 per poterlo settare
giogal 0:d0bdc26cb259 76 char data[2] = {CNTRL_REG_1, 0x00};
giogal 0:d0bdc26cb259 77 i2c.write(address, data, 2);
giogal 0:d0bdc26cb259 78
giogal 0:d0bdc26cb259 79 char wr_2[2] = {CNTRL_REG_2, 0x04};
giogal 0:d0bdc26cb259 80 i2c.write(address, wr_2, 2);
giogal 0:d0bdc26cb259 81
giogal 0:d0bdc26cb259 82 char wr_4[2] = {CNTRL_REG_4, 0x01};
giogal 0:d0bdc26cb259 83 i2c.write(address, wr_4, 2);
giogal 0:d0bdc26cb259 84
giogal 0:d0bdc26cb259 85 char wr_3[2] = {CNTRL_REG_3, 0x02};
giogal 0:d0bdc26cb259 86 i2c.write(address, wr_3, 2);
giogal 0:d0bdc26cb259 87
giogal 0:d0bdc26cb259 88 //settiamo il registro di controllo
giogal 0:d0bdc26cb259 89 char wr_1[2]={CNTRL_REG_1, 0xFB};
giogal 0:d0bdc26cb259 90 i2c.write(address,wr_1, 2);
giogal 0:d0bdc26cb259 91
giogal 0:d0bdc26cb259 92
giogal 0:d0bdc26cb259 93
giogal 0:d0bdc26cb259 94 while (true) {
giogal 0:d0bdc26cb259 95
giogal 0:d0bdc26cb259 96 //Si legge l'indirizzo di stato nell'accelerometro per vedere se ha
giogal 0:d0bdc26cb259 97 //convertito nuovi valori di accelerazione
giogal 0:d0bdc26cb259 98 trig.rise(&isr);
giogal 0:d0bdc26cb259 99 if(Inter)
giogal 0:d0bdc26cb259 100 {
giogal 0:d0bdc26cb259 101 Inter = 0;
giogal 0:d0bdc26cb259 102 z = 0;
giogal 0:d0bdc26cb259 103 x = 0;
giogal 0:d0bdc26cb259 104 y = 0;
giogal 0:d0bdc26cb259 105 i2c.write(address,&Z_addr,1,true);
giogal 0:d0bdc26cb259 106 i2c.read(address,&z_buffer,1,false);
giogal 0:d0bdc26cb259 107
giogal 0:d0bdc26cb259 108 i2c.write(address,&X_addr,1,true);
giogal 0:d0bdc26cb259 109 i2c.read(address,&x_buffer,1,false);
giogal 0:d0bdc26cb259 110
giogal 0:d0bdc26cb259 111 i2c.write(address,&Y_addr,1,true);
giogal 0:d0bdc26cb259 112 i2c.read(address,&y_buffer,1,false);
giogal 0:d0bdc26cb259 113
giogal 0:d0bdc26cb259 114 //Richiamiamo la funzione di conversione per esprimere i
giogal 0:d0bdc26cb259 115 //valori letti in float
giogal 0:d0bdc26cb259 116 x = conversion(x_buffer);
giogal 0:d0bdc26cb259 117 x = x*2.551 + 50;
giogal 0:d0bdc26cb259 118 sprintf(x_str,"%f",x);
giogal 0:d0bdc26cb259 119 //VAL_TO_SPI( x_str[0], x_str[1], 134);
giogal 0:d0bdc26cb259 120 printf("X = %c %c", x_str[0], x_str[1]);
giogal 0:d0bdc26cb259 121 printf("\r\n");
giogal 0:d0bdc26cb259 122
giogal 0:d0bdc26cb259 123 y = conversion(y_buffer);
giogal 0:d0bdc26cb259 124 y = y*2.551 + 50;
giogal 0:d0bdc26cb259 125 sprintf(y_str,"%f",y);
giogal 0:d0bdc26cb259 126 //VAL_TO_SPI( y_str[0], y_str[1], 132);
giogal 0:d0bdc26cb259 127 printf("Y = %c %c", y_str[0], y_str[1]);
giogal 0:d0bdc26cb259 128 printf("\r\n");
giogal 0:d0bdc26cb259 129
giogal 0:d0bdc26cb259 130 z = conversion(z_buffer);
giogal 0:d0bdc26cb259 131 z = z*2.551 + 50;
giogal 0:d0bdc26cb259 132 sprintf(z_str,"%f",z);
giogal 0:d0bdc26cb259 133 //VAL_TO_SPI( z_str[0], z_str[1], 130);
giogal 0:d0bdc26cb259 134 printf("Z = %c %c", z_str[0], z_str[1]);
giogal 0:d0bdc26cb259 135 printf("\r\n");
giogal 0:d0bdc26cb259 136
giogal 0:d0bdc26cb259 137 printf("\n\r");
giogal 0:d0bdc26cb259 138
giogal 0:d0bdc26cb259 139 }
giogal 0:d0bdc26cb259 140
giogal 0:d0bdc26cb259 141
giogal 0:d0bdc26cb259 142 }
giogal 0:d0bdc26cb259 143 }
giogal 0:d0bdc26cb259 144
giogal 0:d0bdc26cb259 145
giogal 0:d0bdc26cb259 146 float conversion(char buf)
giogal 0:d0bdc26cb259 147 {
giogal 0:d0bdc26cb259 148 float val = 0;
giogal 0:d0bdc26cb259 149 if( (buf/128) >= 1)
giogal 0:d0bdc26cb259 150 {
giogal 0:d0bdc26cb259 151 buf -= 128;
giogal 0:d0bdc26cb259 152 val -= 128;
giogal 0:d0bdc26cb259 153 }
giogal 0:d0bdc26cb259 154
giogal 0:d0bdc26cb259 155 if( (buf/64) >= 1)
giogal 0:d0bdc26cb259 156 {
giogal 0:d0bdc26cb259 157 buf-= 64;
giogal 0:d0bdc26cb259 158 val += 64;
giogal 0:d0bdc26cb259 159 }
giogal 0:d0bdc26cb259 160 if( (buf/32) >= 1)
giogal 0:d0bdc26cb259 161 {
giogal 0:d0bdc26cb259 162 buf -=32;
giogal 0:d0bdc26cb259 163 val += 32;
giogal 0:d0bdc26cb259 164 }
giogal 0:d0bdc26cb259 165 if( (buf/16) >= 1)
giogal 0:d0bdc26cb259 166 {
giogal 0:d0bdc26cb259 167 buf -=16;
giogal 0:d0bdc26cb259 168 val += 16;
giogal 0:d0bdc26cb259 169 }
giogal 0:d0bdc26cb259 170 if( (buf/8) >= 1)
giogal 0:d0bdc26cb259 171 {
giogal 0:d0bdc26cb259 172 buf -=8;
giogal 0:d0bdc26cb259 173 val += 8;
giogal 0:d0bdc26cb259 174 }
giogal 0:d0bdc26cb259 175 if( (buf/4) >= 1)
giogal 0:d0bdc26cb259 176 {
giogal 0:d0bdc26cb259 177 buf -= 4;
giogal 0:d0bdc26cb259 178 val += 4;
giogal 0:d0bdc26cb259 179 }
giogal 0:d0bdc26cb259 180 if( (buf/2) >= 1)
giogal 0:d0bdc26cb259 181 {
giogal 0:d0bdc26cb259 182 buf -= 2;
giogal 0:d0bdc26cb259 183 val += 2;
giogal 0:d0bdc26cb259 184 }
giogal 0:d0bdc26cb259 185 if( (buf/1) >= 1)
giogal 0:d0bdc26cb259 186 {
giogal 0:d0bdc26cb259 187 val+= 1;
giogal 0:d0bdc26cb259 188 }
giogal 0:d0bdc26cb259 189 val = (float) val*9.8/64;
giogal 0:d0bdc26cb259 190 return val;
giogal 0:d0bdc26cb259 191 }
giogal 0:d0bdc26cb259 192
giogal 0:d0bdc26cb259 193
giogal 0:d0bdc26cb259 194 void VAL_TO_SPI( char tens, char unit, int pos_unit)
giogal 0:d0bdc26cb259 195 {
giogal 0:d0bdc26cb259 196 int pos_tens;
giogal 0:d0bdc26cb259 197 pos_tens = pos_unit + 1;
giogal 0:d0bdc26cb259 198 DigitalOut (SS,0);
giogal 0:d0bdc26cb259 199 device.write(pos_unit);
giogal 0:d0bdc26cb259 200 device.write(unit);
giogal 0:d0bdc26cb259 201 DigitalOut (SS,1);
giogal 0:d0bdc26cb259 202 DigitalOut (SS,0);
giogal 0:d0bdc26cb259 203 device.write(pos_tens);
giogal 0:d0bdc26cb259 204 device.write(tens);
giogal 0:d0bdc26cb259 205 DigitalOut (SS,1);
giogal 0:d0bdc26cb259 206 return;
giogal 0:d0bdc26cb259 207 }