domingo, 5 de febrero de 2017

PRACTICA # 22 Compare Match Timer (CMT)

OBJETIVO:
       Se configurará el Compare Match Timer (CMT) con la que cuenta el MCU R5F563NB de la tarjeta de evaluación YRDKRX63N. Este CMT de 16 bits lo utilizaremos para generar funciones de retardo de tiempo como delay_100us y delay_ms por medio de su interrupción.
  • Configurar el CMT de 16 bits 
  • Crear interrupción CMT0 CMI0
  • Parpadear un Led cada segundo utilizando las funciones delay_ms

DESARROLLO:
  • Del manual Renesas RX63N RDK User's Manual ubicamos el LED 4 


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


3.- Seleccionar el target R5F563NB, debug hardware Segger jLink, después next


4.- Seleccionar C/C++ Source file y por ultimo Finish.


5.- Configuraremos el CMT 0 e iniciamos interrupción CMI0 en el archivo CMT.c:

/* The CMT in this example is clocked at a rate of
   (PCLK / 32) or (48 MHz / 32) = 1500000  cuentas para llegar a 1000 ms

 1500000      --  1000 ms
    x        --    0.1 ms = 100 us
  x = 150

 */
void CMT_0_init (void)
{
    /* Power up CMT0 */
    MSTP(CMT0) = 0;  
   
    /* Stop the clock */
    CMT.CMSTR0.BIT.STR0 = 0;

    /* Trigger 100 us from now */
    CMT0.CMCOR =  150;

   
    /* CMCR - Compare Match Timer Control Register
    b6      CMIE: 1 = Compare match interrupt (CMIn) enabled
    b1:b0   CKS:  1 = Clock selects is PCLK/32
    */
    CMT0.CMCR.BIT.CMIE = 0x01;
    CMT0.CMCR.BIT.CKS  = 0x01;
   
    /* Set interrupt priority in ICU */
    IPR(CMT0, CMI0) = 0x01;
   
    /* Enable the interrupt in the ICU */
    IEN(CMT0, CMI0) = 1;
   
    /* Start the clock running */
    CMT.CMSTR0.BIT.STR0 = 1;
} /* End of function CMT_init() */

void CMT_0_Start(void)
{
             IR(CMT0,CMI0) = 0;    // Clear IRQ if it was on for some reason
     IEN(CMT0,CMI0) = 1;   // Enable the interrupt in the ICU
}

void CMT_0_Stop(void)
{
            IR(CMT0,CMI0) = 0;    // Clear IRQ if it was on for some reason
            IEN(CMT0,CMI0) = 0;   // Disable the interrupt in the ICU
}

6.- Agregaremos el siguiente código a la interrupción que está en el archivo interrupt_handlers.c

// CMT0 CMI0
void Excep_CMT0_CMI0(void)
{
            G_100usTimer++;
            if ((G_100usTimer % 10) == 0)
                        G_msTimer++;
}

7.- La function main queda como sigue:

void main(void)
{
            set_ipl( 0 );     // enable interrupts
            SR_Oscilador();   //  F = 96 Mhz
            SR_INIT_PORTS();  // Inicializa los I/O
            SR_CMT_0();       // Inicializa el Compare Match Timer 0

            while(1)
            {
                        LED4 = ~LED4;
                        delay_ms(1000);
            }
}

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

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


VÍDEO:


1 comentario: