viernes, 27 de junio de 2014

HOLA MUNDO!! NXP LPC2103 - Parte 2ª

REGISTROS GPIO

 2ª entrada del proyecto HOLA MUNDO con LPC2103 de la placa UNO32 Core Board.

En esta entrega me centrare en explicar que son los registros GPIO en ARM.



Lo primero es expilcar que ARM es una arquitectura de carga y almacenamiento, por lo que para realizar cualquier instrucción de procesamiento de datos, los datos primero tiene que ser trasladados desde el almacén de memoria a un conjunto central de registros, la instrucción de procesamiento de datos se ejecuta y luego los datos se almacenan de nuevo en la memoria.

El método mas básico para hacer que el microcontrolador interactue con el mundo exterior es atraves de los registros GPIO.

GPIO (Entrada/ Salida de Propósito General) es la manera mas fácil de interactuar con periféricos básicos, como botones, LEDs, interruptores, y otros componentes. También se puede utilizar para varios periféricos mas complejos como LCDs, GPS, TFT, sensores, etc,.

Como podemos ver en la imagen anterior nuestra placa cuenta con 32 pines de I/O, es decir 1 puerto GPIO de 32 bits que se controla con 4 registros de 32 bits, donde cada bits corresponde a un pin de la placa, el bit 0 corresponde al pin P0.0 de nuestra placa, el bit 1 al pin P0.1 y así sucesivamente y en los 4 registros.

-IODIR:
Es un registro de 32 bits, que se utiliza para establecer la dirección del pin, es decir que mediante el uso de este registro, se puede establecer un pin en particular como entrada o como salida.
Cada bits corresponde a uno de los 32 pines del puerto en cuestión. Un 1 lógico indica una salida, y un 0 lógico, una entrada.
Por ejemplo, si se quiere usar los pines del puerto GPIO para enviar señales fuera del microcontrolador a algun dispositivo externo, se tendrá que poner un pin (por ejemplo P0.10) en valor alto (1). Se podría hacer con el siguiente código:
//en binario
IODIR = 0b 0000 0000 0000 0000 0000 0100 0000 0000 ;
//en Hexadecimal
IODIR = 0x400;
//a nivel de bit
IODIR = (1 << 10);

Para mantener la configuración anterior presente en el registro y solo modificar el pin 10 se puede recurrir a operación lógica OR " | " y utilizando todo el registro:
//IODIR | = 0x400;

Para poner mas de un pin como pines de salida escribiendo a nivel de bits, se puede hacer así:
//IODIR | = (1 << 9) | (1 << 10) | (1 << 11) ;


Si por lo contrario se quiere utilizar el mismo pin del puerto GPIO para recibir información del mundo exterior y que el microcontrolador pueda leerlo, se tendrá que establecer en el registro el bits correspondiente a P0.10 a un valor bajo (0), esto se podría hacer con el siguiente código:
IODIR &= ~(0x400);
//o
IODIR &= ~(1 << 10);
//Para configurar un pin como pin de entrada, es necesario usar siempre el operador &.


-IOSET:
Registro de 32 bits, que se utiliza para poner en alto el valor del pin al cual corresponde el bits del registro en que se escribe.
Se realiza poniendo un 1 en el bits correspondiente del registro, escribir un cero en este registro no tiene ningun efecto en el comportamiento del puerto.
Se realizara con el siguiente codigo:
//en hexadecimal
IOSET = 0x400;
//a nivel de bit
IOSET = (1 << 10);
//Para poner mas de un pin a nivel alto escribiendo a nivel de bits, se puede hacer asi:
IOSET | = (1 << 9) | (1 << 10) | (1 << 11) ;
//en hexadecimal
IOSET = 0xE00;


-IOCLR:
Registro de 32 bits, que se utiliza para poner en bajo el valor del pin al cual corresponde el bits del registro en que se escribe.
Se realiza poniendo un 1 en el bits correspondiente del registro, además escribe un 0 en el bit respectivo en IOSET, escribir un cero en este registro no tiene ningún efecto en el comportamiento del puerto.

Se realizara con el siguiente código:
//en hexadecimal
IOCLR = 0x400;
//a nivel de bit
IOCLR = (1 << 10);
//Para poner mas de un pin a nivel bajo escribiendo a nivel de bits, se puede hacer asi:
IOCLR| = (1 << 9) | (1 << 10) | (1 << 11) ;
//en hexadecimal
IOCLR = 0xE00;


-IOPIN:
Registro de 32 bits, que se utiliza para leer los pines del puerto GPIO, pueden leerse sin importar si están configurados como entrada o como salida.
Si el valor cuando se lee mediante el uso del registro IOPIN es 1, entonces el valor del pin es actualmente alto, y un valor de 0 significa que el pin tiene un valor bajo.

Dado que IOPIN devuelve el valor actual de los 32 pines a la vez, se tiene que escribir el siguiente código para determinar el valor de un pin especifico:
estadoPin10 = (IOPIN) & (1 << 10) ?1:0;
El operador condicional “?” devolvera uno de los dos valores, si es cierto devolvera el primer valor, si es falso devolvera el segundo valor, el que va despues de “ : ”.
//comparacion
if ((IOPIN) & (1 << 10) == 0 )

Pues hasta aqui la 2ª parte de este proyecto. No se pierdan la siguiente entrada donde terminaremos el proyecto.

 Y recordad que podemos comprar la placa uno32 aquí.

No hay comentarios:

Publicar un comentario