Autor Tema: C18 - Librería acelerómetro MMA7455 por I2C ¿alguien lo usó?  (Leído 3189 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado mbufarini

  • PIC10
  • *
  • Mensajes: 5
C18 - Librería acelerómetro MMA7455 por I2C ¿alguien lo usó?
« en: 03 de Diciembre de 2011, 10:23:25 »
Hola a todos,
quisiera saber si alguien tuvo la oportunidad de utilizar el acelerómetro MMA7455 de freescale mediante el bus I2C con C18.

Estoy intentando comunicarme con él y hasta ahora no tengo éxito. Es mi primer intento con el bus I2C y estoy un poco verde todavía.

Estuve leyendo el tutorial de C18 de Suky y encontré una librería para CCS (http://www.radikaldesig.com/tag/mma7455/).

¿alguien lo usó en C18?,

Saludos y gracias.

Mauro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: C18 - Librería acelerómetro MMA7455 por I2C ¿alguien lo usó?
« Respuesta #1 en: 03 de Diciembre de 2011, 10:55:07 »
Yo para utilizar el módulo MSSP en modo I2C implemento las siguientes funciones:

Código: C
  1. /**
  2.    \version: 1.0
  3.    
  4.    \author Suky
  5.    \web www.micros-designs.com.ar
  6.    \date 16/08/11
  7.  
  8. ///////////////////////////////////////////////////////////////////////////
  9. ////                                                                   ////
  10. ////                                                                   ////
  11. ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
  12. //// Este código puede ser usado, modificado y distribuido libremente  ////
  13. //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
  14. ////                                                                   ////
  15. ////                                                                   ////
  16. ///////////////////////////////////////////////////////////////////////////
  17.    
  18.  *- Version Log --------------------------------------------------------------*
  19.  *   Fecha       Autor                Comentarios                             *
  20.  *----------------------------------------------------------------------------*
  21.  * 16/08/11      Suky               Original (Rev 1.0)                        *
  22. *----------------------------------------------------------------------------*
  23. */
  24. #include <p18cxxx.h>
  25. #include <i2c.h>
  26. #include "GenericTypeDefs.h" // <<<< de Microchip Solutions
  27.  
  28. #define SEND_ACK        0
  29. #define SEND_NACK       1
  30.  
  31.  
  32. void vHW_i2c_Start(void){
  33.         IdleI2C();
  34.         StartI2C();
  35.         IdleI2C();
  36. }
  37. UINT8 ui8HW_i2c_Write(UINT8 Data){
  38.         UINT8 Ack;
  39.        
  40.         Ack=WriteI2C(Data);
  41.        
  42.         if(Ack==0){return(0);}
  43.         else{return(1);}
  44. }
  45. void vHW_i2c_ReStart(void){
  46.         RestartI2C();
  47.         IdleI2C();
  48. }
  49. UINT8 ui8HW_i2c_Read(UINT8 Ack){
  50.         UINT8 Data;
  51.                
  52.         Data=ReadI2C();
  53.         if(Ack==0){
  54.                 AckI2C();
  55.         }else{
  56.                 NotAckI2C();
  57.         }
  58.         IdleI2C();
  59.        
  60.         return(Data);
  61. }
  62.  
  63. void vHW_i2c_Stop(void){
  64.         StopI2C();
  65.         IdleI2C();
  66. }

Entonces después las implemento por ejemplo para leer una memoria:

Código: C
  1. OpenI2C(MASTER,SLEW_OFF);                                                       // Inicio módulo I2C
  2. SSPADD=99;                                                                                      // Fosc/(4*(SSPxADD+1))
  3.  
  4.  
  5. void vWrite_Single_Eeprom(UINT16 Address,UINT8 Data){
  6.  
  7.    vHW_i2c_Start();
  8.    ui8HW_i2c_Write(0xA0);
  9.    ui8HW_i2c_Write(*((UINT8 *)&Address+1));
  10.    ui8HW_i2c_Write(Address);
  11.    ui8HW_i2c_Write(Data);
  12.    vHW_i2c_Stop();  
  13. }

Con eso, con el datasheet del MMA7455 y con la librería que encontraste puedes resolverlo  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado mbufarini

  • PIC10
  • *
  • Mensajes: 5
Re: C18 - Librería acelerómetro MMA7455 por I2C ¿alguien lo usó?
« Respuesta #2 en: 06 de Diciembre de 2011, 10:12:50 »
Gracias Suky !!

Voy a ver si logro comunicarme.
Espero publicar la librería si puedo comunicarme.

saludos

Desconectado mbufarini

  • PIC10
  • *
  • Mensajes: 5
Re: C18 - Librería acelerómetro MMA7455 por I2C ¿alguien lo usó?
« Respuesta #3 en: 13 de Diciembre de 2011, 23:49:49 »
Como prometí publico las tres funciones que utilicé para comunicarme por I2C con el acelerómetro MMA7455L.
Espero que a alguien le sirva.

Saludos.

Código: [Seleccionar]
//------------------------------
// Inicializacion Acelerometro
//------------------------------
void  accel_init(){
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C(0x3A); //0x1D desplazado con un 0
    WriteI2C(0x16); //Registro MODE CONTROL
    WriteI2C(0x05); //Medición contínua
    StopI2C();
    IdleI2C();
}

//-----------------------------------
// Escritura 1 registro
//-----------------------------------
void  accel_write(int reg, int data){
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C(0x3A); //0x1D desplazado con un  0
    WriteI2C(reg);  //Registro a escribir
    WriteI2C(data); //Dato a escribir en registro
    StopI2C();
    IdleI2C();
}

//-----------------------------------
// Lectura 1 registro
//-----------------------------------
int accel_read(int reg){
    int data;
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C(0x3A); //0x1D desplazado con un  0
    WriteI2C(reg);  //Registro a leer
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C(0x3B); //0x1D desplazado con un  1
    data=ReadI2C(); //Dato leido->data
    StopI2C();
    IdleI2C();
    return(data)
};