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:
2.- New/ C Project
- Configurar proyecto:
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;
}
·
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:
--> Practica #11
Cual es el password?
ResponderBorrar