Dependencies:   MMA8451Q mbed

Fork of Lab3_latest_21_01_2015_aggiornata by SDI 2014/2015

Committer:
capopolito
Date:
Sun Feb 08 17:34:52 2015 +0000
Revision:
7:3abddf195ada
Parent:
6:848474d4d02e
Questa ? la versione definitiva del codice dei Lab2_I2C e Lab3_SPI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
serenabpolito 0:4317f4b1a4b3 1 #include "mbed.h"
serenabpolito 0:4317f4b1a4b3 2 #include "MMA8451Q.h"
serenabpolito 0:4317f4b1a4b3 3 #include "I2C.h"
capopolito 3:f8f4a33c7aa2 4 #include "SPI.h"
capopolito 3:f8f4a33c7aa2 5 #include "DigitalIn.h"
capopolito 4:c40acfb63133 6 #include "DigitalOut.h"
capopolito 3:f8f4a33c7aa2 7
serenabpolito 0:4317f4b1a4b3 8
serenabpolito 0:4317f4b1a4b3 9 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
serenabpolito 0:4317f4b1a4b3 10 PinName const SDA = PTE25;
serenabpolito 0:4317f4b1a4b3 11 PinName const SCL = PTE24;
serenabpolito 0:4317f4b1a4b3 12 #elif defined (TARGET_KL05Z)
serenabpolito 0:4317f4b1a4b3 13 PinName const SDA = PTB4;
serenabpolito 0:4317f4b1a4b3 14 PinName const SCL = PTB3;
serenabpolito 0:4317f4b1a4b3 15 #elif defined (TARGET_K20D50M)
serenabpolito 0:4317f4b1a4b3 16 PinName const SDA = PTB1;
serenabpolito 0:4317f4b1a4b3 17 PinName const SCL = PTB0;
serenabpolito 0:4317f4b1a4b3 18 #else
serenabpolito 0:4317f4b1a4b3 19 #error TARGET NOT DEFINED
serenabpolito 0:4317f4b1a4b3 20 #endif
serenabpolito 0:4317f4b1a4b3 21
capopolito 3:f8f4a33c7aa2 22 //--RELATIVI ALLA COMUNICAZIONE SPI------
capopolito 3:f8f4a33c7aa2 23 PinName const mosi = PTD2; //mosi SPI1_mosi
capopolito 3:f8f4a33c7aa2 24 PinName const miso = PTD3; //miso SPI1_miso
capopolito 3:f8f4a33c7aa2 25 PinName const sck = PTD1; //sck SPI1_sck
capopolito 3:f8f4a33c7aa2 26 PinName const pcs0 = PTD0; //pcs0 SPI1_pcs0
capopolito 3:f8f4a33c7aa2 27 //--RELATIVI ALLA COMUNICAZIONE SPI------
serenabpolito 0:4317f4b1a4b3 28
capopolito 3:f8f4a33c7aa2 29 #define MMA8451_I2C_ADDRESS (0x1d<<1)
serenabpolito 0:4317f4b1a4b3 30 //instanzia e inizializza oggettto i2c della clase I2C
serenabpolito 0:4317f4b1a4b3 31 I2C i2c(SDA,SCL); // SDA I2C data line pin
capopolito 3:f8f4a33c7aa2 32 // SCL I2C clock line pin
serenabpolito 0:4317f4b1a4b3 33
serenabpolito 0:4317f4b1a4b3 34
capopolito 4:c40acfb63133 35 //instanzia e inizializza oggettto spi della classe SPI
capopolito 4:c40acfb63133 36 SPI spi(mosi,miso,sck);
capopolito 4:c40acfb63133 37 DigitalOut slave_select(pcs0,1); //inizializza slave-select
capopolito 4:c40acfb63133 38 //-------------------------------------------------------
capopolito 4:c40acfb63133 39
capopolito 3:f8f4a33c7aa2 40 //registri da impostare
capopolito 2:53521a18c3de 41 char CTRL_REG_1 = 0x2A ; //read/write // register address del CTRL_REG_1
capopolito 2:53521a18c3de 42 char CTRL_REG_2 = 0x2B ; //read/write // register address del CTRL_REG_2
capopolito 2:53521a18c3de 43 char CTRL_REG_3 = 0x2C ; //read/write // register address del CTRL_REG_3
capopolito 2:53521a18c3de 44 char CTRL_REG_4 = 0x2D ; //read/write // register address del CTRL_REG_4
capopolito 2:53521a18c3de 45 char OUT_X_MSB = 0x01 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse x
capopolito 2:53521a18c3de 46 char OUT_Y_MSB = 0x03 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse y
capopolito 2:53521a18c3de 47 char OUT_Z_MSB = 0x05 ; //read only // parte più significativa del registro contenete l'accelerazione sull'asse z
capopolito 2:53521a18c3de 48 char XYZ_DATA_CFG = 0x0E; //read/write // register address del XYZ_DATA_CFG
capopolito 2:53521a18c3de 49 char ASLP_COUNT= 0x29; //read/write // register address SLEEP TIME-OUT COUNTER
capopolito 2:53521a18c3de 50 char SYSMOD = 0x0B; //read only // register address SYSMOD System Mode Register
capopolito 4:c40acfb63133 51 //registri da impostare-------------------------------------------------------------------
capopolito 4:c40acfb63133 52
capopolito 4:c40acfb63133 53 //-indirizzo del dipositivo con l'ultimo bit asserito per la lettura e negato per la scrittura
capopolito 3:f8f4a33c7aa2 54 char address_wr = 0x3A ; // byte per eseguire lettura: address_device + bit_wr(W=0)
capopolito 3:f8f4a33c7aa2 55 char address_rd = 0x3B ; // byte per eseguire scrittura: address_device + bit_rd(R=1)
capopolito 4:c40acfb63133 56 //------------------------------------------------------------------------------------------------
capopolito 4:c40acfb63133 57
capopolito 4:c40acfb63133 58 //--variabile di appoggio utilizzata per scrivere e leggere i registri
capopolito 3:f8f4a33c7aa2 59 char data = 0x00 ; // inizalizza la variabile data con le impostazioni da scrivere su CTRL_REG_1
capopolito 3:f8f4a33c7aa2 60
capopolito 3:f8f4a33c7aa2 61 //--registri aggiunti e settati per prova ------------------------------------------------------------------
capopolito 3:f8f4a33c7aa2 62 char FF_MT_CFG = 0x15; //read/write // registera addres del FF_MT_CFG (Frefall/Motionn Configuration register
capopolito 3:f8f4a33c7aa2 63 char FF_MT_THS = 0x17; //read/write // register address del FF_MT_THS Freefall and Motion Threshold
capopolito 3:f8f4a33c7aa2 64 char FF_MT_COUNT = 0x18; //read/write //register address del FF_MT_COUNT Debounce Register
capopolito 3:f8f4a33c7aa2 65 //--registri aggiunti e settati per prova ---------------------------------------------------------------------
serenabpolito 0:4317f4b1a4b3 66
serenabpolito 0:4317f4b1a4b3 67 int main(void)
serenabpolito 0:4317f4b1a4b3 68 {
capopolito 4:c40acfb63133 69 printf("inizio \n");
capopolito 4:c40acfb63133 70 //--setting delle impostazioni del SPI in base alle specifiche------------------
capopolito 4:c40acfb63133 71 int bits = 8;
capopolito 4:c40acfb63133 72 int mode = 1;
capopolito 4:c40acfb63133 73 spi.format(bits,mode);//definisce formato spi con 16 bit e pol=0 e pha=1
capopolito 4:c40acfb63133 74 //di default la frequenza è 1MHz
capopolito 4:c40acfb63133 75 char command_wr=0x80; //comando per la scrittura (10000DDD), di default nella locazione DDD=000
capopolito 4:c40acfb63133 76 //int command_rd=0; //comando per la lettura (00000DDD), dib default nella locazione DDD=000
capopolito 4:c40acfb63133 77 //non utilizzato !
capopolito 4:c40acfb63133 78 //--setting delle impostazioni della SPI come da specifiche------------------------
serenabpolito 0:4317f4b1a4b3 79
capopolito 4:c40acfb63133 80 //impostazione dei registri dell'I2C con scrittura Single Byte Write
serenabpolito 0:4317f4b1a4b3 81 // setta impostazioni su CTRL_REG_1
capopolito 3:f8f4a33c7aa2 82 data = 0x58 ; // setta la variabile data con le impostazioni da scrivere su CTRL_REG_1
capopolito 2:53521a18c3de 83 //Bit 7-> ASLP_RATE1 = 0
capopolito 2:53521a18c3de 84 //Bit 6-> ASLP_RATE0 = 1 -> // Il sample rate in sleep è 6.25 Hz vedi AN070
capopolito 2:53521a18c3de 85 //Bit 5-> DR2 = 0
capopolito 2:53521a18c3de 86 //Bit 4-> DR1 = 1
capopolito 2:53521a18c3de 87 //Bit 3-> DR0 = 1 -> // Il sample rate in wake è 100 Hz vedi AN070
capopolito 2:53521a18c3de 88 //Bit 2-> LNOISE = 0
capopolito 3:f8f4a33c7aa2 89 //Bit 1-> F_READ = 0 -> //Faste read is enabled, acquissco un solo byte!
capopolito 2:53521a18c3de 90 //Bit 0-> ACTIVE = 0 -> //Mette il dispositivo in standby per settare gli altri registri
serenabpolito 0:4317f4b1a4b3 91 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 92 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 93 i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 94 i2c.write(data); // scrivi il "data" già inizializzato con le impostazioni del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 95 i2c.stop();
capopolito 3:f8f4a33c7aa2 96 //NOTE:
capopolito 3:f8f4a33c7aa2 97 //La modalità "FAST READ", che si attiva asserendo il bit F_READ, può non essere impostata perchè
capopolito 3:f8f4a33c7aa2 98 //per campionare il dato con risoluzione 8 bit è sufficente leggere solo la parte
capopolito 3:f8f4a33c7aa2 99 //significativa del dato contenuta nei registri OUT_MSB_X, Y e Z.
capopolito 3:f8f4a33c7aa2 100 //Cambio la frequenz di campionamento, valore dell'ODR (Over Sampling Ratio),
capopolito 3:f8f4a33c7aa2 101 //dalla modalità sleep alla modalità wake (in modo da accorgermi di essere in wake)
capopolito 3:f8f4a33c7aa2 102
serenabpolito 0:4317f4b1a4b3 103
serenabpolito 0:4317f4b1a4b3 104 // setta impostazioni su CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 105 data=0x04; //imposta data con le impostazioni del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 106 //ST=0 disabilita il self-test
serenabpolito 0:4317f4b1a4b3 107 //RST=0 disabilita modalità reset
serenabpolito 0:4317f4b1a4b3 108 //bit 5 don't care
serenabpolito 0:4317f4b1a4b3 109 //SMODS0=SMODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in sleep
capopolito 2:53521a18c3de 110 //SLPE=1 abilita l'autosleep -> vedi AN070
serenabpolito 0:4317f4b1a4b3 111 //MODS0=MODS1=0 setta la modalità oversampling_mode = normal , quando è in modalità in active
serenabpolito 0:4317f4b1a4b3 112 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 113 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 114 i2c.write(CTRL_REG_2); // scrivi l'indirizzo del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 115 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_2
serenabpolito 0:4317f4b1a4b3 116 i2c.stop();
serenabpolito 0:4317f4b1a4b3 117
serenabpolito 0:4317f4b1a4b3 118 // setta impostazioni su CTRL_REG_3
capopolito 3:f8f4a33c7aa2 119 data=0x68; //imposta data con le impostazioni del CTRL_REG_3 attineti alle gestioni dell'interupt in modalità sleep
serenabpolito 0:4317f4b1a4b3 120 // vedi data-sheet
capopolito 1:944348c50dd6 121 //Bit 7-> FIFO GATE = 0
capopolito 3:f8f4a33c7aa2 122 //Bit 6-> WAKE_TRANS = 1
capopolito 3:f8f4a33c7aa2 123 //Bit 5-> WAKE_LNDRPT = 1
capopolito 3:f8f4a33c7aa2 124 //Bit 4-> WAKE_PULSE = 0
capopolito 3:f8f4a33c7aa2 125 //Bit 3-> WAKE_FF_MT = 1
capopolito 1:944348c50dd6 126 //Bit 2-> don't care
capopolito 1:944348c50dd6 127 //Bit 1-> IPOL = 0
capopolito 1:944348c50dd6 128 //Bit 0-> PP_OD = 0
serenabpolito 0:4317f4b1a4b3 129 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 130 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 131 i2c.write(CTRL_REG_3); // scrivi l'indirizzo del CTRL_REG_3
serenabpolito 0:4317f4b1a4b3 132 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_3
serenabpolito 0:4317f4b1a4b3 133 i2c.stop();
serenabpolito 0:4317f4b1a4b3 134
serenabpolito 0:4317f4b1a4b3 135 // setta impostazioni su CTRL_REG_4
capopolito 3:f8f4a33c7aa2 136 data=0xB5; //imposta data con le impostazioni del CTRL_REG_4 attineti alle gestioni dell'interupt
capopolito 1:944348c50dd6 137 // vedi data-sheet
capopolito 2:53521a18c3de 138 //Bit 7-> IN_EN_ASLP = 1 ; se = 1 Auto-SLEEP/WAKE interrupt enabled -> vedi AN070
capopolito 1:944348c50dd6 139 //Bit 6-> INT_EN_FIFO = 0
capopolito 3:f8f4a33c7aa2 140 //Bit 5-> INT_EN_TRANS = 1
capopolito 3:f8f4a33c7aa2 141 //Bit 4-> INT_EN_LNDPRT = 1
capopolito 3:f8f4a33c7aa2 142 //Bit 3-> INT_EN_PULSE = 0
capopolito 3:f8f4a33c7aa2 143 //Bit 2-> INT_EN_FF_MT = 1
capopolito 1:944348c50dd6 144 //Bit 1-> don't care = 0
capopolito 3:f8f4a33c7aa2 145 //Bit 0-> INT_EN_DRDY = 1 ;// abilito data ready per motivi di logica interna pur no usandolo
serenabpolito 0:4317f4b1a4b3 146 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 147 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 148 i2c.write(CTRL_REG_4); // scrivi l'indirizzo del CTRL_REG_4
serenabpolito 0:4317f4b1a4b3 149 i2c.write(data); // scrivi il "data" contenete le impostazioni del CTRL_REG_4
serenabpolito 0:4317f4b1a4b3 150 i2c.stop();
capopolito 1:944348c50dd6 151
serenabpolito 0:4317f4b1a4b3 152 // setta impostazioni su XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 153 data=0x00; //imposta data con le impostazioni del XYZ_DATA_CFG attineti alla dinamica che si vuole acquisire (+-2g)
serenabpolito 0:4317f4b1a4b3 154 // FS1=FS0=0 imposta la dinamica +-2g
serenabpolito 0:4317f4b1a4b3 155 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 156 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 157 i2c.write(XYZ_DATA_CFG); // scrivi l'indirizzo del XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 158 i2c.write(data); // scrivi il "data" contenete le impostazioni del XYZ_DATA_CFG
serenabpolito 0:4317f4b1a4b3 159 i2c.stop();
capopolito 1:944348c50dd6 160
capopolito 3:f8f4a33c7aa2 161 //setta impostazioni su ASLP_COUNT
capopolito 4:c40acfb63133 162 data=0xF0; //->impostato da me valore max
capopolito 3:f8f4a33c7aa2 163 //data=0x01; //impostato da me valore min
capopolito 3:f8f4a33c7aa2 164 //data=0x04; //imposta data con le impostazioni del ASLP_COUNT -> impostato dal professore!!!
capopolito 3:f8f4a33c7aa2 165 i2c.start(); // dai lo start
capopolito 3:f8f4a33c7aa2 166 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 167 i2c.write(ASLP_COUNT); // scrivi l'indirizzo del ASLP_COUNT
capopolito 3:f8f4a33c7aa2 168 i2c.write(data); // scrivi il "data" contenete le impostazioni del ASLP_COUNT
capopolito 3:f8f4a33c7aa2 169 i2c.stop();
capopolito 3:f8f4a33c7aa2 170
capopolito 7:3abddf195ada 171 //---registri impostati per gestire gli interrupt ---------------------------------
capopolito 3:f8f4a33c7aa2 172
capopolito 1:944348c50dd6 173 // setta impostazioni su FF_MT_CFG (Frefall/Motion Configuration Register (Read/Write)
capopolito 3:f8f4a33c7aa2 174 data=0xF8; //imposta data con le impostazioni del FF_MT_SRC attineti quando vogliamo svegliare il dispositivo dal wake
capopolito 1:944348c50dd6 175 //Bit 7-> ELE = 1 ;event flag latch enabled in FF_MT_SRC
capopolito 3:f8f4a33c7aa2 176 //Bit 6-> OAE = 1 ;Motion Flag (if=1 OR combination) (if=1 AND combination)
capopolito 1:944348c50dd6 177 //Bit 5-> ZEFE = 1 ;se = 0 asse Z event dection disabled ; se = 1 asse X raise event flag on measured acceleration value beyond present threshold
capopolito 1:944348c50dd6 178 //Bit 4-> YEFE = 1 ;se = 0 asse Y event dection disabled ; se = 1 asse Y raise event flag on measured acceleration value beyond present threshold
capopolito 1:944348c50dd6 179 //Bit 3-> XEFE = 1 ;se = 0 asse X event dection disabled ; se = 1 asse X raise event flag on measured acceleration value beyond present threshold
capopolito 1:944348c50dd6 180 //Bit 2-> = 0 don't care
capopolito 1:944348c50dd6 181 //Bit 1-> = 0 don't care
capopolito 1:944348c50dd6 182 //Bit 0-> = 0 don't care
capopolito 1:944348c50dd6 183 i2c.start(); // dai lo start
capopolito 1:944348c50dd6 184 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 1:944348c50dd6 185 i2c.write(FF_MT_CFG); // scrivi l'indirizzo del FF_MT_CFG
capopolito 1:944348c50dd6 186 i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_CFG
capopolito 1:944348c50dd6 187 i2c.stop();
capopolito 3:f8f4a33c7aa2 188
capopolito 3:f8f4a33c7aa2 189
capopolito 3:f8f4a33c7aa2 190 // setta impostazioni su FF_MT_THS (Read/Write)
capopolito 3:f8f4a33c7aa2 191 data=0x04; //imposta data con le impostazioni del FF_MT_THS
capopolito 2:53521a18c3de 192 i2c.start(); // dai lo start
capopolito 2:53521a18c3de 193 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 194 i2c.write(FF_MT_THS); // scrivi l'indirizzo del FF_MT_THS
capopolito 3:f8f4a33c7aa2 195 i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_THS
capopolito 3:f8f4a33c7aa2 196 i2c.stop();
capopolito 3:f8f4a33c7aa2 197
capopolito 3:f8f4a33c7aa2 198 // setta impostazioni su FF_MT_COUNT (Read/Write)
capopolito 3:f8f4a33c7aa2 199 data=0x08; //imposta data con le impostazioni del FF_MT_COUNT
capopolito 3:f8f4a33c7aa2 200 i2c.start(); // dai lo start
capopolito 3:f8f4a33c7aa2 201 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 202 i2c.write(FF_MT_COUNT); // scrivi l'indirizzo del FF_MT_COUNT
capopolito 3:f8f4a33c7aa2 203 i2c.write(data); // scrivi il "data" contenete le impostazioni del FF_MT_COUNT
capopolito 2:53521a18c3de 204 i2c.stop();
capopolito 1:944348c50dd6 205
capopolito 7:3abddf195ada 206 //---registri impostati per gestire gli interrupt ---------------------------------
capopolito 3:f8f4a33c7aa2 207
capopolito 3:f8f4a33c7aa2 208
capopolito 2:53521a18c3de 209 //!!! attiva il dispositivo (esce da standby) !!!
serenabpolito 0:4317f4b1a4b3 210 // setta impostazioni su CTRL_REG_1
capopolito 3:f8f4a33c7aa2 211 data=0x5B ; // mette a 1 il bit ACTIVE e lascia invariati gli altri (già impostati)
capopolito 3:f8f4a33c7aa2 212 i2c.start(); // dai lo start
serenabpolito 0:4317f4b1a4b3 213 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
serenabpolito 0:4317f4b1a4b3 214 i2c.write(CTRL_REG_1); // scrivi l'indirizzo del CTRL_REG_1
capopolito 3:f8f4a33c7aa2 215 i2c.write(data); // scrivi il "data" in le impostazioni del CTRL_REG_1
serenabpolito 0:4317f4b1a4b3 216 i2c.stop();
serenabpolito 0:4317f4b1a4b3 217
capopolito 3:f8f4a33c7aa2 218 //PER ACCENDERE LED
serenabpolito 0:4317f4b1a4b3 219 PwmOut rled(LED1);
serenabpolito 0:4317f4b1a4b3 220 PwmOut gled(LED2);
capopolito 1:944348c50dd6 221 PwmOut bled(LED3);
capopolito 1:944348c50dd6 222
capopolito 7:3abddf195ada 223 //verifica della corretta scrittura dei principali registri, mediante lettura Single Byte Read
capopolito 2:53521a18c3de 224
capopolito 3:f8f4a33c7aa2 225 //lettura single byte read del registro CTRL_REG_1
capopolito 3:f8f4a33c7aa2 226 char ctrl_reg_1 = 0x00;
capopolito 2:53521a18c3de 227 i2c.start();
capopolito 3:f8f4a33c7aa2 228 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 2:53521a18c3de 229 i2c.write(CTRL_REG_1); // scrivi l'indirizzo del registro
capopolito 2:53521a18c3de 230 i2c.start();
capopolito 3:f8f4a33c7aa2 231 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 2:53521a18c3de 232 ctrl_reg_1=i2c.read(0);
capopolito 2:53521a18c3de 233 i2c.stop();
capopolito 3:f8f4a33c7aa2 234 printf("CTRL_REG_1: %1.2x \n", ctrl_reg_1); // in esadecimale
capopolito 3:f8f4a33c7aa2 235 //lettura single byte read del registro CTRL_REG_2
capopolito 2:53521a18c3de 236 char ctrl_reg_2 = 0x00;
capopolito 2:53521a18c3de 237 i2c.start();
capopolito 3:f8f4a33c7aa2 238 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 2:53521a18c3de 239 i2c.write(CTRL_REG_2); // scrivi l'indirizzo del registro
capopolito 2:53521a18c3de 240 i2c.start();
capopolito 3:f8f4a33c7aa2 241 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 2:53521a18c3de 242 ctrl_reg_2=i2c.read(0);
capopolito 2:53521a18c3de 243 i2c.stop();
capopolito 3:f8f4a33c7aa2 244 printf("CTRL_REG_2: %1.2x \n", ctrl_reg_2); //in esadecimale
capopolito 7:3abddf195ada 245 //lettura single byte read del registro CTRL_REG_3
capopolito 3:f8f4a33c7aa2 246 char ctrl_reg_3 = 0x00;
capopolito 2:53521a18c3de 247 i2c.start();
capopolito 3:f8f4a33c7aa2 248 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 2:53521a18c3de 249 i2c.write(CTRL_REG_3); // scrivi l'indirizzo del registro
capopolito 2:53521a18c3de 250 i2c.start();
capopolito 3:f8f4a33c7aa2 251 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 2:53521a18c3de 252 ctrl_reg_3=i2c.read(0);
capopolito 2:53521a18c3de 253 i2c.stop();
capopolito 3:f8f4a33c7aa2 254 printf("CTRL_REG_3: %1.2x \n", ctrl_reg_3); //in esadecimale
capopolito 3:f8f4a33c7aa2 255 //lettura single byte read del registro CTRL_REG_4
capopolito 2:53521a18c3de 256 char ctrl_reg_4 = 0x00;
capopolito 2:53521a18c3de 257 i2c.start();
capopolito 3:f8f4a33c7aa2 258 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 2:53521a18c3de 259 i2c.write(CTRL_REG_4); // scrivi l'indirizzo del registro
capopolito 2:53521a18c3de 260 i2c.start();
capopolito 3:f8f4a33c7aa2 261 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 2:53521a18c3de 262 ctrl_reg_4=i2c.read(0);
capopolito 2:53521a18c3de 263 i2c.stop();
capopolito 3:f8f4a33c7aa2 264 printf("CTRL_REG_4: %1.2x \n", ctrl_reg_4); //in esadecimale
capopolito 3:f8f4a33c7aa2 265 //lettura single byte read del registro ASLP_COUNT
capopolito 3:f8f4a33c7aa2 266 char aslp_count = 0x00;
capopolito 2:53521a18c3de 267 i2c.start();
capopolito 3:f8f4a33c7aa2 268 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 2:53521a18c3de 269 i2c.write(ASLP_COUNT); // scrivi l'indirizzo del registro
capopolito 2:53521a18c3de 270 i2c.start();
capopolito 3:f8f4a33c7aa2 271 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 2:53521a18c3de 272 aslp_count=i2c.read(0);
capopolito 2:53521a18c3de 273 i2c.stop();
capopolito 3:f8f4a33c7aa2 274 printf("ASLP_COUNT: %1.2x \n", aslp_count); //in esadecimale
capopolito 7:3abddf195ada 275 //verifica della corretta scrittura dei registri principali------------------------------
capopolito 3:f8f4a33c7aa2 276
capopolito 2:53521a18c3de 277 char sysmod = 0x00;
capopolito 4:c40acfb63133 278
capopolito 4:c40acfb63133 279 float x_axis, y_axis, z_axis;
capopolito 4:c40acfb63133 280 float x_axis_norm, y_axis_norm, z_axis_norm;
capopolito 4:c40acfb63133 281 int x_tens, x_unit, y_tens, y_unit, z_tens, z_unit;
capopolito 4:c40acfb63133 282 char x_tens_ascii, x_unit_ascii, y_tens_ascii, y_unit_ascii, z_tens_ascii, z_unit_ascii;
capopolito 4:c40acfb63133 283 char loc_x_tens=0x00, loc_x_unit=0x01, loc_y_tens=0x02, loc_y_unit=0x03, loc_z_tens=0x04, loc_z_unit=0x05;
capopolito 4:c40acfb63133 284 //location DDD=000, DDD=001, DDD=010, DDD=011, DDD=100, DDD=101;
capopolito 4:c40acfb63133 285
capopolito 4:c40acfb63133 286 char command_location=0x00; // in caso di scrittura 1000 DDD
capopolito 4:c40acfb63133 287
serenabpolito 0:4317f4b1a4b3 288 while (true) {
capopolito 3:f8f4a33c7aa2 289 printf("SYSMOD_pre_read: %1.2x \n", sysmod);
capopolito 3:f8f4a33c7aa2 290 wait(0.1);
capopolito 3:f8f4a33c7aa2 291 //lettura dello stato dell'accelerometro wake o sleep
capopolito 7:3abddf195ada 292 //lettura single Byte Read contenuto di SYSMOD System Mode Register
capopolito 3:f8f4a33c7aa2 293 // Bit 7-> FGERR
capopolito 3:f8f4a33c7aa2 294 // Bit 6-> FGT_4
capopolito 3:f8f4a33c7aa2 295 // Bit 5-> FGT_3
capopolito 3:f8f4a33c7aa2 296 // Bit 4-> FGT_2
capopolito 3:f8f4a33c7aa2 297 // Bit 3-> FGT_1
capopolito 3:f8f4a33c7aa2 298 // Bit 2-> FGT_0
capopolito 3:f8f4a33c7aa2 299 // Bit 1-> SYSMOD1
capopolito 3:f8f4a33c7aa2 300 // Bit 0-> SYSMOD0
capopolito 3:f8f4a33c7aa2 301 // SYSMOD[1:0]
capopolito 3:f8f4a33c7aa2 302 // System Mode. Default value: 00.
capopolito 3:f8f4a33c7aa2 303 // 00: STANDBY mode
capopolito 3:f8f4a33c7aa2 304 // 01: WAKE mode
capopolito 3:f8f4a33c7aa2 305 // 10: SLEEP mode
capopolito 1:944348c50dd6 306 i2c.start();
capopolito 3:f8f4a33c7aa2 307 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 308 i2c.write(SYSMOD); // scrivi l'indirizzo del registro
capopolito 1:944348c50dd6 309 i2c.start();
capopolito 3:f8f4a33c7aa2 310 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 2:53521a18c3de 311 sysmod=i2c.read(0);
capopolito 2:53521a18c3de 312 i2c.stop();
capopolito 3:f8f4a33c7aa2 313 printf("SYSMOD_post_read: %1.2x \n", sysmod);
capopolito 2:53521a18c3de 314 wait(0.1f);
capopolito 3:f8f4a33c7aa2 315 if ( (sysmod &0x02) == 0x02) { // if SYSMOD1,SYSMOD0 = 1,0
capopolito 3:f8f4a33c7aa2 316 wait(0.1f);
capopolito 3:f8f4a33c7aa2 317 printf("I'm sleeping , SYSMOD: %1.2x \n",sysmod);
capopolito 3:f8f4a33c7aa2 318 rled = 0.0f;
capopolito 3:f8f4a33c7aa2 319 gled = 0.0f;
capopolito 3:f8f4a33c7aa2 320 bled = 0.0f;
capopolito 7:3abddf195ada 321
capopolito 2:53521a18c3de 322 } //chiusra del if
capopolito 3:f8f4a33c7aa2 323 if ( (sysmod &0x01) ==0x01){ // if SYSMOD1,SYSMOD0 = 0,1
capopolito 3:f8f4a33c7aa2 324 wait(0.1f);
capopolito 3:f8f4a33c7aa2 325 printf("Good morning! , SYSMOD: %1.2x \n", sysmod);
capopolito 3:f8f4a33c7aa2 326 //lettura degli assi con lettura Single Byte Read
capopolito 3:f8f4a33c7aa2 327 // asse x
capopolito 3:f8f4a33c7aa2 328 i2c.start();
capopolito 3:f8f4a33c7aa2 329 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 330 i2c.write(OUT_X_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse X
capopolito 3:f8f4a33c7aa2 331 i2c.start();
capopolito 3:f8f4a33c7aa2 332 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 3:f8f4a33c7aa2 333 x_axis=i2c.read(0); // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su x_axis
capopolito 3:f8f4a33c7aa2 334 i2c.stop();
capopolito 3:f8f4a33c7aa2 335 // asse y
capopolito 3:f8f4a33c7aa2 336 i2c.start();
capopolito 3:f8f4a33c7aa2 337 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 338 i2c.write(OUT_Y_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Y
capopolito 3:f8f4a33c7aa2 339 i2c.start();
capopolito 3:f8f4a33c7aa2 340 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 3:f8f4a33c7aa2 341 y_axis=i2c.read(0); // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su y_axis
capopolito 3:f8f4a33c7aa2 342 i2c.stop();
capopolito 3:f8f4a33c7aa2 343 // asse Z
capopolito 3:f8f4a33c7aa2 344 i2c.start();
capopolito 3:f8f4a33c7aa2 345 i2c.write(address_wr); // scrivi e passa l'indirizzo del dispositivo con bit di scrittura
capopolito 3:f8f4a33c7aa2 346 i2c.write(OUT_Z_MSB); // scrivi l'indirizzo del registro contente l'accelerazione sull'asse Z
capopolito 3:f8f4a33c7aa2 347 i2c.start();
capopolito 3:f8f4a33c7aa2 348 i2c.write(address_rd); // scrivi e passa l'indirizzo del dispositivo con bit di read
capopolito 3:f8f4a33c7aa2 349 z_axis=i2c.read(0); // scrive bit di NAK (non acknowlodgement) e salva il dato sul bus su z_axis
capopolito 3:f8f4a33c7aa2 350 i2c.stop();
capopolito 3:f8f4a33c7aa2 351 //accendo led
capopolito 4:c40acfb63133 352 rled = 1.0f - x_axis/64;
capopolito 4:c40acfb63133 353 gled = 1.0f - y_axis/64;
capopolito 4:c40acfb63133 354 bled = 1.0f - z_axis/64;
capopolito 3:f8f4a33c7aa2 355 //scrivo sulla seriale
capopolito 7:3abddf195ada 356 printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x_axis/64, y_axis/64, z_axis/64);
capopolito 4:c40acfb63133 357 //SCRIVO DATI SU DISPLAY A SETTE SEGMENTI DELLA SCHEDA DE2 MEDIANTE SPI
capopolito 4:c40acfb63133 358 //accelerazione sull'asse x
capopolito 4:c40acfb63133 359 x_axis_norm=x_axis/64*99; // normalizzo tra [0 99]
capopolito 4:c40acfb63133 360 x_tens = (int(x_axis_norm/10)); // ottengo le decine
capopolito 4:c40acfb63133 361 x_unit = (x_axis_norm-10*x_tens); // ottengo le unità
capopolito 4:c40acfb63133 362 x_tens_ascii = ( '0' + (x_tens) ); // ottengo le decine in ASCII
capopolito 4:c40acfb63133 363 x_unit_ascii = ( '0' + (x_unit) ); // ottengo le unità in ASCII
capopolito 4:c40acfb63133 364 //accelerazione sull'asse y
capopolito 4:c40acfb63133 365 y_axis_norm=y_axis/64*99; // normalizzo tra [0 99]
capopolito 4:c40acfb63133 366 y_tens = (int(y_axis_norm/10)); // ottengo le decine
capopolito 4:c40acfb63133 367 y_unit = (y_axis_norm-10*y_tens); // ottengo le unità
capopolito 4:c40acfb63133 368 y_tens_ascii = ( '0' + (y_tens) ); // ottengo le decine in ASCII
capopolito 4:c40acfb63133 369 y_unit_ascii = ( '0' + (y_unit) ); // ottengo le unità in ASCII
capopolito 4:c40acfb63133 370 //accelerazione sull'asse z
capopolito 4:c40acfb63133 371 z_axis_norm=z_axis/64*99; // normalizzo tra [0 99]
capopolito 4:c40acfb63133 372 z_tens = (int(z_axis_norm/10)); // ottengo le decine
capopolito 4:c40acfb63133 373 z_unit = (z_axis_norm-10*z_tens); // ottengo le unità
capopolito 4:c40acfb63133 374 z_tens_ascii = ( '0' + (z_tens) ); // ottengo le decine in ASCII
capopolito 4:c40acfb63133 375 z_unit_ascii = ( '0' + (z_unit) ); // ottengo le unità in ASCII
capopolito 4:c40acfb63133 376
capopolito 4:c40acfb63133 377 //stampo nella seriale componente x,y,z dell'accelereazione normailzzate tra 0 e 99
capopolito 7:3abddf195ada 378
capopolito 4:c40acfb63133 379 printf("ax_norm: %1.2f, ay_norm: %1.2f, az_norm: %1.2f\n", x_axis_norm, y_axis_norm, z_axis_norm);
capopolito 4:c40acfb63133 380 //stampo nella seriale le decine delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
capopolito 4:c40acfb63133 381 printf("ax_tens: %1.2d, ay_tens: %1.2d, az_tens: %1.2d\n", x_tens, y_tens, z_tens);
capopolito 4:c40acfb63133 382 //stampo nella seriale le unità delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
capopolito 4:c40acfb63133 383 printf("ax_unit: %1.2d, ay_unit: %1.2d, az_unit: %1.2d\n", x_unit, y_unit, z_unit);
capopolito 4:c40acfb63133 384 //stampo nella seriale le decine in ascii delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
capopolito 4:c40acfb63133 385 printf("ax_tens_ascii: %1.2c, ay_tens_ascii: %1.2c, az_tens_ascii: %1.2c\n", x_tens_ascii, y_tens_ascii, z_tens_ascii);
capopolito 4:c40acfb63133 386 //stampo nella seriale le unità in ascii delle componenti x,y,z dell'accelereazione normailzzate tra 0 e 99
capopolito 4:c40acfb63133 387 printf("ax_unit_ascii: %1.2c, ay_unit_ascii: %1.2c, az_unit_ascii: %1.2c\n", x_unit_ascii, y_unit_ascii, z_unit_ascii);
capopolito 7:3abddf195ada 388
capopolito 7:3abddf195ada 389 //stampo nella seriale componente x,y,z dell'accelereazione normailzzate tra 0 e 99
capopolito 4:c40acfb63133 390
capopolito 4:c40acfb63133 391 //scrivo nei display i valori dell'accelerazione
capopolito 3:f8f4a33c7aa2 392
capopolito 4:c40acfb63133 393 //componente x dell'accelarazione
capopolito 4:c40acfb63133 394 //scrivo codice ascii delle decine nel display nel display dedicato
capopolito 5:bc92e421d5f8 395 command_location = ( command_wr | loc_x_tens ) ; //1000 000 = 0x80
capopolito 5:bc92e421d5f8 396 //command_location = 0x80;
capopolito 4:c40acfb63133 397 slave_select.write(0);
capopolito 4:c40acfb63133 398 spi.write(command_location);
capopolito 4:c40acfb63133 399 spi.write(x_tens_ascii);
capopolito 4:c40acfb63133 400 slave_select.write(1);
capopolito 4:c40acfb63133 401 //scrivo codice ascii delle unità nel display nel display dedicato
capopolito 6:848474d4d02e 402 command_location = ( command_wr | loc_x_unit ) ; //1000 001 = 0x81
capopolito 5:bc92e421d5f8 403 //command_location = 0x81;
capopolito 4:c40acfb63133 404 slave_select.write(0);
capopolito 4:c40acfb63133 405 spi.write(command_location);
capopolito 4:c40acfb63133 406 spi.write(x_unit_ascii);
capopolito 4:c40acfb63133 407 slave_select.write(1);
capopolito 4:c40acfb63133 408 //componente y dell'accelarazione
capopolito 4:c40acfb63133 409 //scrivo codice ascii delle decine nel display nel display dedicato
capopolito 6:848474d4d02e 410 command_location = ( command_wr | loc_y_tens ); //1000 010 = 0x82
capopolito 5:bc92e421d5f8 411 //command_location = 0x82;
capopolito 4:c40acfb63133 412 slave_select.write(0); //asserisco lo slave select attivo basso
capopolito 4:c40acfb63133 413 spi.write(command_location);
capopolito 4:c40acfb63133 414 spi.write(y_tens_ascii);
capopolito 4:c40acfb63133 415 slave_select.write(1); //nego lo slave select attivo basso
capopolito 4:c40acfb63133 416 //scrivo codice ascii delle unità nel display nel display dedicato
capopolito 6:848474d4d02e 417 command_location = ( command_wr | loc_y_unit ); //1000 011 = 0x83
capopolito 5:bc92e421d5f8 418 //command_location = 0x83;
capopolito 4:c40acfb63133 419 slave_select.write(0); //asserisco lo slave select attivo basso
capopolito 4:c40acfb63133 420 spi.write(command_location);
capopolito 4:c40acfb63133 421 spi.write(y_unit_ascii);
capopolito 7:3abddf195ada 422 slave_select.write(1); //nego lo slave select attivo basso
capopolito 4:c40acfb63133 423 //componente z dell'accelarazione
capopolito 4:c40acfb63133 424 //scrivo codice ascii delle decine nel display nel display dedicato
capopolito 6:848474d4d02e 425 command_location = ( command_wr | loc_z_tens ); //1000 100 = 0x84
capopolito 5:bc92e421d5f8 426 //command_location = 0x84;
capopolito 4:c40acfb63133 427 slave_select.write(0); //asserisco lo slave select attivo basso
capopolito 4:c40acfb63133 428 spi.write(command_location);
capopolito 4:c40acfb63133 429 spi.write(z_tens_ascii);
capopolito 4:c40acfb63133 430 slave_select.write(1); //nego lo slave select attivo basso
capopolito 4:c40acfb63133 431 //scrivo codice ascii delle unità nel display nel display dedicato
capopolito 6:848474d4d02e 432 command_location = ( command_wr | loc_z_unit ); //1000 101 = 0x85
capopolito 5:bc92e421d5f8 433 //command_location = 0x85;
capopolito 4:c40acfb63133 434 slave_select.write(0);
capopolito 4:c40acfb63133 435 spi.write(command_location);
capopolito 4:c40acfb63133 436 spi.write(z_unit_ascii);
capopolito 4:c40acfb63133 437 slave_select.write(1);
capopolito 7:3abddf195ada 438 //scrivo nei display i valori dell'accelerazione
capopolito 3:f8f4a33c7aa2 439 } //close 2nd if
capopolito 3:f8f4a33c7aa2 440 }//close while
capopolito 3:f8f4a33c7aa2 441 }//close main
serenabpolito 0:4317f4b1a4b3 442