miércoles, 4 de enero de 2017

PRACTICA # 2 INTERVAL TIMER (IT)

La familia RL78 posee dentro de su arquitectura un oscilador de baja velocidad de 32.768 kHz que es usado por el IT de 12 bits.

OBJETIVO:


1. Configurar la FSUB par el IT
2. Configurar el IT
3. Crear la interrupción IT
4. Crear funciones delay_ms exactas.


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 oscilador interno High Speed para obtener FCLK a 32 Mhz y el Oscilador de subsistema para obtener FSUB a 32.768 kHz para alimentar al IT.
RL78/G14 User's Manual: Hardware página 239.

// Fclk = 32 Mhz  Fsub = 32.768 khz para el IT (interval Timer)
void SR_Oscilador(void)
{
        volatile uint32_t w_count;
        /*The IT can count one of two possible clock sources, based on the WUTMMCK0 bit in
         the Operation Speed Mode Control Register (OSMC):

         A 0 selects the subsystem clock fSUB. This clock’s frequency is typically
         32.768 kHz, so the period is about 30.5176 _s.

         A 1 selects the internal low-speed oscillation clock fIL. This clock’s frequency is
         nominally 15 kHz but can vary by 15 percent.*/

        /* Set fMX */
        CMC = _00_CGC_HISYS_PORT | _10_CGC_SUB_OSC | _00_CGC_SYSOSC_DEFAULT
                        | _00_CGC_SUBMODE_LOW;
        MSTOP = 1U;
        /* Set fMAIN */
        MCM0 = 0U;
        /* Set fSUB */
        XTSTOP = 0U;

        /* Change the waiting time according to the system */
        for (w_count = 0U; w_count <= CGC_SUBWAITTIME; w_count++)
        {
                __nop();
        }

        OSMC = _00_CGC_SUBINHALT_ON | _00_CGC_RTC_CLK_FSUB;
        /* Set fCLK */
        CSS = 0U;
        /* Set fIH */
        HIOSTOP = 0U;
}


4.- Configuramos IT para obtener una base de tiempo de 100 us:

void R_IT_Create(void)
{
    RTCEN = 1U;    /* supply IT clock */
    ITMC = _0000_IT_OPERATION_DISABLE;    /* disable IT operation */
    ITMK = 1U;    /* disable INTIT interrupt */
    ITIF = 0U;    /* clear INTIT interrupt flag */
    /* Set INTIT low priority */
    ITPR1 = 1U;
    ITPR0 = 1U;
    ITMC = _0002_ITMCMP_VALUE; // 100 us
}


5.- Creamos la interrupción IT

#pragma interrupt r_it_interrupt(vect=INTIT)
static void __near r_it_interrupt(void)
{
          G_100usTimer++;
          if((G_100usTimer % 10) == 0)
               G_msTimer++;
}
   

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

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



VÍDEO:


No hay comentarios.:

Publicar un comentario