lunes, 26 de diciembre de 2016

PRACTICA # 11 ACELERÓMETRO 3 EJES (I2C)

OBJETIVO:

Haremos uso de la interface IICA0 con la que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Haremos funcionar el sensor acelerómetro XYZ cuyo protocolo es I2C e imprimiremos sus valores en la LCD gráfica.
  •  Inicializaremos el módulo IICA0 
  •  Se crearán rutinas de lectura y escritura I2C
  •  Se creará interrupción I2C
  •  Se implementará la API del sensor acelerómetro para manejo de funciones de lectura.

DESARROLLO:
  •  Del manual Renesas RL78G14 RDK User's Manual ubicamos la dirección del sensor acelerómetro:

  •  Del YRDKRL78G14 schematic ubicamos el sensor acelerómetro:


PASOS:
  •  Creación de un proyecto:
1.- Abrir el software e2studio
2.- New/ C Project



  •  Configurar proyecto:
1.- Clic derecho en el proyecto generado y seleccionar Properties



2.- Seleccionar C/C++ Build / Settings / Linker / Device y establecer los siguientes parámetros:
OCD = 85
Option Byte = efffe8
Palomear: Use range of debug monitor area. Nota: No establecer ningún valor solo dejarlo en blanco.
Apply y después OK.



3.- Las rutinas de lectura del sensor acelerómetro se encuentran en el archivo accelerometer.c

void Accelerometer_Init(void)
{
    I2C_Request r;
    uint8_t acc_config_cnt;

    for(acc_config_cnt=0; acc_config_cnt<3; acc_config_cnt++)
    {
      pTxData = (uint8_t *)acc_config[acc_config_cnt];
      r.iAddr = ACCEL_ADDR>>1;
      r.iSpeed = 100; /* kHz */
      r.iWriteData = pTxData;
      r.iWriteLength = 2;
      r.iReadData = 0;
      r.iReadLength = 0;

      I2C_Start();
      I2C_Write(&r, 0);
      delay_ms(10);
      G_100usTimer = 0;
      G_msTimer = 0;
      R_IT_Start();
      while (I2C_IsBusy() && G_msTimer < 20)
      {
             __nop();
      }
      R_IT_Stop();
    }
}


unsigned short *Accelerometer_Get(void)
{
            unsigned short u16AcelerometerValues[3];
    uint8_t target_reg, acc_axis;
    uint8_t target_data[2] = {0x00, 0x00};
    I2C_Request r;

    for(acc_axis=0; acc_axis<3; acc_axis++)
    {
      target_reg = acc_reg_addr[acc_axis];

      r.iAddr = ACCEL_ADDR>>1;
      r.iSpeed = 100;
      r.iWriteData = &target_reg;
      r.iWriteLength = 1;
      r.iReadData = target_data;
      r.iReadLength = 2;
      I2C_Write(&r, 0);
      delay_ms(10);
      G_100usTimer = 0;
      G_msTimer = 0;
      R_IT_Start();
      while (I2C_IsBusy() && G_msTimer < 20)
      {
         __nop();
      }
      R_IT_Stop();
      I2C_Read(&r, 0);
      delay_ms(10);
      G_100usTimer = 0;
      G_msTimer = 0;
      R_IT_Start();
      while (I2C_IsBusy() && G_msTimer < 20)
      {
            __nop();
      }
      R_IT_Stop();

      /* Convert the device measurement into a decimal number and insert
       into a temporary string to be displayed */
      u16AcelerometerValues[acc_axis] = (target_data[1] << 8) + target_data[0];
    }
    return u16AcelerometerValues;
}


4.- La API I2C se encuentra en el archivo I2C.c cuyas rutinas son:

·          void I2C_Start(void);
·          void I2C_Stop(void);
·          void I2C_Read(I2C_Request *iRequest, void(*callback)(void));
·          void I2C_Write(I2C_Request *iRequest, void(*callback)(void));
·          _Bool I2C_IsBusy(void);

  •  Agregar código, compilar y debug:
1.- Bajar el código de:

2.- Compilar con el icono del martillo, debug con el icono del insecto y correr software:


 VÍDEO


1 comentario: