INTRODUCCIÓN
Esta sesión muestra la forma de utilizar salidas y entradas digitales de la tarjeta FDRMK64.
DESARROLLO DE LA PRÁCTICA
Como se mencionaba anteriormente en esta práctica utilizaremos 4 ejemplos de salida para el led de la tarjeta. Pero primero vamos a ver las generalidades que tenemos en común para todos o varios de los ejemplos.
Lo primero que analizaremos serán los componentes que agregamos y la configuración de cada uno de estos componentes. Ya no se abordará tan afondo como en la práctica 1 la manera de agregar los componentes puesto que ya se mostró en esa práctica. Así que los componentes que se utilizan son:
Figura 1. “COMPONENTES UTILIZADOS EN LA PRÁCTICA”
Primero veremos la configuración del CPU y el reloj del CPU. Es importante mencionar que la configuración del CPU (y el reloj) es exactamente la misma que la de la práctica 1. Así que para mayor información es aconsejable revisar dicha práctica.
Figura 2. “CONFIGURACIÓN DEL MODULO Cpu:MK64FN1M0VLL12”
Figura 3. “CONFIGURACIÓN DE RELOJ DEL CPU clockMan1:fsl_clock_manager”
Ahora continuaremos con la configuración del siguiente componente el cual es para la configuración de los pines. Este es el apartado donde se asigna un nombre personalizado a determinado pin de la tarjeta para poder llamarlo con mayor facilidad en el código. El componente que analizaremos es el pin_mux:PinSettings. Cabe mencionar que esta configuración es exactamente igual que la de la práctica 1. Así que para más información es recomendable analizar esa práctica
Primero veremos la configuración del GPIO
Figura 4. “CONFIGURACIÓN DE PINES PARA EL GPIO”
El último componente a analizar es el pitTimer1:fls_pit. La configuración es parecida a la de la práctica 1, pero en este caso el periodo está ajustado a 1 ms en lugar de 1000 ms.
Figura 5. “CONFIGURACIÓN DEL pitTimer”
Ya hemos terminado de ver la configuración de los componentes que se utilizarán en la práctica. Como pudimos ver la configuración es casi la misma que la configuración de la práctica pasada. Así que lo que cambiará principalmente es el código utilizado. Como se mencionó al principio de esta práctica abordaremos 4 ejemplos distintos. Comencemos con el primero.
BOTÓN POR PULSO
Primero veremos el ejemplo para el botón por pulsos. Esto significa que solo estará activo mientras el usuario presione el botón, al soltarlo la función que ejecuta el botón desaparece. En este caso la acción que ejecuta el botón es encender un led. Al presionar el botón el led enciende, cuando soltamos el botón el led se apaga.
Lo primer es la declaración de dos “palabras” con valor, en este caso down=0 y up=1. Esto a la vez que declaramos una variable que puede tomar los valores ‘up’ y ‘down’. La variable es llamada sw_state.
También declararemos dos constante enteras llamadas SW_DOWN=0 y SW_UP=1.
La siguiente instrucción es la inicialización del Processor Expert.
Después tenemos el loop que hará que las instrucciones se ejecuten una y otra vez sin fin. Este lazo repetitivo lo lograremos gracias a un for infinito
Dentro del loop del for tendremos un par de if-else. Esta instrucción evalúa una condición, si esta se cumple ejecuta una instrucción. Si la condición no se cumple ejecuta una instrucción diferente.
Dentro de la condición del if preguntamos por el estado del SW3 (switch 3) y lo comparamos con la constante previamente declarada SW_DOWN (con valor 0). Si el estado del switch 3 es igual (==) que 0 (SW_DOWN) entonces manda a limpiar el bit correspondiente (y previamente configurado) al LED_GREEN.
Si la condición no se cumple, es decir que el estado del switch 3 sea diferente de 0, entonces activa el bit correspondiente al LED_GREEN.
Figura 6. “DIAGRAMA DE FUNCIONAMIENTO DE LOS SWITCHS DEL GPIO”
Figura 7. “DIAGRAMA DEL FUNCIONAMIENTO DE LOS LEDS RGB DEL GPIO”
Podemos apreciar de la figura 7 que los puertos PTA4 y PTC6, que son los puertos asignados están siempre en estado activo (1). Y cuando el respectivo switch es presionado, los puertos PTA4 y PTC6 quedan en cero (0).
Como podemos apreciar de la figura 8 los leds se activan cuando el puerto tiene un 0 lógico puesto que el ánodo de los leds tiene un 1 como entrada.
Ahora. Al soltar el botón la condición del ‘if’ deja de cumplirse por lo que ejecuta la instrucción del ‘else’. Esta instrucción nos dice que activará (pone el bit en 1 lógico) el bit asignado al LED_RED, y, como vimos cuando analizamos el funcionamiento de los leds. Cuando el bit está en 1 lógico ocasiona que el led se apague. Por lo cual al soltar el botón el led se apagará de inmediato.
Entonces el programa hace lo siguiente: se pregunta si el switch 3 (del puerto PTC6) es igual a 0 (es decir, que el switch esté presionado o down), cuando esto se cumpla manda a limpiar (poner en 0 lógico) el puerto del LED_GREEN (PTE26), por lo cual el led verde enciente cuando el switch 3 esté presionado. Al soltar el switch 3 el led se apaga de inmediato.
El otro if-else se puede analizar de manera análoga pero para el switch 2 y el led rojo. Entonces al presionar el switch 2 encenderá el led rojo. Al soltarlo se apagará
En caso de prender ambos al mismo tiempo encenderá el led en color amarillo.
Una vez se tenga programado todo el código y se hayan realizado las configuraciones necesarias de los componentes por medio del Processor Expert falta compilar el programa e ingresarlo en la tarjeta. Para más información sobre cómo hacer esto revisar la práctica 1. Los switch que utilizaremos para la práctica serán los switches que vienen integrados en la FRDM-K64F y encenderá el led que también viene integrado en la misma.
BOTÓN TIPO LATCH
Todos los ejemplos mostrados en esta práctica tienen como elemento en común el cuerpo en general del programa, así que del código mostrado en la figura 6 lo UNICO que modificaremos son las instrucciones dentro del for infinito. Para esta segunda práctica las instrucciones son las siguientes:
Aquí tendremos dos instrucciones if. Las cuales evaluaran si se cumple una condición. Si se cumple realizan la instrucción siguiente (o set de instrucciones si tiene llaves ‘{ }’ ). Si la condición no se cumple se saltará la instrucción hasta la siguiente.
El primer if pregunta por el estado del switch 2 y si es equivalente a SW_DOWN (el cual tiene un valor de 0) manda a limpiar el bit asignado al LED_BLUE.
El segundo if pregunta por el estado del switch 3 y si es equivalente a SW_DOWN, es decir que el switch 3 se encuentre presionado, manda a poner el bit asignado al LED_BLUE.
Entonces lo que el programa hace es lo siguiente: Cuando presionamos el switch 2 limpia el registro del LED_BLUE, por lo cual enciende el led en color azul. Se mantendrá así hasta que presionemos el switch 3 quue manda a activar el registro del LED_BLUE, con lo cual se apagará y permanecerá así hasta que vuelvan a presionar el switch 2. Para más información sobre la conexión de los switches o led revisar el ejemplo 1 ‘boton por pulsos’ más arriba en esta misma práctica.
SALIDA TIPO TOGGLE
Para este ejemplo agregaremos unas variables de tipo booleano con los nombres edo2_act, edo2_ant, edo3_act y edo3_ant. Se agregarán en la parte del código mostrado a continuación.
Y el código para el ejemplo 3 queda como sigue:
Analizaremos el primer set de instrucciones:
La primera instrucción es un if que comparará el estado del pin SW2 con SW_DOWN (0). Si la condición se cumple (lo que significa que el switch está en 0 o presionado) asigna el valor 0 a la variable edo2_act. Si la condición no se cumple (lo que significa que el switch está en 1 o sin presionar) asigna el valor de 1 a la variable edo2_act. Podemos ver de lo anterior que la variable edo2_act nos dirá cuál es el estado actual del switch 2. Después comparará si la negación del estado 2 actual (edo2_act) es igual a 1, y si el estado 2 anterior (edo2_ant) es igual a 1. Es decir, evalúa si el estado 2 actual está en 0 y el estado 2 anterior está en 1. Si ambas condiciones se cumplen manda a cambiar el estado del pin asignado del LED_BLUE (si estaba en 1 cambia a 0, si estaba en 0 cambia a 1). La instrucción final asigna el valor del estado actual 2 (edo2_act) al estado anterior 2 (edo2_ant) para la siguiente iteración.
Así que el programa hace lo siguiente: cuando comienza el programa el led está apagado. Al presionar el switch 2 el led encenderá en azul. Si volvemos a presionar el switch 2 el led se apagará y así sucesivamente.
Se puede analizar de manera análoga el siguiente set de instrucciones pero aplicado para el switch 3 y el led verde. Al presionar el switch 3 encenderá el led de color verde y al volver a presionar el switch 3 se apagará el led. Si las salidas del LED_BLUE y el LED_GREEN se activan simultáneamente el len encenderá en color azul claro.
LED PARPADEANTE
Este es el último ejemplo de esta práctica y mostramos es código a utilizar dentro del for infinito
Sólo que en este caso haremos uso de la interrupción generada por el pitTimer. El código de las interrupciones se encuentra en el archivo Events.c del proyecto
Una vez que hayamos abierto el archivo de eventos debemos localizar la función de interrupción del pitTimer
Podemos ver que hay una única función la llamada: void PIT0_IRQHandler (void). Esta función es la que corresponde a la interrupción del pitTimer. Recordemos que en la primera sección de esta práctica ajustamos el periodo del timer a 1 ms. Es decir que el timer genera una interrupción cada milisegundo. Así que aprovecharemos esta interrupción para nuestro programa.
Así que utilizaremos las declaraciones de variables y constantes que pusimos antes de la función main del programa main.c
Definimos 3 constantes llamadas TIEMPO_ROJO, TIEMPO_VERDE Y TIEMPO_AZUL. Las cuales tienen valores de 250, 500 y 1000 respectivamente. Además de 3 variables enteras de 16 bits llamadas TiempoRojo, TiempoVerde y TiempoAzul.
Dentro del archivo Events.c dentro de la interrupción del timer colocaremos el siguiente código:
En el código anterior decimos que si la variable TiempoRojo es diferente de 0 entonces restará una unidad a la variable TiempoRojo y lo guardará ahí mismo. Lo mismo para las líneas siguientes con los colores verde y azul.
Recordemos el código utilizado dentro del for infinito
En este código decimos que si la variable TiempoRojo es igual con 0 entonces:
- Haga cambiar el estado del LED_RED
- Que le asigne el valor de la constante TIEMPO_ROJO a la variable TiempoRojo.
Lo mismo para el LED_GREEN y LED_BLUE
Entonces el programa hace lo siguiente:
Al inicio las variables TiempoRojo, TiempoVerde y TiempoAzul tienen un valor de 0 y los leds se encuentran apagados (1 lógico en los respectivos pines). Como el valor de las variables de tiempo es 0 entonces entra en todos los if, cambia de estado todos los leds, o sea, los enciende (0-lógico en los pines). Además carga el valor de las constantes a las variables.
Hecho esto recordemos que el pitTimer genera una interrupción cada milisegundo y dentro de las instrucciones de la interrupción decimos que si las variables de tiempo son diferentes de 0 reste en una unidad la variable. Entonces restará una unidad cada milisegundo a las variables y cuando llegue cada una a cero (notemos que llegan a cero en distintos tiempos ya que las constantes tienen diferentes valores) mandará a apagar el respectivo color del led y vuelve a cargar las variables con el valor de las constantes. Este ciclo se repetirá sin fin gracias al for infinito. El resultado es que enciende el color de los leds a veces todos al mismo tiempo, a veces solo dos de ellos (cualquier combinación) a veces 1 sólo. Cuando se encienden 2 o más colores del led al mismo tiempo se genera una combinación de colores. Esto da como resultado que el led cambie de color pasando por todas las combinaciones que pueden generar estos 3 colores.
No hay comentarios:
Publicar un comentario