Mostrando entradas con la etiqueta GIO. Mostrar todas las entradas
Mostrando entradas con la etiqueta GIO. Mostrar todas las entradas

domingo, 22 de diciembre de 2013

Hercules Launchpad #4 - Interrupciones (Interrupts) Parte 2

En la parte 1 de esta entrada vimos cómo el procesador puede reaccionar a las interrupciones generadas por cambios en el estado de un bit (el bit del push button). Ahora veremos cómo el procesador puede reaccionar a las interrupciones generadas por el HET (High End Timer) y por el módulo RTI (Real Time Interrupt). Este último módulo está especialmente diseñado para medir cuentas de tiempo.
En este ejemplo vamos a hacer que se prendan los dos LEDs que tiene la tarjeta, pero con diferente frecuencia. Uno de los LEDs va a ser el resultado de las interrupciones del HET y el otro del RTI.

Paso 1:
Abrimos y configuramos HALcoGen de la siguiente manera. Primero en la pestaña de Driver Enable habilitamos los drivers RTI, GIO y HET.

Luego nos vamos a la pestaña de RTI y en la subpestaña que dice "RTI1 Compare" configuramos el comparador 0 para que mande una interrupción cada 200ms, por ejemplo.


Nota 1: El RTI puede interrumpir por desbordamiento o por comparación. Es decir, puede interrumpir cuando el contador llega a su límite y debe comenzar desde cero o cuando la cuenta es igual a la constante que definimos para comparar.

Ya que tenemos eso, nos vamos a configurar el HET. Configuramos el PWM0 para que tenga un período de 1 segundo con un ancho de pulso del 80% para que se vean bien los cambios.


Luego en la subpestaña que dice "Pwm Interrupts" habilitamos las interrupciones que dicen "End of duty" y "End of period" en High Level. Habilitamos las dos para que el LED se encienda cuando termina el ciclo de trabajo (la parte alta) y se apague el resto del periodo.


Nota 2: El HET tiene 3 modos de interrupción: cuando acaba el ciclo de trabajo, cuando acaba el periodo o cuando detecta un flanco (de subida o bajada) en alguno de los pines si es que estos están configurados como entradas.

Ahora habilitamos el LED (Bit 8) en la subpestaña que dice "Pins 8-15" para que sea una salida.


Luego en la pestaña que dice "GIO" configuramos el bit 2 (el que está conectado al otro LED) como salida.


Por último en la subpestaña que dice "VIM Channel 0-31" dentro de la pestaña principal (RM42L432PZ) habilitamos el canal 2 (RTI Compare 0) y el canal 10 (HET Level 0).


Estas han sido todas las configuraciones necesarias de HALcoGen. Ya podemos generar los archivos (F5).

Paso 2:
Ahora comencemos con el código. Dentro de Code Composer Studio creamos nuestro nuevo proyecto igual como le hemos estado haciendo (Paso 5 Paso 6 del primer tutorial). Luego, en el archivo "sys_main.c" escribimos lo siguiente.
Paso 2.1 (includes):
Los archivos que hay que incluir son los siguientes






Paso 2.2 (main()):
En el main hay que inicializar los módulos y las interrupciones (ya que no parece haber manera de que se inicializen desde el principio usando HALcoGen). También hay que hacer que el contador 0 del módulo RTI comience a contar.















Paso 2.3 (control de interrupciones):
Luego hay que irnos al archivo "notifications.c" para ver qué hacemos con las interrupciones. Dentro del control de interrupciones del RTI escribimos lo siguiente












Nota 3: En este pedazo de código pueden ver cómo las funciones del GIO pueden controlar los pines del módulo HET.

Dado que no tenemos ninguna otra fuente de interrupciones del RTI, no hay que ponerle ningún if para ver de dónde vienen las interrupciones. Lo mismo sucede con el control de interrupciones del HET (pwmNotification).










Y pues ya con esto tenemos todo el código que necesitamos. Si lo corremos en la tarjeta, podemos ver que los dos LED prenden y apagan a velocidades distintas, pero sincronizadas. Llega un punto donde los dos LEDs encienden y apagan al mismo tiempo, ya que 200ms es múltiplo de 1 seg y el 80% de 1 segundo son 200ms!!!

Les dejo los archivos.
https://www.mediafire.com/?4i1y1jdm4clt88h

My Github
https://github.com/DiegoRosales

Nota 4: El manual de ayuda de HALcoGen es de gran ayuda. Viene extremadamente bien documentado y trae algunos ejemplos.

viernes, 13 de diciembre de 2013

Hercules Launchpad #2 - GPIO (GIO)

Ahora les voy a mostrar lo que he aprendido de los General Propouse Input Output (GIO o GPIO). Esta tarjeta tiene un chorro de pines que pueden ser controlados como queramos, uno de los cuales está conectado a un push-button que podemos usar para lo que queramos. Otro de los pines está conectado a un LED que también podemos ocupar. Genial, no? Les voy a enseñar como usar el push-button para controlar el LED, pero sin usar interrupciones (por ahora).


Paso 1:
Comencemos configurando los archivos usando HALcoGen. Lo primero es seleccionar los drivers que queremos. En este caso será solo el GIO Driver.




Luego hay que habilitar el pin al cual está conectado el LED como salida. Este pin es el GIOA2, como viene marcado en la tarjeta. Esto significa que de los 8 bits que tiene el puerto GIO A, el LED está conectado al bit número 2. El botón está conectado al bit 7 de este puerto.



Al bit 7 no hay que moverle nada ahorita, ya que siempre tienen la entrada habilitada.
Ahora hay que generar los archivos (F5).

Nota: El GIO tiene sus propios puertos, pero eso no significa que se limite a controlar únicamente sus puertos. También puede controlar los puertos del HET y mandar y recibir bits a su voluntad.

Paso 2:
Ya que tenemos los archivos generados, abrimos un nuevo proyecto y lo configuramos como la vez anterior (Paso 5 y Paso 6 del tutorial anterior). Ya que lo tenemos configurado, abrimos el archivo "sys_main.c" y comenzamos a escribir nuestro código.

Paso 2.1:
Hay que incluir las librerías necesarias para acceder a las funciones del GIO. Esta vez sólo utilizaremos "gio.h". El código se verá así


/* USER CODE BEGIN (0) */
#include "gio.h" // Incluimos la librería del GIO
/* USER CODE END */


Paso 2.2:
Ahora hay que escribir el código que reaccione al botón y encienda y apague el LED.
Para que el programa "lea" lo que está haciendo el botón, usamos la función "gioGetBit(gioPORTA, 7)". Les explico cómo funciona. "gioGetBit" es una función que lee un bit de un determinado puerto. En este caso, el puerto es el gioPORTA, que dentro del archivo "reg_gio.h" está declarado como 

#define gioPORTA ((gioPORT_t *)0xFFF7BC34U)

El 7 significa que es el bit número 7.
Para hacer que el bit encienda y apague, habrá que utilizar la instrucción "gioToggleBit(gioPORTA, 2)". Esto es muy parecido a lo anterior. La función "gioToggleBit" hace que si el bit está en "1", lo vuelve "0" y viceversa.
Finalmente el código quedaría

void main(void)
{
/* USER CODE BEGIN (3) */

// Inicializa el driver GIO
gioInit();

// Declaramos la variable para el loop
int i;
while(1)
{
if(gioGetBit(gioPORTA, 7)==1)
{
// Enciende y apaga el LED
gioToggleBit(gioPORTA, 2);

// Se espera un poco para volver
// a encender y apagar el LED
for (i=0; i<1000000; i++)
{
// Aquí no hacemos nada
}
}
else
{
// Si no presionamos el botón
// El led se vuelve cero
gioSetBit(gioPORTA, 2, 0);
}
}
/* USER CODE END */

}

Si compilan este código, debería parpadear el LED cuando presionan el botón y permanecer apagado mientras no lo presionan.



Les dejo el link para que puedan descargar el código

https://www.mediafire.com/?l58uja983dx2xwr

My Github
https://github.com/DiegoRosales