
nammerda
main.cpp@0:d0bdc26cb259, 2015-01-20 (annotated)
- Committer:
- giogal
- Date:
- Tue Jan 20 17:54:31 2015 +0000
- Revision:
- 0:d0bdc26cb259
- Child:
- 1:941ec2a0e942
ciao;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |