martes, 8 de septiembre de 2015

LWTIMER con MQX KDS 3.0 SDK 1.2

Objetivo


Realizar la coordinación del encendido del LED RGB  en sus colores rojo, verde y azul, utilizando el LWTIMER (Light Weigth Timer).

Descripción del Programa


El contenido de la práctica, se describe a continuación:

El programa principal (main.c) enlista, mediante una estructura, las tareas que desarrollará el mismo. En este caso, se tiene una sola tarea principal. Dicha tarea tiene la función de inicializar el timer, crear y verificar la creacion de la cola periódica, así como corroborar que los timers referentes a cada una de las funciones que encienden el LED del color deseado, hayan sido satisfactoriamente agregados a dicha cola. También, se inicializan los pines que se van a utilizar, en este caso, los LEDs del micro. En el lazo infinito, se realiza el incremento de un contador para que, dependiendo del valor del contador y si detecta el incremento del contador, se imprime el color correspondiente al cambio de color del LED.

El archivo LED_RGB.h contiene la enumeración de los colores que se utilizarán para el encendido del LED. Además contiene el protocolo de la función para el encendido del LED.

El archivo LED_RGB.c realiza, de acuerdo al valor del color deseado, encender la combinación de LEDs correspondiente para generar el color deseado.


Códigos del Programa


-   main.c

#include <stdio.h>
#include <mqx.h>
#include <bsp.h>
#include <lwtimer.h>
#include "LED_RGB.h"

/* Task IDs */

#define INIT_TASK  5

void init_taskuint32_t);
void Red_on();
void Green_on();
void Blue_on();


LWTIMER_PERIOD_STRUCT my_periodic_queue;
LWTIMER_STRUCT timer_red;
LWTIMER_STRUCT timer_green;
LWTIMER_STRUCT timer_blue;

color c, c_ant;

const TASK_TEMPLATE_STRUCT  MQX_template_list[] =
{
   /* Task Index,   Function,   Stack,  Priority, Name,     Attributes,          Param, Time Slice */
    { INIT_TASK,    init_task,  700,    9,        "init",   MQX_AUTO_START_TASK, 0,     0 },
    { 0 }
};

void init_task
   (
      uint32_t initial_data
   )
{
       int counter = 0;
       _mqx_uint error;
       _mqx_uint period = 300;           //representa el tiempo de duración de la cola periodica de timers
       _mqx_uint wait_ticks = 0;   //representa el numero de ticks a esperar antes iniciar a procesar la cola de timers
       _mqx_uint delay_red = 0;    //representa el tiempo en ticks para iniciar el proceso en la cola de timers
    _mqx_uint delay_green = 100;
       _mqx_uint delay_blue = 200;

         GPIO_DRV_Init(switchPins,ledPins);

         error=_lwtimer_create_periodic_queue(&my_periodic_queue,period,wait_ticks);  //Creacion de la cola periodica
         if(error!=MQX_OK) printf("No crea lwtimer\n\r");
         /*Se agregan los timers a la cola periodica*/
         error=_lwtimer_add_timer_to_queue(&my_periodic_queue,&timer_red,delay_red,Red_on,NULL);
       if(error!=MQX_OK) printf("No crea lwtimerRED\n\r");
       error=_lwtimer_add_timer_to_queue(&my_periodic_queue,&timer_green,delay_green,Green_on,NULL);
       if(error!=MQX_OK) printf("No crea lwtimerGREEN\n\r");
       error=_lwtimer_add_timer_to_queue(&my_periodic_queue,&timer_blue,delay_blue,Blue_on,NULL);
       if(error!=MQX_OK) printf("No crea lwtimerBLUE\n\r");
       if(error==MQX_OK) printf("Demo de timers \n\r");

         while(1)
         {
               counter++;
               if(c!=c_ant)
               {
                    if(c==REDprintf("RED\n");
                    if(c==GREENprintf("GREEN\n");
                    if(c==BLUEprintf("BLUE\n");
                    c_ant=c;
               }
         }
}


void Red_on()
{
             c=RED;
             led(c);

}

void Green_on()
{
       c=GREEN;
       led(c);
}

void Blue_on()
{
             c=BLUE;
             led(c);
}
/* EOF */

-   LED_RGB.h


#ifndef LED_RGB_H_
#define LED_RGB_H_

typedef enum {BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITEcolor;
enum bits{B0=1,B1=2,B2=4,B3=8,B4=0X10,B5=0X20,B6=0X40,B7=0X80};

void led(color);
#endif /* LED_RGB_H_ */

-   LED_RGB.c


#include "LED_RGB.h"
#include <bsp.h>
#include <stdio.h>

void led(color dato)
{
       GPIO_DRV_WritePinOutput(BOARD_GPIO_LED_RED,!(dato&B0));
       GPIO_DRV_WritePinOutput(BOARD_GPIO_LED_GREEN,!(dato&B1));
       GPIO_DRV_WritePinOutput(BOARD_GPIO_LED_BLUE,!(dato&B2));
}

Refencias


Manual de microcontroladores de la serie K64:


Para conocer el curso completo de Essentials Course of MQX, visita la página:


1 comentario:

  1. Hello,

    I'm programming a Kinetis K24 using MQX KDS SDK 1.3, and do not work the lwtimer functions. I I did exactly as in your example , even had programmed these timers using Code Warrior and functioned normally.

    You know tell me if you have any other configuration to make the KDS for these timers of MQX work ?

    Thank you very much in advance!

    Att .

    Lucas Dias

    ResponderEliminar