lunes, 16 de diciembre de 2013

Hercules Launchpad #3 - Interrupciones (Interrupts) Parte 1

Ahora vamos a rediseñar el programa anterior para que funcione con interrupciones y sea más eficiente. 
El microcontrolador que trae la tarjeta tiene dos prioridades para las interrupciones: prioridad alta (High) y prioridad baja (Low). Como ustedes sabrán (o no), las interrupciones son causadas por eventos fuera del flujo normal del programa (pulsar un botón, por ejemplo). Cuando se genera la interrupción, el programa salta inmediatamente a algo llamado "Interrupt Service Rutine" (rutina de servicio a las interrupciones) o SCR, que es un espacio en la memoria con instrucciones que responden a la interrupción según lo que queramos.
Este microcontrolador posee algo llamado "Vectored Interrupt Manager" y es el módulo que nos ayuda a configurar y reaccionar a las interrupciones. Si nos vamos al manual, podemos ver lo siguiente

Los 96 canales son las fuentes de interrupción y todas se pueden configurar a través de HALcoGen, así que comencemos.

Paso 1:
Abrimos HALcoGen, creamos nuestro proyecto y habilitamos únicamente el GIO Driver. Luego nos vamos a la pestaña de GIO y habilitamos la salida del bit 2 (LED) y en el bit 7 habilitamos la interrupción con flanco de subida (Rising Edge) y baja prioridad (Low Priority)


Paso 2:
Ahora hay que configurar el VIM. Para esto nos vamos a la pestaña del microcontrolador (RM42L432PZ) y nos vamos a la subpestaña que dice "VIM Channel 0 - 31". Ahí mismo nos vamos al número 23 que dice "GIO Int B".

Nota: "GIO Int B" se usa para las interrupciones de baja prioridad (Low Priority), mientras que "GIO Int A" se usa para las interrupciones de alta prioridad (High Priority).

Ya que tenemos configurado todo, generamos el código (F5).

Paso 3:
Ya que generamos los archivos, abrimos Code Composer Studio y creamos un nuevo CCS Project con nuestras especificaciones y lo configuramos para que acepte los archivos de HALcoGen.
Luego abrimos el archivo "notification.c" para configurar lo que queremos que el micro haga cuando genere nuestra interrupción. Como podrán ver, el archivo está casi vacío, por lo que es evidente que está diseñado para que nosotros escribamos nuestro código. Si nos vamos a donde está el comentario 19, podemos observar que éste se encuentra dentro de la función "gioNotification". Si vemos el manual de ayuda de HALcoGen, podemos ver que la función acepta 2 parámetros: el puerto y el número de bit. Por lo tanto, para saber si la interrupción fue generada por el botón, hay que escribir el código siguiente

void gioNotification(gioPORT_t *port, sint32 bit)
{
/*  enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (19) */
// Checa si el botón generó a interrupción
if((port==gioPORTA) && (bit==7))
{
// Enciende y apaga el LED
gioToggleBit(gioPORTA, 2);
}
/* USER CODE END */
}
Paso 4:
Ahora nos vamos al archivo "sys_main.c" e incluimos la librería del GIO.

/* USER CODE BEGIN (0) */
#include "gio.h"

/* USER CODE END */

Y más abajo escribimos

void main(void)
{
/* USER CODE BEGIN (3) */
// Inicializa los módulos
gioInit();
_enable_IRQ();

// Ciclo infinito
while(1);
/* USER CODE END */
}

Noten que en el programa principal sólo hay que inicializar los drivers y crear un ciclo infinito, ya que el VIM se encarga de controlar las interrupciones. Esto hace que el microcontrolador no esté checando constantemente si el botón fue presionado mientras está en el programa principal, sino que lo hace como que en paralelo.

Les dejo el código que hice

http://www.mediafire.com/download/i32fbdbub7vsvv4/Tutorial%203.zip

My Github
https://github.com/DiegoRosales

No hay comentarios:

Publicar un comentario