Introducción al CC 2541 (Parte 2) “HOLA MUNDO”

Standard

Hola compañeros, otra vez tengo la oportunidad de dirigirme a ustedes. En un post anterior les había hablado sobre el microcontrolador de texas instruments, el CC 2541, Entre varias características que contiene, podemos destacar el hecho de venir integrado con un ble 4.0 y de ser un micro de ultra bajo consumo. Entre otras cosas que ya hablamos en el anterior post: Introducción al cc 2541 (Parte 1).

Ahora, ya pasando la parte teórica, veremos a continuación un poco más lo que es la interfaz de programación, como tambien el codigo, cómo se divide para lograr entenderlo un poco mejor y así comenzar a experimentar con el, cómo ya no ver y pensar si esta en chino.

Para comenzar, debemos tener en cuenta algunas cosas. En primer lugar el micro se programa y compila con: embedded workbench 8051

La principal desventaja de este programa es que es de paga, por lo que la empresa nos ofrece 2 opciones: la primera probarlo por 30 días o códigos que pesen  4k o menos.

En segunda, debemos tener los drivers adecuados. Ademas, utilizaremos ejemplos para entender un poco mejor como funciona el micro: smartrftm studio y ble stack

Y nuestro software necesario para subir el codigo a nuestro micro: Flash Programmer

PROCEDIMIENTO.-
  1. Comenzamos por abrir nuestro entorno, nos encontraremos  una interfaz como esta:

cc2541

2. Lo siguiente es cargar el ejemplo que vamos a utilizar. Para eso,  en la esquina  superior izquierda, vamos a file- Open- Workspace.

cc2541 2

3. Siguiendo con esto. Abriremos el código de sensortag, si instalamos adecuadamente, sensortag estará en la ubicación “C:\Texas Instruments\BLE-CC254x-1.4.1.43908b\Projects\ble\SensorTag\CC2541DB” y abrimos nuestro workspace. la interfaz nos mostrara algo parecido a esto:

cc2541 23png

Nos demos cuenta que nos abre o nos muestra varias “carpetas”, podemos decir que cada carpeta es una capa diferente de  nuestro programa, lo que nos facilita la organización y entendimiento del mismo.

A continuación explicaremos un poco mejor en que consiste las  carpetas principales:

Primero la carpeta “APP” están nuestros loop principal, como también nuestro código principal, el que controla las diferentes llamadas a  las bibliotecas y funciones. En este caso  tenemos  “OSAL_SensorTag.c” el cual es el archivo que contiene las funciones que permiten las tareas de configuración del usuario,  también encontramos  “SensorTag.c y .h” los cuales contienes la aplicación del sensor tag en este caso para su uso con el protocolo BLE de TI.

Y por ultimo “Sensor_Tag_Main.c” el cual contiene las definiciones y prototipos de  las aplicaciones de nuestro sensor tag (este es el loop main de nuestra aplicacion).

Seguimos “HAL” o capa de abstracción de hadware que básicamente se encarga de controlar o  comunicarse con nuestro hardware como sensores y /o actuadores. Este se divide en varias subcarpetas, aunque básicamente solo estaremos configurando y modificando la  subcarpeta “target” donde se encuentran las bibliotecas de nuestros sensores, y también las encargadas de interactuar y ayudarnos con el manejo de diferentes  herramientas como son el I2C, interrupciones etc…

Lo siguiente que nos interesa es la carpeta ” OSAL“, puesto que en ella encontraremos funciones y una interacción a un nivel más profundo de nuestro micro, en si contiene capa de abstracción de sistema operativo, pues en esta capa nos encontraremos con nuestro sistema operativo, y todo lo que contiene.

Por ultimo la carpeta “profile”  que contiene todos los servicios  que maneja nuestro BLE.  y los diferentes profiles, cada servicio controla qué  y cuánta información se envía, ya sea de los sensores o de la función en si que se maneje.

Aunque todo esto lo necesitaremos para saber como funciona nuestro SOC (System of Chip) lo primero será familiarizarnos con este micro controlador por eso lo primero será el ejercicio más básico y sera un blink de un led.

EJERCICIO PRÁCTICO.-

Primero que todo descarguen este  PDF . El cual será como nuestra biblia en estos primeros ejercicio.

Como estamos utilizando  el proyecto de sensortag,  abriremos el archivo “SensorTag_Main.c” y comentaremos todo,  menos la linea de “Hal_BOARD_INIT();”  puesto que aún no trabajaremos con las funciones “HAL

Y a los include agregamos:

#include <ioCC254x_bitdef.h>

#define BLUE       P0_5
#define RED        P0_6

int main(void)
{
Hal_BOARD_INIT();
P0SEL = 0x00;// all as I/O  Peripheral
P0DIR = 0x60; // pins 3,5,6 has output,  other as input
P0INP|=0x0E; // pull or 3 state active
P1INP =0x00;  // pull or 3 state active
P2INP = 0xE0; //PULLUP,PULLDOWN configure

RED=0;

BLUE=1;

for(;;){

for(i=0;i<200000 ;i++) // ciclo para un delay de x tiempo
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}

RED=!RED;

BLUE=!BLUE;

}

Para entender un poco mejor el código, nos iremos a la pagina 81 del pdf donde encontraremos algo como esto:

pins

Donde cada PX corresponde a un puerto con sus respectivos pines, y están agrupados en 8 (para poder modificar los registros fácilmente) donde, por ejemplo P0_0 corresponde al primer bit del puerto “0” y así sucesivamente.

Ahora con  PXSEL,  donde X será el puerto, decidimos bit por bit si queremos que se comporte como pin de I/O o periperial (función especial) que está dada por  la tabla de arriba. (Timers, comuniacación, etc) por ejemplo si ponemos P0SEL= 0X0C. Que sería igual a configurar el puerto 0, y en este caso 0C se refiere a los pines P0_2 y P0_3. O Si lo vemos en binario sería igual a “00001100” y estos pines se configuran como periféricos (timers) y los demás como pines I/O.

PXDIR  para los pines configurados como I/O decidimos  individualmente si van a ser de entrada o salida en nuestro ejemplo 3 ,5 y 6 como salida, los demás como entrada (por default el valor 0 es de entrada).

PXINP sirven para 2 cosas del 0 y 1  simplemente si se podrá configurar los pull-up/down o serán tri-state, el tristate el pin entra en alta impedancia y “borra cualquier huella en el sistema” como si no existiera el pin, y para el  2 se configurará si quieres que sean pull up o pull down, esto no se puede configurar por pin, sino solo por puertos.

Por último tenemos nuestro ciclo infinito, que en este caso se usó “for(;;)” aunque también se puede utilizar while, y  otro ciclo for vacio, para crear un delay

Y así crearemos el efecto blink en el led, pues  cuando sale del ciclo que hace de delay niega el anterior estado del pin  en nuestro caso de esta forma RED =!RED;

Hasta aquí este sencillo “hola mundo” en nuestro modulo CC2541, en una próxima entrega, haremos algunos cuantos ejemplos más, de manejos de registros, para comprender mejor como funciona el micrro y así cuando utilizamos la capa “HAL” podamos comprenderlo fácilmente.

 SALUDOS Y EXITOS A TODOS

Leave a Reply

Your email address will not be published. Required fields are marked *