Gestión de entrada/salida en MSP430

Detalle MSP430

Este es el primero de una serie de artículos dedicados al microcontrolador MSP430 de Texas Instrument. Este microcontrolador de 16 bits está especialmente pensado para aplicaciones embebidas en las que el costo y el consumo son elementos fundamentales. En realidad, se trata de toda una familia de microcontroladres en las que, dependiendo del modelo, encontraremos diferentes características y periféricos. En esta serie de artículos me voy a basar en el MSP430F5529 y concretamente en la placa de desarrollo que ofrece TI: MSP430F5529 LaunchPad.

LaunchPad MSP430

Puertos de entrada/salida del MSP430

Dependiendo del modelo concreto dispondremos de más o menos puertos de entrada/salida. En el MSP430F5529 disponemos de cuatro bloques de puertos denominados PA, PB, PC y PD. Cada uno de estos bloques dispone de dos puertos de ocho bits cada uno. Por ejemplo, PA tiene los puertos P1 y P2 con ocho pines cada uno.
Algunos de estos puertos, además de funcionar como entrada/salida de propósito general, pueden tener asociadas funciones especiales.

msp430 puertos E/S

Los puertos están mapeados en memoria, lo que quiere decir que para gestionarlos hay que acceder a direcciones de memoria específicas para cada uno. Estas direcciones de memoria, por comodidad, tienen asignado un nombre que podremos usar cuando programamos el microcontrolador. Aunque no los vamos a analizar todos en este primer artículo, los puertos son gestionados a través de los siguientes registros (que en realidad se corresponden con un byte en el mapa de memoria):

PxIN
A través de este registro podemos leer el estado de las ocho entradas del puerto x.

PxOUT
Si el puerto está configurado como salida, el puerto x tomará el valor que escribamos en el registro.

PxDIR
Configura el puerto como entrada (valor 0) o como salida (valor 1).

PxSEL
Selecciona si el puerto funciona como E/S de propósito general o como puerto de propósito específico (según el puerto, podrá tener una función específica concreta. Consultar datasheet).

PxREN
Si el puerto está configurado como entrada, permite activar o desactivar las resistencias. Si se activan, se puede seleccionar el tipo (pull-up o pull-down) en el registro PxOUT.

PxIES
Los puertos 1 y 2 permiten el uso de interrupciones. Este registro permite seleccionar si las interrupciones son disparadas en el flanco de subida o de bajada.

PxIFG
Se activa cuando ocurre una interrupción en el puerto x.

PxIE
Permite habilitar las interrupciones en el puerto x.

En este primer artículo sólo vamos a utilizar algunos, y en los próximos, cuando hablemos de interrupciones y timers, trataremos los demás.

 

Programación de puertos en MSP430

La gestión de los puertos se realiza activando y desactivando bits en las direcciones de memoria donde están mapeados. Vamos a ver cómo funciona a partir de un sencillo ejemplo. Para ello, vamos a usar los pulsadores y los LEDs que hay en la placa LaunchPad.

pulsadores y leds en MSP430 Launchpad

En el esquemático vemos que el pulsador S1 está conectado al puerto P2.1 (puerto 2, bit 1) y el pulsador S2 al puerto P1.1. En el caso de los LEDs, el LED1 se conecta al puerto P1.0 y el LED2 al P4.7. A efectos prácticos, si por ejemplo quisiéramos activar el LED1, tendríamos que poner a 1 el bit 0 del puerto P1 así:

P1OUT |= BIT0;

La etiqueta P1OUT es una definición en C equivalente a la dirección de memoria del puerto 1. Por otra parte, la etiqueta BIT0 equivale al valor 00000001b, la etiqueta BIT1 equivale a 00000010b, y así sucesivamente. Todas estas definiciones se puede ver en el archivo de cabeceras msp430.h.

Así pues, al hacer una operación OR con BIT0, lo que hacemos es activar el bit 0 con independencia de cuál fuera su estado anterior y dejar intactos el resto de bits del puerto.

Si lo que queremos es apagar el LED, hay que poner a 0 el bit 0 de P1, lo que puede hacerse así:

P1OUT &= ~BIT0;

Esta línea hace lo contrario que la anterior. Pone a 0 el bit del puerto P1.0 dejando los demás bits del puerto intactos.

Así pues, veamos los pasos necesarios para encender el LED que está conectado a P1.0:

  • Hay que configurar el puerto para salida poniendo a 1 el bit 0 de P1DIR (para configurar un puerto como entrada ponemos el valor 0, que es el valor por defecto):
    P1DIR |= BIT0;
  • Usar
    P1OUT |= BIT0

    para encender el LED y

    P1OUT &= ~BIT0

    para apagarlo.

Si quisiéramos leer una entrada, por ejemplo, el estado del pulsador S2 que está en el puerto P1.1, procederíamos así:

  • Configurar el puerto P1.1 como entrada poniendo a 0 el bit 1 de P1DIR con
    P1DIR &= ~BIT1

    Aunque realmente no es necesario porque por defecto ya está a cero.

  • Activar la resistencia interna del puerto P1.1 activando el bit 1 de P1REN (en el esquema vemos que, al contrario de lo que ocurre con el LED, no hay ninguna resistencia conectada al botón en el circuito):
    P1REN |= BIT1;
  • Además configuramos esta resistencia como pull-up activando el bit 1 de P1OUT (pondríamos a cero este bit si queremos una resistencia pull-down):
     P1OUT |= BIT1;
  • Podemos comprobar si se ha pulsado el botón chequeando el bit 1 de P1IN. Si está a 1 el botón no está pulsado y si está a 0, sí.

 

Código de ejemplo

El siguiente código de ejemplo utiliza el pulsador S2 y el LED1. Al pulsar el botón se encenderá el LED. Para desarrollar aplicaciones basadas en MSP430 Texas Instruments pone a nuestra disposición el entorno de desarrollo Code Composer Studio.

 

#include <msp430.h>
int main(void)
{
    WDTCTL = WDTPW + WDTHOLD; // Detiene el watchdog
    P1DIR |= BIT0;            // P1.0 (LED1): salida digital
    P1REN |= BIT1;	      // Resistencia activa en P1.1 (S2)
    P1OUT |= BIT1;	      // Configurada como pull-up

    while (1) {
        if (P1IN & BIT1)      // Si P1.1 está a 1 (S2 no pulsado)
    	    P1OUT &= ~BIT0;   // bit P1.0 a 0 (apaga LED1)
        else                  // si no (S2 pulsado),
	    P1OUT |= BIT0;    // bit P1.0 a 1 (enciende LED1)
    }
}

 

El código es bastante autoexplicativo, y muestra los fundamentos de la entrada/salida en MSP430. La primera línea detiene el watchdog, que es un contador externo que cuenta hacia atrás. Si llega a cero, resetea el microcontrolador. La idea es que un programa debe ir actualizando el watchdog cada poco tiempo, de forma que nunca llegue a cero. Si esto ocurre querrá decir que el programa no ha podido actualizarlo por alguna causa no controlada (por ejemplo, un cuelgue del programa), y por lo tanto se reinicia todo el sistema para ponerlo de nuevo a funcionar. En este ejemplo, mejor desactivarlo.

 

CompartirShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

Sé el primero en comentar en "Gestión de entrada/salida en MSP430"

Deja un comentario.

Tu dirección de correo no será publicada.


*