Objetivo
Realizar la coordinación del encendido del LED RGB en sus colores rojo, verde, azul y sus combinaciones, utilizando los comandos _lwmsgq_init, _lwmsgq_receive y _lwmsgq_send.
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 tienen tres tareas, una de inicio, una de envío y una de recepción. Así también, se genera la cola de mensaje y se establecen los protocolos de las funciones y tareas utilizadas.
En la tarea de inicio, que es de autoinicialización, se habilitan los pines que se utilizarán (LEDs), se inicializa la cola de mensaje y se comprueba que las tareas de envío y recepción se hayan creado correctamente.
En la tarea de recepción, se tiene un lazo infito que espera por la llegada del mensaje, imprimiendo el color del dato que contiene el mensaje entrante y encendiendo el LED de ese color.
En la tarea de envío, se tiene un lazo infinito donde se crea el mensaje con un valor asignado por la variable index, el cual es enviado a la tarea de recepción, con un tiempo de retardo de 200 ticks entre mensajes. Dicho indice varía entre 0 y 8 y, una vez alcanzado el valor máximo, se reinicia en 1.
En la tarea de inicio, que es de autoinicialización, se habilitan los pines que se utilizarán (LEDs), se inicializa la cola de mensaje y se comprueba que las tareas de envío y recepción se hayan creado correctamente.
En la tarea de recepción, se tiene un lazo infito que espera por la llegada del mensaje, imprimiendo el color del dato que contiene el mensaje entrante y encendiendo el LED de ese color.
En la tarea de envío, se tiene un lazo infinito donde se crea el mensaje con un valor asignado por la variable index, el cual es enviado a la tarea de recepción, con un tiempo de retardo de 200 ticks entre mensajes. Dicho indice varía entre 0 y 8 y, una vez alcanzado el valor máximo, se reinicia en 1.
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 las funciones para el encendido del LED y la impresión del color correspondiente.
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. Así mismo, permite la impresión del color correspondiente.
Códigos del Programa
- main.c
#include <stdio.h>
#include <mqx.h>
#include <bsp.h>
#include <lwtimer.h>
#include "LED_RGB.h"
/* Task IDs */
/* Task IDs */
#define INIT_TASK 5
#define SEND_TASK 6
#define RECEIVE_TASK 7
#define NUM_MESSAGES 1
#define MSG_SIZE 1
//crea cola de mensaje
int32_t receive_queue[sizeof(LWMSGQ_STRUCT)/sizeof(uint32_t) + NUM_MESSAGES * MSG_SIZE];
void send_task (uint32_t initial_data);
void receive_task (uint32_t initial_data);
void init_task( uint32_t);
void send_task( uint32_t);
void receive_task( uint32_t);
const TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
/* Indice de la
Tarea, Funcion, Stack, Prioridad, Nombre, Atributos, Parametro,
Fraccion de tiempo */
{ INIT_TASK, init_task, 700,
9, "init", MQX_AUTO_START_TASK, 0, 0 },
{ SEND_TASK, send_task, 700,
9, "send", 0, 0, 0 },
{ RECEIVE_TASK,
receive_task, 700, 9, "receive", 0, 0, 0 },
{ 0 }
};
void init_task
(
uint32_t initial_data
)
{
_mqx_uint result;
_task_id send_task_id,
receive_task_id;
GPIO_DRV_Init(switchPins,ledPins);
result
= _lwmsgq_init((void *)receive_queue,
NUM_MESSAGES, MSG_SIZE);
if (result != MQX_OK) {
// lwmsgq_init failed
}
/* Endif
*/
send_task_id
= _task_create(0, SEND_TASK, 0);
if (send_task_id == MQX_NULL_TASK_ID) {
printf ("\n Could not create send_task\n");
}
receive_task_id
= _task_create(0, RECEIVE_TASK, 0);
if (receive_task_id == MQX_NULL_TASK_ID) {
printf ("\n Could not create
receive_task\n");
}
_task_abort(_task_get_id());
}
void receive_task
(
uint32_t initial_data
)
{
_mqx_uint msg[MSG_SIZE];
while(1)
{
//espera mensaje
_lwmsgq_receive((void *)receive_queue, msg, LWMSGQ_RECEIVE_BLOCK_ON_EMPTY, 0, 0);
printf_color(msg[0]);
led(msg[0]);
}
}
void send_task
(
uint32_t index
)
{
index=0;
_mqx_uint msg[MSG_SIZE];
while(1)
{
msg[0] = index;
_lwmsgq_send((void *)receive_queue,
msg, LWMSGQ_SEND_BLOCK_ON_FULL);
_time_delay_ticks(200);
index++;
if (index==8) index=1;
//envia mensaje
//espera medio
segundo
//incrementa
apuntador a mensaje
}
}
/* EOF */
- LED_RGB.h
#ifndef LED_RGB_H_
#define LED_RGB_H_
#define SIZE_ARR 8
typedef char string[SIZE_ARR];
typedef enum {BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE} color;
enum bits{B0=1,B1=2,B2=4,B3=8,B4=0X10,B5=0X20,B6=0X40,B7=0X80};
void led(color);
void printf_color(color dato);
#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));
}
void printf_color(color dato)
{
string color_names[]={"Black","Red","Green","Yellow","Blue","Magenta","Cyan","White"};
printf("%s\n",color_names[dato]);
}
Refencias
Manual de microcontroladores de la serie K64:
Para mayor información sobre el uso de los MENSAJES, visita la página:
Para conocer el curso completo de Essentials Course of MQX, visita la página:
No hay comentarios:
Publicar un comentario