Objetivo
Realizar la coordinación del encendido del LED RGB en sus colores rojo, verde, azul y sus combinaciones, utilizando el PIT (Periodic Interrupt Timer), utilizando Eventos.
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 la configuración del PIT y habilitar los pines (LED´s).
Además, como se vio en el caso de los eventos, se crea el evento que permite llamar las funciones del PIT. En el ciclo infinito de la tarea principal, se espera por la bandera del Evento para poder imprimir el color que corresponde al led que se encenderá.
El archivo main.h se definen constantes que se utilizaran en la ejecución del programa.
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 <fsl_interrupt_manager.h>
#include "LED_RGB.h"
#include "main.h"
#include"lwevent.h"
#include "fsl_pit_driver.h"
void main_task(uint32_t initial_data);
_mqx_uint G_Counter;
LWEVENT_STRUCT lwevent;
const TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
/* Indice de la Tarea, Funcion, Stack, Prioridad, Nombre, Atributos, Parametro, Fraccion de tiempo */
{ MAIN_TASK, main_task, 1000, 8, "Main", MQX_AUTO_START_TASK, 0, 0 },
{ 0 }
};
void main_task(uint32_t initial_data)
{
uint32_t currentCounter = 0;
// Estructura de inicializacióndel canal 0 del PIT
pit_user_config_t chn0Confg = {
.isInterruptEnabled = true,
.periodUs = 1000000u
};
GPIO_DRV_Init(switchPins,ledPins);
_lwevent_create(&lwevent,LWEVENT_AUTO_CLEAR);
// Inicialización del hardware
hardware_init();
// Inicializa del modulo del pit y habilita la ejecución en debug
PIT_DRV_Init(BOARD_PIT_INSTANCE, false);
// Inicialización del timer PIT para el canal 0 y 1
PIT_DRV_InitChannel(BOARD_PIT_INSTANCE, 0, &chn0Confg);
// Encendido del canal 0
printf("\n\rStarting channel No.0 ...\n\n");
PIT_DRV_StartTimer(BOARD_PIT_INSTANCE, 0);
while(TRUE)
{
// Verifica cada que ocurre una interrupción
_lwevent_wait_for(&lwevent,EVENT_COUNTER,FALSE,NULL);
printf("PIT interrupt No.%d \r\n",G_Counter);
printf_color(G_Counter&0x7);
led(G_Counter&0x7);
}
_task_block();
}
/* EOF */
- main.h
#ifndef SOURCES_MAIN_H_
#define SOURCES_MAIN_H_
#define EVENT_COUNTER 1
#define MAIN_TASK 10
#define BOARD_PIT_INSTANCE 0
#endif /* SOURCES_MAIN_H_ */
- 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]);
}
- fsl_pit_irq.c
#include <stdlib.h>
#include <assert.h>
#include <mqx.h>
#include "fsl_pit_driver.h"
#include"lwevent.h"
#include "main.h"
extern volatile bool pitIsrFlag[2];
extern _mqx_uint G_Counter;
extern LWEVENT_STRUCT lwevent;
#if (FSL_FEATURE_PIT_TIMER_COUNT > 0U)
void PIT0_IRQHandler(void)
{
/* Limpia la bandera de interrupciones*/
PIT_HAL_ClearIntFlag(g_pitBase[0], 0U);
G_Counter++;
_lwevent_set(&lwevent,EVENT_COUNTER);
}
#endif
Refencias
Manual de microcontroladores de la serie K64:
Para conocer el curso completo de Essentials Course of MQX, visita la página:
No hay comentarios:
Publicar un comentario