Funciones básicas del microcontrolador

Funciones básicas del microcontrolador

Creación de Proyectos con IAR

IAR es el entorno de programación bajo el que desarrollaremos nuestras prácticas. Los archivos que componen un programa en el msp se agrupan en torno a lo que se denominan proyectos. IAR permite tener diferentes proyectos agrupados en un mismo espacio de trabajo con parámetros comunes a todos. Vamos a ver cómo crear un espacio de trabajo en el que podremos ir almacenando nuestros proyectos de eZ430-RF2500T.

Necesitamos crear un directorio para nuestro espacio de trabajo. Una buena elección podría ser:

 Mis Documentos\workspace

Ahora vamos a crear dentro un proyecto para tener una referencia de como crearlos en las prácticas y ejercicios. Lo más cómodo es tener la carpeta que lo tiene dentro de nuestro espacio de trabajo. Por ejemplo en:

Mis Documentos\workspace\proyecto1

Conectamos nuestra placa USB al PC y lanzamos el IAR. En la pantalla inicial, seleccionaremos crear un nuevo proyecto en el espacio de trabajo actual ("Create new project in current workspace"). En la siguiente pantalla, dejaremos la opción "Tool Chain" en "MSP430" y escogeremos como plantilla "C" - "main". 

Ahora salvaremos nuestro espacio de trabajo y proyecto en las rutas que creamos a tal efecto.

Tenemos que configurar el proyecto para que utilice nuestro microcontrolador. Nos dirigimos al menu "Project" y seleccionamos "Option". Disponemos de varias categorías en las que tendremos que definir las opciones:

  • General Options: En la pestaña "Target" escogemos "Device" "MSP430F2274",
  • Debugger: En la pestaña "tab", escogemos "Driver" "FET Debugger".
  • C/C++ compiler: En la pestaña "preprocessor"  incluiríamos las rutas de las librerías adicionales, en el campo de texto "Additional include directories"

Ya tenemos un proyecto IAR en C que podemos cargar en la placa de desarrollo.

Red sensora inalámbrica

El kit de desarrollo viene con una aplicación de ejemplo, una red sensora inalámbrica (Sensor Monitor Demo). Vamos a utilizar esta aplicación para aprender a grabar programas con IAR y a capturar los datos transmitidos al PC. Esta aplicación tiene dos partes: un sensor y un punto de acceso. El sensor utiliza las baterías y se comunica inalámbricamente con el punto de acceso, que se encuentra conectado al pc a través del programador USB. Podemos ver los datos recogidos por el punto de acceso ejecutando en el PC la aplicación de visualización que acompaña.

 

  • Paso 1: Cargar el programa en los eZ430-RF2500T

Recordarás que en la sección de Introducción, instalamos la Sensor Monitor Demo en el PC. Navegaremos hasta la carpeta donde instalamos y localizaremos el fichero de espacio de trabajo de IAR, con la extensión eww

Si abrimos el fichero "Sensor_Demo_AP_as_Data_Hub.eww" automáticamente se cargará el IAR, donde tendremos acceso a los proyectos de esta demo. El código correspondiente a la placa sensora es el denominado "end device" y el del punto de acceso conectado al pc, el proyecto "access point".

Seleccionaremos como activo uno de los proyectos como activo de la siguiente manera:en la pestaña "overview" haremos click derecho sobre uno de los proyectos y seleccionaremos "Set as active".

A continuación conectaremos el programador USB (obviamente, con una de las placas conectada). Ya estamos en disposición de cargar el proyecto. Para ello, seleccionaremos en el menú "Proyect" la opción "debug". Esto compilará el código, lo cargará en la placa e iniciará una sesión de depuración.

Como no vamos a depurar, seleccionamos en el menú "debug" la opción "stop debugging". Retiramos el programador USB, intercambiamos la placa y repetimos el proceso para el otro proyecto.

Por ahora, ya podemos cerrar el IAR. Ya veremos cómo crear nuestros propios espacios de trabajo y proyectos en próximas lecciones.

  • Probar la aplicación
Ahora realizaremos el montaje de la demo. Conectamos la placa sensora al portapilas y la otra placa al pc usando el programador USB. Cuando los leds de ambas placas comiencen a parpadear significará que ya están conectadas. Si ahora ejecutamos el programa para PC que también habíamos instalado, veremos que nos muestra la temperatura que mide el sensor.
  • La comunicación

Es posible visualizar directamente la información que envía la placa por el puerto USB. Esto es útil puesto que además podemos enviar información a través del PC hacia la placa. El programador USB aparece en windows XP como un puerto COM virtual. Vamos a identificarlo para conocer dónde hemos de conectarnos.

Buscaremos el puerto COM en el Administrador de dispositivos. Para los usuarios de windows XP, hacer doble click sobre Mi PC, seleccionar Propiedades del Sistema, Pestaña Hardware, Botón Administrador de Dispositivos.  Si está conectada la placa USB, en la sección Puertos (COM & USB) tendremos un dispositivo denominado MSP430 Application UART (COM#). El # es el nº de COM virtual que necesitamos.

Ahora, si abrimos el hiperterminal, ya conocemos todos los parámetros para establecer comunicación con la placa.

Funcionalidades Básicas

Ahora pasaremos a la programación de la placa de desarrollo. Texas Instrument proporciona archivos de cabeceras con primitivas que identifican a los registros del microprocesador y macros para realizar las configuraciones más habituales. Es el archivo "msp430.h" que habremos de incluir al comienzo de nuestros códigos. Este archivo incluye a su vez la cabecera específica de la familia 2 "msp430x22x4.h". De esta forma podemos desentendernos de la dirección física de los mismos o de la posición concreta de los bits que necesitemos configurar.

Explicaremos a continuación cómo acceder a los elementos principales y propondremos la realización de programas sencillos que los controlen.

Modos de bajo consumo

Son la característica fundamental de todos los MSP430. Tenemos cinco modos de bajo consumo, ordenados en consumo decreciente. Es importante determinar qué modo de bajo consumo utilizar según nuestras necesidades:

  • LPM0: la CPU y el reloj MCLK están desactivados.

  • LPM1: la CPU, el MCLK y el DCO están deshabilitados.

  • LPM2: la CPU, los relojes SMCLK y MCLK, y el DCO están desactivados.

  • LPM3: la CPU, los relojes SMCLK y MCLK, el oscilador DCO y el generador DC están desactivados.

  • LPM4: la CPU y todos los relojes están deshabilitados. Sólo se mantiene la RAM.

Otra cuestión a valorar es el tiempo de respuesta. Pasar de un modo de bajo consumo a un estado activo lleva tiempo. Este tiempo es de unos 6 microsegundos en caso peor.

Utilizaremos la macro __bis_SR_register() para conmutar el modo de bajo consumo en el registro de estado. La etiqueta que identifica el modo de bajo consumo es LPMx_bits, donde x es un número de 0 a 4, según al modo al que corresponda.

Interrupciones

Uno de los elementos que más consumen de la placa (a parte de la radio) es la CPU en si misma. Es energéticamente muy ineficiente el tenerla constantemente activada sin que realice tarea alguna. Es por ello que lo habitual es mantener el sistema en un modo de bajo consumo y despertar al procesador sólo cuando un evento lo requiere.

Para conseguir esto se utilizan las interrupciones. Para activar globalmente las interrupciones hemos de configurar el registro de estado:

__bis_SR_register(GIE);

El sistema ejecutará la rutina de interrupción correspondiente a la fuente de interrupción. Para indicar que se trata de una rutina de tratamiento de interrupción, habremos de utilizar una directiva de precompilador y una cabecera muy concretas:

 

Fuente de la Interrupción

Primitiva y cabecera de Rutina de tratamiento de interrupción (RTI)

Puerto 1

#pragma vector=PORT1_VECTOR

__interrupt void Port_1 (void)

Timer A

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

UART A

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

Existen en total 12 vectores de interrupción. Para conocer su primitiva, consultar el archivo de cabecera específico del MSP430X22X4, el "msp430x22x4.h".

Entrada / Salida

La operación más básica que veremos es la configuración de los pines como entradas o salidas digitales, de forma individual. Tal y como ya comentamos, los pines se agrupan en puertos. La forma habitual de designarlos es mediante la nomenclatura P[puerto].[pin]. Y cada puerto tiene unos registros en los que cada bit permite configurar un aspecto de un pin. Por ejemplo, en el puerto 2 tenemos:

  • P2DIR: Cada bit indica si el pin del puerto 2 es de entrada (0) o salida (1).

  • P2OUT: Cada bit indica si el valor del pin es 1 o 0.

  • P2REN: Indica si está activa la resistencia interna del pin del puerto.

  • P2IE: Configura los pines del puerto como fuentes de interrupción (sólo válido para puerto 1 y 2)

  • P2IFG: Indica qué pin del puerto ha disparado una interrupción.

  • P2SEL-P2SEL2: permiten configurar los pines del puerto como interfaces con módulos específicos del microcontrolador (recuerda por ejemplo el conversor)

Y si quisiésemos configurar el pin 0 de este puerto como de salida (el pin P2.0) y el resto como entradas, tendríamos que escribir 0x01 en el registro P2DIR.


Recordarás que la placa tenía un LED rojo en P1.0, un LED verde en P1.1 y un pulsador en el pin P1.2. ¿ Sabrías como configurarlos adecuadamente para usarlos como salidas y entrada?

Temporizadores

 

La medición del tiempo es un aspecto vital de los microcontroladores. Bien sea para discernir intervalos en los que hay que realizar tareas, contar eventos o sincronizarse, todo se puede realizar mediante los contadores. Esencialmente un temporizador es un registro que cuenta señales de reloj, incluso en situaciones en las que la CPU está apagada (modos de bajo consumo).

Tenemos muchas opciones de configuración de los temporizadores: valor de la cuenta, selección del reloj, generación de interrupciones ... Una descripción exhaustiva se puede encontrar en manual de la familia 2, sección 12.

Repasemos los registros encargados de configurar las principales opciones del Timer A:

 

  • TACCR0 Registro que contiene el valor límite de la cuenta, si los modos MC_1 o MC_3 están activados.

  • TACTL Registro de control. Según qué bits activemos en este registro, el temporizador se comportará de una u otra manera. Disponemos de unas primitivas, que ya configuran TACTL en una manera determinada:

  • MC_x: Define uno de los 4 modos de funcionamiento: detenido, hasta TACCR0, continuo y ascendente/descendente hasta TACCR0

  • TASSEL_x: Fuente del reloj: 0 TACLK, 1 ACLK, 3 SMCLK y 4 INCLK

  • ID_x: divisor de frecuencia del reloj de entrada: 0 sin dividir, 1 /2, 2 /4, 3 /8

  • TAIE: habilita la interrupción.

 

Si el reloj ACLK funciona a unos 12kHz ¿Cómo provocarías una interrupción por segundo con el Temporizador A?

Comunicación UART

 

El ejemplo de red sensora inalámbrica mediante el kit eZ430-RF2500 permitía ver a través del hiperterminal los datos que medía el sensor remoto. En realidad es posible realizar una comunicación bidireccional entre la placa y el PC a través del mismo hiperterminal. El USCI A está dedicado a la comunicación UART con la placa USB y por tanto al PC. Su funcionamiento detallado está descrito en la sección 18.3 del manual de la familia 2. De modo resumido, estos son los pasos que hemos de seguir para configurarlo:

  • Configurar los pines P3.4 y P3.5 como Tx/Rx de la USCI_A

  • Configurar la USCI_A0 ( seleccionar reloj, tasa binaria de 9600 baudios y la modulación )

  • Iniciar la USCI_A0 y habilitar las interrupciones de dato recibido.

Por supuesto, queda a nuestro criterio qué hacer con el dato recibido en UCA0RXBUF cuando se dispara la interrupción USCI0RX_ISR.

 

¿Serías capaz de implementar un código que hiciera eco de lo que escribimos en la pantalla?

Obra publicada con Licencia Creative Commons Reconocimiento 3.0