sábado, 31 de diciembre de 2016

PRACTICA # 6 INTERRUPCIÓN EXTERNA (INTPx)

OBJETIVO:

Se habilitará la interrupción externa INTP9 con la que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Por medio del Switch 3 si simulara la entrada para que la interrupción detecte ambos francos de subida y bajada respectivamente.
  •  Configurar el modulo INTPx
  •  Detectar la interrupción por franco encendiendo un led 3

DESARROLLO:
  • Del manual Renesas RL78G14 RDK User's Manual ubicamos el switch 3


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.- Configuraremos el modulo de interrupción externa INTC en el archivo r_cg_intc.c
void R_INTC_Create(void)
{
    PMK0 = 1U;    /* disable INTP0 operation */
    PIF0 = 0U;    /* clear INTP0 interrupt flag */
    PMK1 = 1U;    /* disable INTP1 operation */
    PIF1 = 0U;    /* clear INTP1 interrupt flag */
    PMK2 = 1U;    /* disable INTP2 operation */
    PIF2 = 0U;    /* clear INTP2 interrupt flag */
    PMK3 = 1U;    /* disable INTP3 operation */
    PIF3 = 0U;    /* clear INTP3 interrupt flag */
    PMK4 = 1U;    /* disable INTP4 operation */
    PIF4 = 0U;    /* clear INTP4 interrupt flag */
    PMK5 = 1U;    /* disable INTP5 operation */
    PIF5 = 0U;    /* clear INTP5 interrupt flag */
    PMK6 = 1U;    /* disable INTP6 operation */
    PIF6 = 0U;    /* clear INTP6 interrupt flag */
    PMK7 = 1U;    /* disable INTP7 operation */
    PIF7 = 0U;    /* clear INTP7 interrupt flag */
    PMK8 = 1U;    /* disable INTP8 operation */
    PIF8 = 0U;    /* clear INTP8 interrupt flag */
    PMK9 = 1U;    /* disable INTP9 operation */
    PIF9 = 0U;    /* clear INTP9 interrupt flag */
    PMK10 = 1U;    /* disable INTP10 operation */
    PIF10 = 0U;    /* clear INTP10 interrupt flag */
    PMK11 = 1U;    /* disable INTP11 operation */
    PIF11 = 0U;    /* clear INTP11 interrupt flag */
    /* Set INTP9 low priority */
    PPR19 = 1U;
    PPR09 = 1U;
    EGN1 = _02_INTP9_EDGE_FALLING_SEL;
    EGP1 = _02_INTP9_EDGE_RISING_SEL;      
    /* Set INTP9 pin */
    PM7 |= 0x20U;
}
  • Agregar código, compilar y debug:

1.- Bajar el código de:
--> Practica #6

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


VÍDEO:








viernes, 30 de diciembre de 2016

PRACTICA # 7 TIMER ARRAY UNIT (TAUx)


OBJETIVO: 

Haremos uso de la unidad Timer canal 0 de 16 bits con la que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Por medio del led 3 verificamos la interrupción programada por overflow cada segundo.
  •  Configurar el módulo TAUx
  •  Crear interrupción cada segundo apagando y prendiendo el led 3

DESARROLLO:
  • Del manual Renesas RL78G14 RDK User's Manual ubicamos el LED 3


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.- Configuraremos el módulo TAU0 para que interrupta cada segundo en el archivo r_cg_timer.c

void R_TAU0_Create(void)
{
    TAU0EN = 1U;    /* supplies input clock */
    TPS0 = _0009_TAU_CKM0_FCLK_9 | _0000_TAU_CKM1_FCLK_0 | _0000_TAU_CKM2_FCLK_1 | _0000_TAU_CKM3_FCLK_8;
    /* Stop all channels */
    TT0 = _0001_TAU_CH0_STOP_TRG_ON | _0002_TAU_CH1_STOP_TRG_ON | _0004_TAU_CH2_STOP_TRG_ON |
          _0008_TAU_CH3_STOP_TRG_ON | _0200_TAU_CH1_H8_STOP_TRG_ON | _0800_TAU_CH3_H8_STOP_TRG_ON;
    /* Mask channel 0 interrupt */
    TMMK00 = 1U;    /* disable INTTM00 interrupt */
    TMIF00 = 0U;    /* clear INTTM00 interrupt flag */
    /* Mask channel 1 interrupt */
    TMMK01 = 1U;    /* disable INTTM01 interrupt */
    TMIF01 = 0U;    /* clear INTTM01 interrupt flag */
    /* Mask channel 1 higher 8 bits interrupt */
    TMMK01H = 1U;    /* disable INTTM01H interrupt */
    TMIF01H = 0U;    /* clear INTTM01H interrupt flag */
    /* Mask channel 2 interrupt */
    TMMK02 = 1U;    /* disable INTTM02 interrupt */
    TMIF02 = 0U;    /* clear INTTM02 interrupt flag */
    /* Mask channel 3 interrupt */
    TMMK03 = 1U;    /* disable INTTM03 interrupt */
    TMIF03 = 0U;    /* clear INTTM03 interrupt flag */
    /* Mask channel 3 higher 8 bits interrupt */
    TMMK03H = 1U;    /* disable INTTM03H interrupt */
    TMIF03H = 0U;    /* clear INTTM03H interrupt flag */
    /* Set INTTM00 low priority */
    TMPR100 = 1U;
    TMPR000 = 1U;
    /* Channel 0 used as interval timer */
    TMR00 = _0000_TAU_CLOCK_SELECT_CKM0 | _0000_TAU_CLOCK_MODE_CKS | _0000_TAU_COMBINATION_SLAVE |
            _0000_TAU_TRIGGER_SOFTWARE | _0000_TAU_MODE_INTERVAL_TIMER | _0000_TAU_START_INT_UNUSED;
    TDR00 = _F423_TAU_TDR00_VALUE;
    TO0 &= ~_0001_TAU_CH0_OUTPUT_VALUE_1;
    TOE0 &= ~_0001_TAU_CH0_OUTPUT_ENABLE;
}

  •  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:

jueves, 29 de diciembre de 2016

PRACTICA # 8 EEPROM (I2C)

OBJETIVO:

Haremos uso de la interface IICA0 con la que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Escribiremos una trama de 128 datos en la memoria EEPROM a 100 Khz y los volveremos a leer verificándolos en el debug en un array de datos.
  •  Inicializaremos el módulo IICA0 

  •  Se crearán rutinas de lectura y escritura I2C

  •  Se creará interrupción I2C

  •  Se implementará la API EEPROM para manejo de funciones de lectura y escritura.

DESARROLLO:
  •  Del manual Renesas RL78G14 RDK User's Manual ubicamos la dirección de la EEPROM
  •  Del YRDKRL78G14 schematic ubicamos la EEPROM:


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 y escritura de la EEPROM se encuentran en el archivo EEPROM.c

void EEPROM_Write(unsigned long addr, uint16_t lenth ,unsigned char *pdata)
{
    uint8_t send[130];
    I2C_Request r;
    uint16_t len = 2;
    unsigned char j;

    send[0] = addr & 0xFF00;
    send[1] = addr & 0x00FF;

    for(j=0; j<lenth; j++)
    {
           send[len] = (uint8_t)*pdata;
           len++;
           pdata++;
    }

    r.iAddr = EEPROM_DEVICE_ADDRESS>>1;
    r.iSpeed = 100; /* kHz */
    r.iWriteData = send;
    r.iWriteLength = len;
    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();
}

int16_t EEPROM_Read(uint16_t addr, uint8_t *pdata, uint16_t r_lenth)
{
    uint8_t target_address[2];
    I2C_Request r;
    int16_t result = 0;

    target_address[0] = addr & 0xFF00;
    target_address[1] = addr & 0x00FF;

    r.iAddr = EEPROM_DEVICE_ADDRESS >> 1;
    r.iSpeed = 100;
    r.iWriteData = target_address;
    r.iWriteLength = 2;
    r.iReadData = pdata;
    r.iReadLength = r_lenth;
    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();
   result = 1;

    return result;
}


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:
--> Practica #8

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


RESULTADO:






miércoles, 28 de diciembre de 2016

PRACTICA # 9 LIGHT SENSOR (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 de luz ambiente cuyo protocolo es I2C e imprimiremos su valor 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 de luz para manejo de funciones de lectura y escritura.

DESARROLLO:
  •  Del manual Renesas RL78G14 RDK User's Manual ubicamos la dirección el sensor de luz:
  •  Del YRDKRL78G14 schematic ubicamos el sensor de luz:


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 sesnor de luz se encuentran en el archivo LightSensor.c

void LightSensor_Init(void)
{
    uint8_t cmd[2] = { LIGHTSENSOR_CMD, 0x00 };
    I2C_Request r;

    r.iAddr = LIGHTSENSOR_ADDR>>1;
    r.iSpeed = 100; /* kHz */
    r.iWriteData = cmd;
    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();
}

int LightSensor_Get(void)
{
    uint8_t target_reg=LIGHTSENSOR_CMD;
    uint8_t target_data[2] = {0x00, 0x00};
    int temp = 0;
    I2C_Request r;

    r.iAddr = LIGHTSENSOR_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 */
    temp = (target_data[1] << 8) + target_data[0];
    return temp;
}

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: