Autor Tema: ¿Alguien uso el acelerometro MMA8451 de Freescale ?  (Leído 12028 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
¿Alguien uso el acelerometro MMA8451 de Freescale ?
« en: 12 de Mayo de 2013, 22:44:13 »
Eso.
Si alguien lo ha usado, me gustaría si me puede aclarar varios conceptos sobre el mismo.
Si bien mi aplicación es bastante simple, tal vez podría usar algunas de sus particularidades y convertir mi aplicación en algo bien interesante. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #1 en: 13 de Mayo de 2013, 01:26:35 »
Yo usé su hermano MMA8453 en un proyecto, ¿qué necesitas?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #2 en: 13 de Mayo de 2013, 09:12:56 »
Que funciones usaste (yo recien logro comunicarlo), y como lo programaste para usar esas funciones.
Supongo que será en C, no es así ?

Por ejemplo, en que valor de medida muestras los resultados (valor numérico directo, convertido a números positivos o negativos, en aceleracion G, etcétera) ??
« Última modificación: 13 de Mayo de 2013, 09:18:02 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #3 en: 13 de Mayo de 2013, 11:12:47 »
Pues lo utilicé de forma simple, sin profundizar en sus potenciales. Realmente sólo me interesaba saber el valor de G en los tres ejes, con una configuración de +-2G

Y lo leía desde mi firmware usando la función LecturaAcelerometro() cuando lo necesitaba

Código: C
  1. /***********************************************************************************************\
  2. * Freescale MMA8451,2,3Q Driver
  3. *
  4. * Filename: mma845x.c
  5. *
  6. *
  7. * (c) Copyright 2010, Freescale, Inc.  All rights reserved.
  8. *
  9. * No part of this document must be reproduced in any form - including copied,
  10. * transcribed, printed or by any electronic means - without specific written
  11. * permission from Freescale Semiconductor.
  12. *
  13. \***********************************************************************************************/
  14.  
  15.  
  16. /***********************************************************************************************\
  17. * Private macros
  18. \***********************************************************************************************/
  19.  
  20. #include "MMA8453.h"
  21. #define SlaveAddressIIC 0x38            // Es equivalente a 0x1C rotado un bit a la izquierda
  22.  
  23.  
  24. void IIC_RegWrite(int8 Direccion, int8 Registro, int8 Dato)
  25. {
  26.         #ifndef ANULA_ACELEROMETRO
  27.                 i2c_start();
  28.                 i2c_write(Direccion);
  29.                 i2c_write(Registro);
  30.                 i2c_write(Dato);
  31.                 i2c_stop();
  32.                 output_float(PIN_C3);
  33.                 output_float(PIN_C4);
  34.         #endif
  35. }
  36.  
  37. int8 IIC_RegRead(int8 Direccion, int8 Registro)
  38. {
  39.         int8 dato;
  40.        
  41.         #ifndef ANULA_ACELEROMETRO
  42.                 i2c_start();
  43.                 i2c_write(Direccion);
  44.                 i2c_write(Registro);
  45.                 i2c_start();
  46.                 i2c_write(Direccion+1);
  47.                 dato = i2c_read(0);
  48.                 i2c_stop();
  49.                 output_float(PIN_C3);
  50.                 output_float(PIN_C4);
  51.         #endif
  52.         return (dato);
  53. }
  54.  
  55.  
  56. /*********************************************************\
  57. * Put MMA845xQ into Active Mode
  58. \*********************************************************/
  59. void MMA845x_Active ()
  60. {
  61.   IIC_RegWrite(SlaveAddressIIC, CTRL_REG1, (IIC_RegRead(SlaveAddressIIC, CTRL_REG1) | ACTIVE_MASK));
  62. }
  63.  
  64. /*********************************************************\
  65. * Put MMA845xQ into Standby Mode
  66. \*********************************************************/
  67. void MMA845x_Standby (void)
  68. {
  69.   byte n;
  70.   /*
  71.   **  Read current value of System Control 1 Register.
  72.   **  Put sensor into Standby Mode.
  73.   **  Return with previous value of System Control 1 Register.
  74.   */
  75.   n = IIC_RegRead(SlaveAddressIIC, CTRL_REG1);
  76.   IIC_RegWrite(SlaveAddressIIC, CTRL_REG1, n & ~ACTIVE_MASK);
  77. }
  78.  
  79. /*********************************************************\
  80. * Initialize MMA845xQ
  81. \*********************************************************/
  82. void MMA845x_Init (void)
  83. {
  84.   MMA845x_Standby();
  85.   /*
  86.   **  Configure sensor for:
  87.   **    - Sleep Mode Poll Rate of 50Hz (20ms)
  88.   **    - System Output Data Rate of 200Hz (5ms)
  89.   **    - Full Scale of +/-2g
  90.   */
  91.   IIC_RegWrite(SlaveAddressIIC, CTRL_REG1, ASLP_RATE_20MS+DATA_RATE_5MS);
  92.   IIC_RegWrite(SlaveAddressIIC, XYZ_DATA_CFG_REG, FULL_SCALE_2G);
  93. }
  94.  
  95.  
  96. float Conv10bitsAFloat(int16 dato){
  97.         float signo=1;
  98.        
  99.         if (dato>0x7FFF) {
  100.                 signo=-1;
  101.                 dato= ~dato + 1;
  102.         }
  103.         dato=dato>>6;
  104.         return((float)dato*signo);                     
  105. }      
  106.  
  107. void LecturaAcelerometro() {
  108.         int8 Dato[6];
  109.         int8 j;
  110.        
  111.         for (j=0;j<6;j++) {
  112.                 Dato[j]=IIC_RegRead(SlaveAddressIIC, j+1);
  113.                 };     
  114.        
  115.         Dx=make16(Dato[0],Dato[1]);
  116.         Dy=make16(Dato[2],Dato[3]);
  117.         Dz=make16(Dato[4],Dato[5]);    
  118.  
  119.         Ax=Conv10bitsAFloat(Dx)/51.25125;
  120.         Ay=Conv10bitsAFloat(Dy)/51.25125;
  121.         Az=Conv10bitsAFloat(Dz)/51.25125;
  122.        
  123. }

Código: C
  1. /***********************************************************************************************\
  2. * Freescale MMA8451,2,3Q Driver
  3. *
  4. * Filename: mma845x.h
  5. *
  6. *
  7. * (c) Copyright 2010, Freescale, Inc.  All rights reserved.
  8. *
  9. * No part of this document must be reproduced in any form - including copied,
  10. * transcribed, printed or by any electronic means - without specific written
  11. * permission from Freescale Semiconductor.
  12. *
  13. \***********************************************************************************************/
  14. #ifndef _MMA845X_H_
  15. #define _MMA845X_H_
  16.  
  17. /***********************************************************************************************\
  18. * Public macros
  19. \***********************************************************************************************/
  20.  
  21. #define MMA845x_IIC_ADDRESS       0x38
  22.  
  23. /***********************************************************************************************
  24. **
  25. **  MMA845xQ Sensor Internal Registers
  26. */
  27. enum
  28. {
  29.   MMA845x_STATUS_00 = 0,          // 0x00
  30.   MMA845x_OUT_X_MSB,              // 0x01
  31.   MMA845x_OUT_X_LSB,              // 0x02
  32.   MMA845x_OUT_Y_MSB,              // 0x03
  33.   MMA845x_OUT_Y_LSB,              // 0x04
  34.   MMA845x_OUT_Z_MSB,              // 0x05
  35.   MMA845x_OUT_Z_LSB,              // 0x06
  36.   MMA845x_F_STATUS,               // 0x08
  37.   MMA845x_F_SETUP,                // 0x09
  38.   MMA845x_TRIG_CFG,               // 0x0A
  39.   MMA845x_SYSMOD,                 // 0x0B
  40.   MMA845x_INT_SOURCE,             // 0x0C
  41.   MMA845x_WHO_AM_I,               // 0x0D
  42.   MMA845x_XYZ_DATA_CFG,           // 0x0E
  43.   MMA845x_HP_FILTER_CUTOFF,       // 0x0F
  44.   MMA845x_PL_STATUS,              // 0x10
  45.   MMA845x_PL_CFG,                 // 0x11
  46.   MMA845x_PL_COUNT,               // 0x12
  47.   MMA845x_PL_BF_ZCOMP,            // 0x13
  48.   MMA845x_PL_P_L_THS_REG,         // 0x14
  49.   MMA845x_FF_MT_CFG,              // 0x15
  50.   MMA845x_FF_MT_SRC,              // 0x16
  51.   MMA845x_FF_MT_THS,              // 0x17
  52.   MMA845x_FF_MT_COUNT,            // 0x18
  53.   MMA845x_TRANSIENT_CFG,          // 0x1D
  54.   MMA845x_TRANSIENT_SRC,          // 0x1E
  55.   MMA845x_TRANSIENT_THS,          // 0x1F
  56.   MMA845x_TRANSIENT_COUNT,        // 0x20
  57.   MMA845x_PULSE_CFG,              // 0x21
  58.   MMA845x_PULSE_SRC,              // 0x22
  59.   MMA845x_PULSE_THSX,             // 0x23
  60.   MMA845x_PULSE_THSY,             // 0x24
  61.   MMA845x_PULSE_THSZ,             // 0x25
  62.   MMA845x_PULSE_TMLT,             // 0x26
  63.   MMA845x_PULSE_LTCY,             // 0x27
  64.   MMA845x_PULSE_WIND,             // 0x28
  65.   MMA845x_ASLP_COUNT,             // 0x29
  66.   MMA845x_CTRL_REG1,              // 0x2A
  67.   MMA845x_CTRL_REG2,              // 0x2B
  68.   MMA845x_CTRL_REG3,              // 0x2C
  69.   MMA845x_CTRL_REG4,              // 0x2D
  70.   MMA845x_CTRL_REG5,              // 0x2E
  71.   MMA845x_OFF_X,                  // 0x2F
  72.   MMA845x_OFF_Y,                  // 0x30
  73.   MMA845x_OFF_Z                   // 0x31
  74.  
  75. };
  76.  
  77. /*
  78. **  STATUS Registers
  79. */
  80. #define STATUS_00_REG         0x00
  81. //
  82. #define ZYXOW_BIT             Bit._7
  83. #define ZOW_BIT               Bit._6
  84. #define YOR_BIT               Bit._5
  85. #define XOR_BIT               Bit._4
  86. #define ZYXDR_BIT             Bit._3
  87. #define ZDR_BIT               Bit._2
  88. #define YDR_BIT               Bit._1
  89. #define XDR_BIT               Bit._0
  90. //
  91. #define ZYXOW_MASK            0x80
  92. #define ZOW_MASK              0x40
  93. #define YOR_MASK              0x20
  94. #define XOR_MASK              0x10
  95. #define ZYXDR_MASK            0x08
  96. #define ZDR_MASK              0x04
  97. #define YDR_MASK              0x02
  98. #define XDR_MASK              0x01
  99.  
  100. /*
  101. **  XYZ Data Registers
  102. */
  103. #define OUT_X_MSB_REG         0x01
  104. #define OUT_X_LSB_REG         0x02
  105. #define OUT_Y_MSB_REG         0x03
  106. #define OUT_Y_LSB_REG         0x04
  107. #define OUT_Z_MSB_REG         0x05
  108. #define OUT_Z_LSB_REG         0x06
  109.  
  110.  
  111. /*
  112. **  WHO_AM_I Device ID Register
  113. */
  114. #define WHO_AM_I_REG          0x0D
  115. #define MMA8451Q_ID           0x1A
  116. #define MMA8452Q_ID           0x2A
  117. #define MMA8453Q_ID           0x3A
  118.  
  119. /*
  120. **  F_STATUS FIFO Status Register
  121. */
  122. #define F_STATUS_REG          0x00
  123. //
  124. #define F_OVF_BIT             Bit._7
  125. #define F_WMRK_FLAG_BIT       Bit._6
  126. #define F_CNT5_BIT            Bit._5
  127. #define F_CNT4_BIT            Bit._4
  128. #define F_CNT3_BIT            Bit._3
  129. #define F_CNT2_BIT            Bit._2
  130. #define F_CNT1_BIT            Bit._1
  131. #define F_CNT0_BIT            Bit._0
  132. //
  133. #define F_OVF_MASK            0x80
  134. #define F_WMRK_FLAG_MASK      0x40
  135. #define F_CNT5_MASK           0x20
  136. #define F_CNT4_MASK           0x10
  137. #define F_CNT3_MASK           0x08
  138. #define F_CNT2_MASK           0x04
  139. #define F_CNT1_MASK           0x02
  140. #define F_CNT0_MASK           0x01
  141. #define F_CNT_MASK            0x3F
  142.  
  143. /*
  144. **  F_SETUP FIFO Setup Register
  145. */
  146. #define F_SETUP_REG           0x09
  147. //
  148. #define F_MODE1_BIT           Bit._7
  149. #define F_MODE0_BIT           Bit._6
  150. #define F_WMRK5_BIT           Bit._5
  151. #define F_WMRK4_BIT           Bit._4
  152. #define F_WMRK3_BIT           Bit._3
  153. #define F_WMRK2_BIT           Bit._2
  154. #define F_WMRK1_BIT           Bit._1
  155. #define F_WMRK0_BIT           Bit._0
  156. //
  157. #define F_MODE1_MASK          0x80
  158. #define F_MODE0_MASK          0x40
  159. #define F_WMRK5_MASK          0x20
  160. #define F_WMRK4_MASK          0x10
  161. #define F_WMRK3_MASK          0x08
  162. #define F_WMRK2_MASK          0x04
  163. #define F_WMRK1_MASK          0x02
  164. #define F_WMRK0_MASK          0x01
  165. #define F_MODE_MASK           0xC0
  166. #define F_WMRK_MASK           0x3F
  167.  
  168.  
  169. /*
  170. ** TRIG CFG Register
  171. */
  172.  
  173. #define TRIG_CFG_REG        0x0A
  174. //
  175. #define TRIG_TRANS_BIT      Bit._5
  176. #define TRIG_LNDPRT_BIT     Bit._4
  177. #define TRIG_PULSE_BIT      Bit._3
  178. #define TRIG_FF_MT_BIT      Bit._2
  179. //
  180. #define TRIG_TRANS_MASK     0x20
  181. #define TRIG_LNDPRT_MASK    0x10
  182. #define TRIG_PULSE_MASK     0x08
  183. #define TRIG_FF_MT_MASK     0x04
  184.  
  185.  
  186. /*
  187. **  SYSMOD System Mode Register
  188. */
  189. #define SYSMOD_REG            0x0B
  190. //
  191. #define FGERR_BIT             Bit._7
  192. #define FGT_4_BIT             Bit._6
  193. #define FGT_3_BIT             Bit._5
  194. #define FGT_2_BIT             Bit._4
  195. #define FGT_1_BIT             Bit._3
  196. #define FGT_0_BIT             Bit._2
  197. #define SYSMOD1_BIT           Bit._1
  198. #define SYSMOD0_BIT           Bit._0
  199. //
  200. #define FGERR_MASK            0x80
  201. #define FGT_4MASK             0x40
  202. #define FGT_3MASK             0x20
  203. #define FGT_2MASK             0x10
  204. #define FGT_1MASK             0x08
  205. #define FGT_0MASK             0x04
  206. #define FGT_MASK              0x7C
  207. #define SYSMOD1_MASK          0x02
  208. #define SYSMOD0_MASK          0x01
  209. #define SYSMOD_MASK           0x03
  210.  
  211. /*
  212. **  INT_SOURCE System Interrupt Status Register
  213. */
  214. #define INT_SOURCE_REG        0x0C
  215. //
  216. #define SRC_ASLP_BIT          Bit._7
  217. #define SRC_FIFO_BIT          Bit._6
  218. #define SRC_TRANS_BIT         Bit._5
  219. #define SRC_LNDPRT_BIT        Bit._4
  220. #define SRC_PULSE_BIT         Bit._3
  221. #define SRC_FF_MT_1_BIT       Bit._2
  222. #define SRC_FF_MT_2_BIT       Bit._1
  223. #define SRC_DRDY_BIT          Bit._0
  224. //
  225. #define SRC_ASLP_MASK         0x80
  226. #define SRC_FIFO_MASK         0x40
  227. #define SRC_TRANS_MASK        0x20
  228. #define SRC_LNDPRT_MASK       0x10
  229. #define SRC_PULSE_MASK        0x08
  230. #define SRC_FF_MT_1_MASK      0x04
  231. #define SRC_FF_MT_2_MASK      0x02
  232. #define SRC_DRDY_MASK         0x01
  233.  
  234. /*
  235. **  XYZ_DATA_CFG Sensor Data Configuration Register
  236. */
  237. #define XYZ_DATA_CFG_REG      0x0E
  238. //
  239. #define HPF_OUT_BIT           Bit._4
  240. #define FS1_BIT               Bit._1
  241. #define FS0_BIT               Bit._0
  242. //
  243. #define HPF_OUT_MASK          0x10
  244. #define FS1_MASK              0x02
  245. #define FS0_MASK              0x01
  246. #define FS_MASK               0x03
  247.  
  248. #define FULL_SCALE_8G         FS1_MASK
  249. #define FULL_SCALE_4G         FS0_MASK
  250. #define FULL_SCALE_2G         0x00
  251.  
  252. /*
  253. **  HP_FILTER_CUTOFF High Pass Filter Register
  254. */
  255. #define HP_FILTER_CUTOFF_REG  0x0F
  256.  
  257. //
  258. #define PULSE_HPF_BYP         Bit._5
  259. #define PULSE_LPF_EN          Bit._4
  260. #define SEL1_BIT              Bit._1
  261. #define SEL0_BIT              Bit._0
  262. //
  263. #define PULSE_HPF_BYP_MASK    0x20
  264. #define PULSE_LPF_EN_MASK     0x10
  265. #define SEL1_MASK             0x02
  266. #define SEL0_MASK             0x01
  267. #define SEL_MASK              0x03
  268.  
  269. /*
  270. **  PL_STATUS Portrait/Landscape Status Register
  271. **  PL_PRE_STATUS Portrait/Landscape Previous Data Status Register
  272. */
  273. #define PL_STATUS_REG         0x10
  274.  
  275. //
  276. #define NEWLP_BIT             Bit._7
  277. #define LO_BIT                Bit._6
  278. #define LAPO1_BIT             Bit._2
  279. #define LAPO0_BIT             Bit._1
  280. #define BAFRO_BIT             Bit._0
  281. //
  282. #define NEWLP_MASK            0x80
  283. #define LO_MASK               0x40
  284. #define LAPO1_MASK            0x04
  285. #define LAPO0_MASK            0x02
  286. #define LAPO_MASK             0x06
  287. #define BAFRO_MASK            0x01
  288.  
  289.  
  290. /*
  291. **  PL_CFG Portrait/Landscape Configuration Register
  292. */
  293. #define PL_CFG_REG            0x11
  294. //
  295. #define DBCNTM_BIT            Bit._7
  296. #define PL_EN_BIT             Bit._6
  297. //
  298. #define DBCNTM_MASK           0x80
  299. #define PL_EN_MASK            0x40
  300.  
  301. /*
  302. **  PL_COUNT Portrait/Landscape Debounce Register
  303. */
  304. #define PL_COUNT_REG          0x12
  305.  
  306. /*
  307. **  PL_BF_ZCOMP Back/Front and Z Compensation Register
  308. */
  309. #define PL_BF_ZCOMP_REG       0x13
  310. //
  311. #define BKFR1_BIT             Bit._7
  312. #define BKFR0_BIT             Bit._6
  313. #define ZLOCK2_BIT            Bit._2
  314. #define ZLOCK1_BIT            Bit._1
  315. #define ZLOCK0_BIT            Bit._0
  316. //
  317. #define BKFR1_MASK            0x80
  318. #define BKFR0_MASK            0x40
  319. #define ZLOCK2_MASK           0x04
  320. #define ZLOCK1_MASK           0x02
  321. #define ZLOCK0_MASK           0x01
  322. #define BKFR_MASK             0xC0
  323. #define ZLOCK_MASK            0x07
  324.  
  325. /*
  326. **  PL_P_L_THS Portrait to Landscape Threshold Registers
  327. */
  328. #define PL_P_L_THS_REG        0x14
  329. //
  330. #define P_L_THS4_Bit          Bit._7
  331. #define P_L_THS3_Bit          Bit._6
  332. #define P_L_THS2_Bit          Bit._5
  333. #define P_L_THS1_Bit          Bit._4
  334. #define P_L_THS0_Bit          Bit._3
  335. #define HYS2_Bit              Bit._2
  336. #define HYS1_Bit              Bit._1
  337. #define HYS0_Bit              Bit._0
  338. //
  339. #define P_L_THS4_MASK         0x80
  340. #define P_L_THS3_MASK         0x40
  341. #define P_L_THS2_MASK         0x20
  342. #define P_L_THS1_MASK         0x10
  343. #define P_L_THS0_MASK         0x08
  344. #define P_L_THS_MASK          0xF8
  345. #define HYS2_MASK             0x04
  346. #define HYS1_MASK             0x02
  347. #define HYS0_MASK             0x01
  348. #define HYS_MASK              0x07
  349.  
  350.  
  351. /*
  352. **  FF_MT_CFG Freefall and Motion Configuration Registers
  353. */
  354. #define FF_MT_CFG_1_REG       0x15
  355. #define FF_MT_CFG_2_REG       0x19
  356. //
  357. #define ELE_BIT               Bit._7
  358. #define OAE_BIT               Bit._6
  359. #define ZEFE_BIT              Bit._5
  360. #define YEFE_BIT              Bit._4
  361. #define XEFE_BIT              Bit._3
  362. //
  363. #define ELE_MASK              0x80
  364. #define OAE_MASK              0x40
  365. #define ZEFE_MASK             0x20
  366. #define YEFE_MASK             0x10
  367. #define XEFE_MASK             0x08
  368.  
  369. /*
  370. **  FF_MT_SRC Freefall and Motion Source Registers
  371. */
  372. #define FF_MT_SRC_1_REG       0x16
  373. #define FF_MT_SRC_2_REG       0x1A
  374. //
  375. #define EA_BIT                Bit._7
  376. #define ZHE_BIT               Bit._5
  377. #define ZHP_BIT               Bit._4
  378. #define YHE_BIT               Bit._3
  379. #define YHP_BIT               Bit._2
  380. #define XHE_BIT               Bit._1
  381. #define XHP_BIT               Bit._0
  382. //
  383. #define EA_MASK               0x80
  384. #define ZHE_MASK              0x20
  385. #define ZHP_MASK              0x10
  386. #define YHE_MASK              0x08
  387. #define YHP_MASK              0x04
  388. #define XHE_MASK              0x02
  389. #define XHP_MASK              0x01
  390.  
  391. /*
  392. **  FF_MT_THS Freefall and Motion Threshold Registers
  393. **  TRANSIENT_THS Transient Threshold Register
  394. */
  395. #define FT_MT_THS_1_REG       0x17
  396. #define FT_MT_THS_2_REG       0x1B
  397. #define TRANSIENT_THS_REG     0x1F
  398. //
  399.  
  400. #define THS6_BIT              Bit._6
  401. #define THS5_BIT              Bit._5
  402. #define THS4_BIT              Bit._4
  403. #define THS3_BIT              Bit._3
  404. #define THS2_BIT              Bit._2
  405. #define THS1_BIT              Bit._1
  406. #define THS0_BIT              Bit._0
  407. //
  408.  
  409. #define THS6_MASK             0x40
  410. #define THS5_MASK             0x20
  411. #define THS4_MASK             0x10
  412. #define THS3_MASK             0x08
  413. #define THS2_MASK             0x04
  414. #define TXS1_MASK             0x02
  415. #define THS0_MASK             0x01
  416. #define THS_MASK              0x7F
  417.  
  418. /*
  419. **  FF_MT_COUNT Freefall Motion Count Registers
  420. */
  421. #define FF_MT_COUNT_1_REG     0x18
  422. #define FF_MT_COUNT_2_REG     0x1C
  423.  
  424. /*
  425. **  TRANSIENT_CFG Transient Configuration Register
  426. */
  427. #define TRANSIENT_CFG_REG     0x1D
  428. //
  429. #define TELE_BIT              Bit._4
  430. #define ZTEFE_BIT             Bit._3
  431. #define YTEFE_BIT             Bit._2
  432. #define XTEFE_BIT             Bit._1
  433. #define HPF_BYP_BIT           Bit._0
  434. //
  435. #define TELE_MASK             0x10
  436. #define ZTEFE_MASK            0x08
  437. #define YTEFE_MASK            0x04
  438. #define XTEFE_MASK            0x02
  439. #define HPF_BYP_MASK          0x01
  440.  
  441. /*
  442. **  TRANSIENT_SRC Transient Source Register
  443. */
  444. #define TRANSIENT_SRC_REG     0x1E
  445. //
  446. #define TEA_BIT               Bit._6
  447. #define ZTRANSE_BIT           Bit._5
  448. #define ZTRANSPOL_BIT         Bit._4
  449. #define YTRANSE_BIT           Bit._3
  450. #define YTRANSPOL_BIT         Bit._2
  451. #define XTRANSE_BIT           Bit._1
  452. #define XTRANSPOL_BIT         Bit._0
  453.  
  454. //
  455. #define TEA_MASK              0x40
  456. #define ZTRANSE_MASK          0x20
  457. #define ZTRANSEPOL_MASK       0x10
  458. #define YTRANSE_MASK          0x08
  459. #define YTRANSEPOL_MASK       0x04
  460. #define XTRANSE_MASK          0x02
  461. #define XTRANSEPOL_MASK       0x01
  462.  
  463. /*
  464. **  TRANSIENT_COUNT Transient Debounce Register
  465. */
  466. #define TRANSIENT_COUNT_REG   0x20
  467.  
  468. /*
  469. **  PULSE_CFG Pulse Configuration Register
  470. */
  471. #define PULSE_CFG_REG         0x21
  472. //
  473. #define DPA_BIT               Bit._7
  474. #define PELE_BIT              Bit._6
  475. #define ZDPEFE_BIT            Bit._5
  476. #define ZSPEFE_BIT            Bit._4
  477. #define YDPEFE_BIT            Bit._3
  478. #define YSPEFE_BIT            Bit._2
  479. #define XDPEFE_BIT            Bit._1
  480. #define XSPEFE_BIT            Bit._0
  481. //
  482. #define DPA_MASK              0x80
  483. #define PELE_MASK             0x40
  484. #define ZDPEFE_MASK           0x20
  485. #define ZSPEFE_MASK           0x10
  486. #define YDPEFE_MASK           0x08
  487. #define YSPEFE_MASK           0x04
  488. #define XDPEFE_MASK           0x02
  489. #define XSPEFE_MASK           0x01
  490.  
  491. /*
  492. **  PULSE_SRC Pulse Source Register
  493. */
  494. #define PULSE_SRC_REG         0x22
  495. //
  496. #define PEA_BIT               Bit._7
  497. #define PAXZ_BIT              Bit._6
  498. #define PAXY_BIT              Bit._5
  499. #define PAXX_BIT              Bit._4
  500. #define PDPE_BIT              Bit._3
  501. #define POLZ_BIT              Bit._2
  502. #define POLY_BIT              Bit._1
  503. #define POLX_BIT              Bit._0
  504. //
  505. #define PEA_MASK              0x80
  506. #define PAXZ_MASK             0x40
  507. #define PAXY_MASK             0x20
  508. #define PAXX_MASK             0x10
  509. #define PDPE_MASK             0x08
  510. #define POLZ_MASK             0x04
  511. #define POLY_MASK             0x02
  512. #define POLX_MASK             0x01
  513.  
  514. /*
  515. **  PULSE_THS XYZ Pulse Threshold Registers
  516. */
  517. #define PULSE_THSX_REG        0x23
  518. #define PULSE_THSY_REG        0x24
  519. #define PULSE_THSZ_REG        0x25
  520. //
  521. #define PTHS_MASK             0x7F
  522.  
  523. /*
  524. **  PULSE_TMLT Pulse Time Window Register
  525. */
  526. #define PULSE_TMLT_REG        0x26
  527.  
  528. /*
  529. **  PULSE_LTCY Pulse Latency Timer Register
  530. */
  531. #define PULSE_LTCY_REG        0x27
  532.  
  533. /*
  534. **  PULSE_WIND Second Pulse Time Window Register
  535. */
  536. #define PULSE_WIND_REG        0x28
  537.  
  538. /*
  539. **  ASLP_COUNT Auto Sleep Inactivity Timer Register
  540. */
  541. #define ASLP_COUNT_REG        0x29
  542.  
  543. /*
  544. **  CTRL_REG1 System Control 1 Register
  545. */
  546. #define CTRL_REG1             0x2A
  547. //
  548. #define ASLP_RATE1_BIT        Bit._7
  549. #define ASLP_RATE0_BIT        Bit._6
  550. #define DR2_BIT               Bit._5
  551. #define DR1_BIT               Bit._4
  552. #define DR0_BIT               Bit._3
  553. #define LNOISE_BIT            Bit._2
  554. #define FREAD_BIT             Bit._1
  555. #define ACTIVE_BIT            Bit._0
  556. //
  557. #define ASLP_RATE1_MASK       0x80
  558. #define ASLP_RATE0_MASK       0x40
  559. #define DR2_MASK              0x20
  560. #define DR1_MASK              0x10
  561. #define DR0_MASK              0x08
  562. #define LNOISE_MASK           0x04
  563. #define FREAD_MASK            0x02
  564. #define ACTIVE_MASK           0x01
  565. #define ASLP_RATE_MASK        0xC0
  566. #define DR_MASK               0x38
  567. //                      
  568. #define ASLP_RATE_20MS        0x00
  569. #define ASLP_RATE_80MS        ASLP_RATE0_MASK
  570. #define ASLP_RATE_160MS       ASLP_RATE1_MASK
  571. #define ASLP_RATE_640MS       ASLP_RATE1_MASK+ASLP_RATE0_MASK
  572. //
  573. #define DATA_RATE_1250US      0x00
  574. #define DATA_RATE_2500US      DR0_MASK
  575. #define DATA_RATE_5MS         DR1_MASK
  576. #define DATA_RATE_10MS        DR1_MASK+DR0_MASK
  577. #define DATA_RATE_20MS        DR2_MASK
  578. #define DATA_RATE_80MS        DR2_MASK+DR0_MASK
  579. #define DATA_RATE_160MS       DR2_MASK+DR1_MASK
  580. #define DATA_RATE_640MS       DR2_MASK+DR1_MASK+DR0_MASK
  581.  
  582. /*
  583. **  CTRL_REG2 System Control 2 Register
  584. */
  585. #define CTRL_REG2             0x2B
  586. //
  587. #define ST_BIT                Bit._7
  588. #define BOOT_BIT              Bit._6
  589. #define SMODS1_BIT            Bit._4
  590. #define SMODS0_BIT            Bit._3
  591. #define SLPE_BIT              Bit._2
  592. #define MODS1_BIT             Bit._1
  593. #define MODS0_BIT             Bit._0
  594. //
  595. #define ST_MASK               0x80
  596. #define BOOT_MASK             0x40
  597. #define SMODS1_MASK           0x20
  598. #define SMODS0_MASK           0x10
  599. #define SLPE_MASK             0x04
  600. #define MODS1_MASK            0x02
  601. #define MODS0_MASK            0x01
  602. #define SMODS_MASK            0x18
  603. #define MODS_MASK             0x03
  604.  
  605. /*
  606. **  CTRL_REG3 Interrupt Control Register
  607. */
  608. #define CTRL_REG3             0x2C
  609. //
  610. #define FIFO_GATE_BIT         Bit._7
  611. #define WAKE_TRANS_BIT        Bit._6
  612. #define WAKE_LNDPRT_BIT       Bit._5
  613. #define WAKE_PULSE_BIT        Bit._4
  614. #define WAKE_FF_MT_1_BIT      Bit._3
  615. #define WAKE_FF_MT_2_BIT      Bit._2
  616. #define IPOL_BIT              Bit._1
  617. #define PP_OD_BIT             Bit._0
  618. //
  619. #define FIFO_GATE_MASK        0x80
  620. #define WAKE_TRANS_MASK       0x40
  621. #define WAKE_LNDPRT_MASK      0x20
  622. #define WAKE_PULSE_MASK       0x10
  623. #define WAKE_FF_MT_1_MASK     0x08
  624. #define WAKE_FF_MT_2_MASK     0x04
  625. #define IPOL_MASK             0x02
  626. #define PP_OD_MASK            0x01
  627.  
  628. /*
  629. **  CTRL_REG4 Interrupt Enable Register
  630. */
  631. #define CTRL_REG4             0x2D
  632. //
  633. #define INT_EN_ASLP_BIT       Bit._7
  634. #define INT_EN_FIFO_BIT       Bit._6
  635. #define INT_EN_TRANS_BIT      Bit._5
  636. #define INT_EN_LNDPRT_BIT     Bit._4
  637. #define INT_EN_PULSE_BIT      Bit._3
  638. #define INT_EN_FF_MT_1_BIT    Bit._2
  639. #define INT_EN_FF_MT_2_BIT    Bit._1
  640. #define INT_EN_DRDY_BIT       Bit._0
  641. //
  642. #define INT_EN_ASLP_MASK      0x80
  643. #define INT_EN_FIFO_MASK      0x40
  644. #define INT_EN_TRANS_MASK     0x20
  645. #define INT_EN_LNDPRT_MASK    0x10
  646. #define INT_EN_PULSE_MASK     0x08
  647. #define INT_EN_FF_MT_1_MASK   0x04
  648. #define INT_EN_FF_MT_2_MASK   0x02
  649. #define INT_EN_DRDY_MASK      0x01
  650.  
  651. /*
  652. **  CTRL_REG5 Interrupt Configuration Register
  653. */
  654. #define CTRL_REG5             0x2E
  655. //
  656. #define INT_CFG_ASLP_BIT      Bit._7
  657. #define INT_CFG_FIFO_BIT      Bit._6
  658. #define INT_CFG_TRANS_BIT     Bit._5
  659. #define INT_CFG_LNDPRT_BIT    Bit._4
  660. #define INT_CFG_PULSE_BIT     Bit._3
  661. #define INT_CFG_FF_MT_1_BIT   Bit._2
  662. #define INT_CFG_FF_MT_2_BIT   Bit._1
  663. #define INT_CFG_DRDY_BIT      Bit._0
  664. //
  665. #define INT_CFG_ASLP_MASK     0x80
  666. #define INT_CFG_FIFO_MASK     0x40
  667. #define INT_CFG_TRANS_MASK    0x20
  668. #define INT_CFG_LNDPRT_MASK   0x10
  669. #define INT_CFG_PULSE_MASK    0x08
  670. #define INT_CFG_FF_MT_1_MASK  0x04
  671. #define INT_CFG_FF_MT_2_MASK  0x02
  672. #define INT_CFG_DRDY_MASK     0x01
  673.  
  674. /*
  675. **  XYZ Offset Correction Registers
  676. */
  677. #define OFF_X_REG             0x2F
  678. #define OFF_Y_REG             0x30
  679. #define OFF_Z_REG             0x31
  680.  
  681.  
  682. /***********************************************************************************************\
  683. * Public type definitions
  684. \***********************************************************************************************/
  685.  
  686. /***********************************************************************************************\
  687. * Public memory declarations
  688. \***********************************************************************************************/
  689.  
  690. /***********************************************************************************************\
  691. * Public prototypes
  692. \***********************************************************************************************/
  693.  
  694. void MMA845x_Init(void);
  695. void MMA845x_Standby(void);
  696. void MMA845x_Active(void);
  697.  
  698.  
  699. #endif  /* _MMA845X_H_ */

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #4 en: 13 de Mayo de 2013, 11:20:18 »
Gracias, Manolo, tus rutinas son similares a las que estoy usando...
Me llama la atención lo del Output_float() después del I2C_Stop() , a que se debe este uso ??
Pones en flotación ambos pines del I2C ??
Para que es eso??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #5 en: 13 de Mayo de 2013, 11:25:47 »
Otra pregunta:
De donde sale ese valor multiplicador del valor en flotante que usas?
Me refiero al valor 51.25125 que esta en las tres conversiones de medida, antes de mostrarlos...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #6 en: 13 de Mayo de 2013, 11:37:03 »
Lo del output_float es redundante porque las líneas no están forzadas por el PIC cuando no se usa el canal I2C, así que no recuerdo bien porque lo hice.
Pero como puse un conector I2C en la placa para poder leer el acelerómetro desde fuera con un sniffer, supongo que el PIC se metía por medio y así conseguí que funcionase bien.

El factor multiplicador que ves en el código me permite convertir un dato de 10bits en un valor float de -9.99 a +9.99. Era un requerimiento del proyecto que la salida estuviera en ese rango.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #7 en: 13 de Mayo de 2013, 11:46:34 »
En tu caso, con 2G y el MMA8453, el dato contiene hasta 10 bits, no es asi??
Y que tipo de sniffer utilizas, usas el ICD2 como sniffer I2C??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #8 en: 13 de Mayo de 2013, 12:12:27 »
Que va, un invento que me hice con un PIC para poder usar I2C desde un puerto serie.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #9 en: 13 de Mayo de 2013, 15:36:43 »
Manolo, corrigeme a ver si mi analisis de la constante esta bien hecho:

Tu haces la siguiente cuenta, para sacarlo.

1024 / 19,98 = 51,25125

Siendo 1024 los posibles valores de 10 bits, que es la resolucion de tu acelerometro en 2G.

Ahora, por que tomaste el 19,98 como divisor??
Se refiere a los 2G ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #10 en: 13 de Mayo de 2013, 16:17:51 »
Se te ha olvidado tener en cuenta que los 10 bits vienen con signo, por eso mi horquilla de lecturas está entre -9.99 y +9.99

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #11 en: 13 de Mayo de 2013, 16:41:11 »
Aja, y cada cuanto tomas muestras?
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #12 en: 13 de Mayo de 2013, 17:02:59 »
Manolo, corrigeme a ver si mi analisis de la constante esta bien hecho:

Tu haces la siguiente cuenta, para sacarlo.

1024 / 19,98 = 51,25125

Siendo 1024 los posibles valores de 10 bits, que es la resolucion de tu acelerometro en 2G.

Ahora, por que tomaste el 19,98 como divisor??
Se refiere a los 2G ??

Entonces para el MMA8451 la cuenta deberia ser:

16384 / 19,98 = 1641,683366    <-----------<<<< Constante a usar en mi calculo??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #13 en: 13 de Mayo de 2013, 19:18:33 »
¿Es de 14 bits el tuyo?, ¿También quieres valores entre -9.99 y +9.99?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: ¿Alguien uso el acelerometro MMA8451 de Freescale ?
« Respuesta #14 en: 14 de Mayo de 2013, 08:05:53 »
Hasta donde voy leyendo (es el problema de que hay mucha info del chip  :D :D) cuando esta en modo 2G, el MMA8451 entrega 12 bits, o 4096 valores posibles en todo el rango (positivo y negativo), por lo tanto voy a tener que experimentarlo un poco más antes de hacer algo cierto.

Es mi primera experiencia en acelerómetros, y creo que me falta bastante (o todo) de teoria, sabes donde conseguirla??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything