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

No hay comentarios:

Publicar un comentario