lunes, 31 de agosto de 2015

RTC y PUERTO SERIE

OBJETIVO.
Realizar un programa simulando las tareas de una alarma que está siendo monitoreada en fecha y hora por medio del periférico RTC (Real Time Clock) en la tarjeta FRDM K64f.
INTRODUCCIÓN.
En esta práctica se va a describir cómo programar la interface del periférico “Real Time Clock (RTC)”. El periférico controla y establece cuando obtener los valores de un reloj que corre en tiempo real, esto permite obtener tiempos de alarma y recibir notificaciones de cuando la alarma es disparada (sucede un evento).
El Driver se inicializa con la función RTC_DRV_Inint(). Como primer parámetro se escribe el número de componente RTC. En la mayoría de los casos las tarjetas sólo cuentan con un solo periférico RTC. Por lo tanto el número default es cero. La función del controlador de inicio es que dispara el módulo del RTC, e inicializa las interrupciones del mismo, un ejemplo de inicialización es: RTC_DRV_Init(0);
El RTC utiliza un tipo de estructura rtc_datetime_t para configurar o leer la fecha y la hora. Para esto se llama a la función RTC_DRV_SetDatetime(), esta función configura el periférico a la fecha y hora actual, para conocer o leer la fecha y hora actual se llama a la función RTC_DRV_GetDatetime(). Un ejemplo de cómo inicializar y leer los valores del RTC para la fecha y hora es el siguiente:
//Crear una variable para inicializar los parámetros del RTC
rtc_datetime_t datetimeToSet;
RTC_DRV_Init(0);
datetimeToSet.year = 2015;
datetimeToSet.month = 07;
datetimeToSet.day = 24;
datetimeToSet.hour = 18;
datetimeToSet.minute = 30;
datetimeToSet.second = 45;
// Establecer los parámetros inicializados en el RTC //
result = RTC_DRV_SetDatetime(0, &datetime);
// leer los valores de tiempo y fecha del RTC //
RTC_DRV_GetDatetime(0, &datetime);
printf("Current datetime: %04hd-%02hd-%02hd %02hd:%02hd:%02hdnrnn",
datetime.year, datetime.month, datetime.day,
datetime.hour, datetime.minute, datetime.second);


El periférico cuenta con la opción de establecer alarmas con la función RTC_DRV_SetAlarm() y con la funcón RTC_DRV_GetAlarm() se puede obtener información sobre la alarma configurada, estas alarmas pueden ser programadas para provocar una interrupción utilizando la función RTC_DRV_SetAlarmIntCmd() o transferir un argumento a la funcón para establecer la alarma. Se pueden tener diversos tipos de alarma, por ejemplo una alarma que se active a una hora específica del día y se repita por cinco minutos un tiempo especificado.
Los otros módulos como el UART, y el GPIO ya se estudiaron en las prácticas pasadas. Por lo que esos periféricos se utilizarán con la misma configuración anterior.



DESARROLLO DE LA PRÁCTICA.
El objetivo de la práctica es: Programar una Alarma que indique la fecha y hora después de haber inicializado el “Real Time Clock” por medio de los Switches 2 y 3 de la tarjeta FRDM k64f, así como utilizando la terminal de Kinetis Design Studio para poder ver los valores del RTC sin necesidad de una comunicación serial.
Desarrollo Parte 1.
Creamos un proyecto nuevo en KDS, seleccionando como tarjeta a utilizar “FRDM K64F”, habilitando la opción para utilizar Procesor Expert.
Desarrollo Parte 2.
Agregamos al proyecto Nuevo el periférico del RTC, GPIO, PIT_timer y UART. Las configuraciones de éstos están en las prácticas pasadas, lo que se va a mostrar es la configuración del RTC en la figura 1.


Figura 1. “Configuración del RTC”

Como se observa en la figura 1 la modificación que se hace es marcar la “Auto inicialización” del periférico.
Y en esta parte configuramos KDS para poder utilizar el comando printf en la terminal del software, para esto se consulta la página en internet MCU ON ECPLISE y una vez que KDS está configurado se procede a la programación, basándose en el diagrama de flujo mostrado en la figura 2.


Figura 2. “Diagrama De Flujo General para Programación”


Como se observa en el diagrama de flujo el programa inicializa el RTC, con la hora y fecha actuales, y posteriormente se estará monitoreando por medio de los botones (Botón 2 y Botón 3) de la tarjeta FRDM K64f para verificar que el RTC efectivamente lleva una cuenta del tiempo y la fecha en tiempo real.
Ahora las funciones que están declaradas en el proceso también tienen un diagrama de flujo para ejecutar una tarea específica de acuerdo al programa principal, estas tareas se declaran en el programa principal pero se ejecutan fuera del programa principal cuando son llamadas, La primer función es la que pone la alarma en estado inicializar, su diagrama de flujo se muestra en la figura 3.


Figura 3. Función Inicializar alarma
La siguiente función que se muestra en el diagrama de Flujo Principal es “BOTONES”, en la cual se reconocerá cuando un botón ha sido presionado, y cómo ha sido presionado si fue sólo un pulso o si fue presionado por un tiempo corto (tipo HOLD), el diagrama de flujo se muestra en la figura 4.


Figura 4. Diagrama de Flujo función Botones.
Las tres últimas funciones (Desactivar Alarma, Reconocimiento Alarma y Activar Alarma) ejecutan una tarea simple ya que el objetivo de la práctica es aprender a utilizar el periférico RTC. El diagrama de Flujo es el mismo para las 3 funciones, por lo tanto sólo se utilizará un solo diagrama para representar a las tres funciones, en la figura 5 se muestra el diagrama de flujo para las funciones a realizar de la alarma.


Figura 5. Diagrama de Flujo Funciones de la Alarma.
Una vez que se tienen los diagramas de Flujo se procede a la programación, utilizando PE y con forme al diagrama de flujo mostrado en la figura 2 lo primero en KDS es inicializar el RTC con una variable la cual asignará los parámetros de fecha y hora a la configuración del RTC, posteriormente se declaran las funciones del programa, como se requiere hacer una alarma se ponen 4 estados, (Inicializar, Desactivar, Activar y Reconocimiento). Cada función realizará tareas diferentes y no regresarán resultado alguno entonces serán de tipo void. Al iniciar el programa la primer función que se llama es Inicializar Alarma, la cual estará ejecutándose mientras no se presione ningún botón, esta función hará que el Led RGB de la tarjeta FRDM K64f parpadee en color amarillo indicando que la alarma está en estado de Inicialización. Esto es la inicialización del programa el código se muestra en la figura 6.

Figura 6. Principio del Programa Alarma con RTC
El programa principal o rutina principal Figura 7. Muestra la siguiente parte correspondiente al diagrama de bloques, en la cual se llama a la función botones (Diagrama de flujo Figura 4) para saber si algún botón fue presionado, en caso de que algún botón haya sido presionado la alarma cambiará de estado y por medio de un switch case se llevará a cabo una tarea determinada.
La programación de la función botones de acuerdo al diagrama de flujo en la Figura 4, muestra el procedimiento para detectar cuando el botón 3 es presionado en tipo pulso o sostenido (Hold), el primer condicional if detecta cuando hay un cambio en el estado del botón es decir si estaba normalmente abierto y fue presionado (hay un cambio de cero a uno), entonces inicializa los valores de tiempo para determinar el tipo de pulso (PULSE o HOLD) y también un tiempo para que no existan “rebotes” al pulsar el botón, es decir que no se presione más de una vez seguida el botón. El segundo condicional detecta cuando hay un cambio en el botón de uno a cero esto quiere decir que el botón ha sido “soltado” y que el tiempo para detectar un pulso HOLD aún no ha terminado entonces el botón ha sido pulsado (PULSE). El tercer condicional funciona cuando el tiempo HOLD ha terminado entonces indica que el botón ha estado presionado por un tiempo y el botón detecta que el tipo de activación fue HOLD.
En todos los condicionales if de la función de botones se pregunta por una bandera, ya que puede ocurrir que el botón sea presionado por más tiempo del establecido en HOLD entonces el botón reconocerá varias veces el tipo de activación HOLD, además al soltar el botón en este caso detectará un tipo PULSE, esta bandera sirve como protección para asegurar que se presione una sola vez el botón ya sea tipo PULSE o tipo HOLD.


El último condicional de la función botones es para indicar que no hay cambio en el botón (que no ha sido presionado o soltado), entonces el botón continua en el mismo estado.  

Figura 7. Rutina Principal del Programa.

Figura 8.Función Botones para botón 3 tipo HOLD y PULSE.
En la figura 8 se observa que los estados de los botones dependen de tiempos, estos tiempos se modifican por medio del Programable Interrupt Timer (PIT timer), el cual está declarado en los eventos del programa, dependiendo de la configuración de tiempo en el PIT timer se produce una interrupción la cual ejecutará una tarea, estas tareas se observan en la figura 9.
Para la práctica se configuró el PIT timer en 1ms por ciclo, con lo cual cada mili segundo se producirá una interrupción la cual preguntará si el valor del tiempo para flash de los leds (time_delay) es diferente de cero, si es así este valor será decrementado, cuando llegue a cero la salida del RGB tendrá un “togle bit”, lo cual generará una acción de flash. Los siguientes dos condicionales (time_deb_sw2 y time_deb_sw3) preguntan por el tiempo anti rebote con el cual el push botón no tendrá pulsaciones repetidas, y el último condicional es para decrementar el tiempo del HOLD del botón 3, mientras el botón 3 esté presionado y el tiempo HOLD sea mayor a cero para evitar desbordamientos, se va a decrementar ese tiempo, cuando el tiempo llega a cero en la función botones se detecta que el botón ha sido pulsado por un tiempo “largo” y se considera pulsación tipo HOLD.
 

Figura 9. Eventos del programa, interrupciones en el PIT timer.
La última parte del programa son las funciones de acuerdo al estado de la alarma, estas funciones se muestran en la figura 10, cada función lee el momento en el que ocurre un cambio en la alarma por medio del RTC, muestra en pantalla la fecha y hora del evento, establece el estado de la alarma con el que se ejecutará una tarea en el programa principal. La primer función es la de inicializar, que es la función por defecto al iniciar el programa, las siguientes funciones son la de Activar y Desactivar, estas funciones son muy parecidas, se muestra un mensaje en pantalla del estado de la alarma, la fecha y hora en la que ocurrió el cambio, posteriormente se modifica el estado de la alarma para llevar a cabo una tarea específica en el programa principal.

Figura 10. Funciones de Estados de la Alarma.
Con lo mostrado anteriormente se completa el programa de Alarma utilizando RTC. Este programa ejecuta una tarea básica en cada estado de la alarma, como prender un led que indica el estado, pero esta tarea se puede complementar por medio de un sistema el cual se desee monitorear y ver cuando ocurren eventos importantes o cambios. El objetivo de la práctica es también utilizar el Real Time Clock que es un reloj en tiempo real, con el cual se puede monitorear cualquier aplicación o programar actividades a cierta hora y día específico de la semana.

Proyecto de la práctica:
https://www.dropbox.com/sh/ec91i98x9hdkg3a/AADEGlCoy9U6foWCkjRT9eT-a?dl=0

No hay comentarios:

Publicar un comentario