Dependencies:   MMA8451Q mbed

Fork of Lab3_latest_21_01_2015_aggiornata by SDI 2014/2015

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