laboratorio09/01/2015

Dependencies:   MMA8451Q mbed

Committer:
giogal
Date:
Tue Jan 20 11:33:52 2015 +0000
Revision:
2:4a0b5f2947d1
Parent:
1:1df877428dff
Child:
3:58faa1496c51
Seciao;

Who changed what in which revision?

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