Está en la página 1de 15

Taller de Microcontroladores: MSP430 - IEEE-PUC

1 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

Taller de Microcontroladores: MSP430


De IEEE-PUC
Esta gua ha sido desarrollada por los integrantes del Captulo Estudiantil IEEE-ICARO. En este documento se
encuentra una gran cantidad de definiciones de distintos conceptos tanto relativos al mundo de los
microprocesadores, como al mundo digital y la lgica binaria. Es necesario aclarar que los contenidos tienen un
enfoque prctico, por lo que algunos tpicos fueron resumidos al punto de perder seriedad en la informacin
(compresin con prdida). Se recomienda al lector que use esta gua slo como referencia. Ante cualquier duda
o inters por alguno de los temas tratados, dirigirse a alguno de los integrantes de ICARO, quienes podrn
ayudar a profundizar o conseguir ms informacin respecto al tema.
El taller se realiz el lunes 18 de noviembre de 2013 en la sala del Departamento de Ingeniera Elctrica de la
UC.

Contenido
1 Introduccin a los microcontroladores
2 MSP430 y CCS
2.1 Por qu MSP430?
2.2 Qu necesitamos para empezar a programar?
2.3 Elementos bsicos
2.4 Archivos Importantes
3 Manipulando los registros del microcontrolador
3.1 Lgica Binaria
3.1.1 NOT (~)
3.1.2 AND (&)
3.1.3 OR (|)
3.1.4 OR exclusivo (^)
3.1.5 Suma (+)
3.2 Qu es un registro?
3.3 Enmascaramiento de Registros
3.3.1 Elevacin de bits
3.3.2 Hundimiento de bits
3.4 Ejemplo: Manipulando el registro Watchdog Timer
4 GPIO (General-purpose input/output)
4.1 Registros importantes
4.1.1 PxSEL, PxSEL2
4.1.2 PxDIR
4.1.3 PxOUT
4.1.4 PxIN
4.1.5 PxREN
4.2 Ejemplo 1: Encendido de LEDs
4.2.1 Ejemplo 1.1
4.2.2 Ejemplo 1.2
4.2.3 Ejemplo 1.3

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

2 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

4.2.4 Ejemplo 1.4


4.2.5 Ejemplo 1.5
5 ADC
5.1 Ejemplo 1: Uso bsico del ADC
6 Comunicacin UART
6.1 Ejemplo 1: Enviando un caracter
6.2 Ejemplo 2: Enviando strings (Arreglo de caracteres)
7 Ejemplo final: Juego Snake

Introduccin a los microcontroladores


Un

Esquema simplificado de un microcontrolador.

Microcontrolador se puede describir en trminos muy simplificados como un computador pequeo. Es un chip
que se puede programar para una aplicacin especfica, es capaz de ejecutar un programa de manera secuencial
y de responder a estmulos externos. En general, todos los microcontroladores son capaces de:
Operar a una frecuencia mayor a unos cuntos MHz.
Guardar datos en sus registros y realizar operaciones matemticas y lgicas.
Configurar entradas o salidas digitales.
Generar interrupciones relacionadas a algn evento para responder adecuadamente ejecutando un trozo
de cdigo especfico.
Cada tipo de microcontrolador se caracteriza de los dems segn su frecuencia de operacin y los recursos o
mdulos que tiene disponibles. En este taller revisaremos los siguientes mdulos:
GPIO (General-purpose input/output).
Timers (Contadores de ciclos de reloj).
Conversor Anlogo Digital (ADC).

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

3 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

Mdulos de comunicacin con otros dispositivos.


Afortunadamente, hoy en da es muy comn que existan compiladores de cdigo C que traducen el cdigo
escrito por el usuario a lenguaje de mquina, por lo que el trabajo de programar el dispositivo se hace un poco
ms llevadero, ya que es posible definir variables, funciones y ocupar las estructuras tpicas como los if() o el
while().

MSP430 y CCS
Por qu MSP430?
Si bien es cierto en la actualidad existe una gran cantidad de microcontroladores en el mercado, como los AVR
de ATMEL (Arduino los ocupa), los PIC de microchip o el 8051 de Intel, en ICARO hemos decidido optar por
la tecnologa de Texas Intrument (MSP430) ya que cuentan con un alto desempeo, lo que los pone a la altura
de un PIC, son sencillos de programar (se basa en el lenguaje C), no necesitan un perifrico programador
externo y adems es muy barato: 9.9 dolares incluyendo costos de envio! . Ms informacin.
(http://www.ti.com/ww/en/launchpad/launchpads-msp430.html#tabs)

Qu necesitamos para empezar a programar?


Si utilizas Windows, se recomienda altamenten instalar el software Code Composer Studio (CCS) Descargar (>
1Gb, requiere registro) (http://processors.wiki.ti.com/index.php/Download_CCS) . Si la descarga presenta
problemas, el software tambin puede ser solicitado a los integrantes de Icaro (acrcate a la oficina de la
IEEE-PUC). Por ambos caminos obtendrs una versin de prueba del compilador que permite trabajar con
cdigos de hasta 16Kb, pero es ms que suficiente para nuestras aplicaciones. Este software cuenta tanto con el
compilador como con el programador, por lo que solo necesitamos un cable USB y nuestro launchpad para
empezar a programar.

Elementos bsicos
Para la realizacin de este taller se necesita:
Launchpad MSP430 con el chip M430G2553
Cable USB
Software Code Composer Studio (CCS). Descargar (> 1Gb,
requiere registro) (http://processors.wiki.ti.com/index.php
/Download_CCS)
Placa de testeo (Entregada por ICARO).

Archivos Importantes

Launchpad

Descargar Userguide. Gua de usuario muy detallada que incluye todo lo que se puede hacer con el
MSP430 y qu registros modificar para lograr lo que se quiere.
Descargar msp430g2553.h. Archivo de definiciones en lenguaje C para el chip msp430g2553. Incluye
nombres para todos los registros y tipos de comportamiento, para hacer ms llevadera la programacin.

Manipulando los registros del microcontrolador


Antes de empezar es necesario repasar algunos conceptos sobre lgica binaria, esto porque la base de los

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

4 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

microcontroladores es totalmente digital, donde las cantidades y direcciones de memoria son representadas con
nmeros binarios.

Lgica Binaria
En la lgica binaria existen solo dos valores, 1 y 0. Estos valores son representados por un voltaje, generalmente
Vcc para el 1 y tierra para el 0. A un nmero binario de una cifra se le llama bit, mientras que a un nmero
binario de 8 bits (8 cifras) se le llama byte.
Decimal

Binario

0000 0001 0010 0011 0100 0101 0110 0111 1000

A si mismo es posible operar con las cifras binarias:


NOT (~)
A

~A

AND (&)
A B A&B
0 0

0 1

1 0

1 1

OR (|)
A B A|B
0 0

0 1

1 0

1 1

OR exclusivo (^)

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

5 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

A B A^B
0 0

0 1

1 0

1 1

Suma (+)
A

A+B

Carry

Notar que en la suma, el resultado es equivalente a hacer (A | B), y el carry es equivalente a hacer (A & B).
Todas estas operaciones se pueden hacer sobre nmeros de ms bits, aplicando la operacin para cada bit por
separado.
A

A&B

Qu es un registro?
Podemos pensar, y sin entrar en detalles de la electrnica de por medio, en un registro como la una unidad mas
bsica de memoria del microcontrolador. Por lo general un registro es nmero de 8 bits (1 byte) que guarda
informacin de dos tipos:
1. Registros que guardan informacin variable con la que podemos operar durante la ejecucin de nuestro
programa.
2. Registros que guardan informacin sobre la configuracin del microcontrolador y que definen cmo se
comporta y qu debe hacer en determinadas circunstancias.
Revisemos el siguiente cdigo C:
int8 A;
A = 0b10110010;
A = 0xB2;
A = 178;

//
//
//
//

Definicin
Asignacin
Asignacin
Asignacin

del registro "A" como un entero de 8 bits


en formato binario
en formato hexadecimal
en formato decimal

En el cdigo se muestran 3 de las formas de definir el contenido de un registro. Un estndar es hacerlo de la


forma hexadecimal ya que permite definir completamente 1 byte con solo dos dgitos. Como todos los registros
son 1 byte, resulta cmodo utilizar esta notacin.

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

6 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

As mismo, podemos operar con los registros de manera muy simple:


int8 A = 0xAF;
int8 B = 0x08;
int8 C = 0x00;

// Definicin del registros

C
C
C
C
C
C
C

//
//
//
//
//
//
//

= ~A;
= A &
= A |
= A +
= A ^
&= B;
|= A;

B;
B;
B;
B;

C = NOT A
C = A AND B
C = A OR B
C = A SUM B
C = A XOR B
Equivalente a C = C & B;
Equivalente a C = C | A;

Es importante destacar que si la suma de dos nmeros de 8 bits resulta en un nmero mayor a 8 bits, y el registro
de destino tiene 8 bits, el resultado ser truncado, dejando como resultado los 8 bits menos significativos.

Enmascaramiento de Registros
Siguiendo con la misma idea, las dos ltimas lneas del cdigo anterior representan un "enmascaramiento" del
registro C. sto porque se le est aplicando una operacin sobre s mismo. Se pueden distinguir dos tipos de
enmascaramiento:
Elevacin de bits.
Hundimiento de bits.
Elevacin de bits
Si se tiene dos registros A y B y se desea elevar los bits de B en A, basta con realizar la operacin OR entre
ellos. A = A | B.
Esto significa tomar los bits que son igual a 1 en el registro B y hacerlos igual a 1 en el registro A.
A

1 0

1 1

0 0

1 0

1 1

0 1

1 0

1 1

A=A|B

1 1

1 1

1 0

1 1

Hundimiento de bits
Si se tiene dos registros A y B y se desea hundir los bits de B en A, es necesario negar el registro B y luego
aplicar un AND con el registro A, es decir, A = A & ~B.
Esto significa tomar los bits que son igual a 1 en el registro B y hacerlos igual a 0 en el registro A.
A

1 0 1 1 0 0 1 0

~B

0 0 1 0 0 1 0 0

A = A & ~B

0 0 1 0 0 0 0 0

Finalmente es til ver como se realiza el enmascaramiento de registros en lenguaje C:

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

7 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

int8 A = 0b00010010;
int8 B = 0b00010001;

// Definicin de registros

A |= B;
A &= ~B;

// Elevamos los bits de B en A. Resultado = 0b00010011


// Hundimos los bits de B en A. Resultado = 0b00000010

Ejemplo: Manipulando el registro Watchdog Timer


El MSP430 y muchos otros microcontroladores incorporan un contador de seguridad llamado Watchdog timer.
Su principal funcin es la de evitar que el chip se bloquee por haber entrado en un loop infinito por un error de
programacin. Este contador est permanentemente contando y si supera cierto umbral, hace que todo el
microprocesador se reinicie, ejecutando el programa desde el inicio.
Por ahora, deshabilitaremos este contador para evitar que nuestros programas se reinicien.
Detengmonos en el siguiente cdigo:
#include <msp430.h>
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
while(1){ }
}

// Incluimos el archivo de definiciones para el MSP430


// Paramos el watchdog
// Ciclo infinito

El cdigo muestra la estructura bsica de los programas que escribiremos. La primera lnea incluye el archivo de
definiciones que nos ayudar en la programacin. Luego se define el mtodo main(), que representa la puerta de
entrada a nuestro programa. El mtodo main() se ejecuta secuencialmente lnea por lnea hasta que termina. En
este tipo de programas es tpico ver la aparicin de un while infinito, que se ejecuta cclicamente mientras el
microcontrolador est encendido.
Antes del while infinito suelen encontrarse definiciones para los distintos registros del microcontrolador, y que
definen su comportamiento.
En el cdigo slo se ve una lnea que deshabilita el whatchdog timer modificando el registro WDTCTL. Notar que
para definir el registro se utilizan otros dos registros que no hemos definido anteriormente (WDTPW y WDTHOLD).
Esto es posible ya que todos estos nombres estn previamente definidos en el archivo msp430.h.
Finalmente, es importante mencionar que los nombres de los registros no son al azar y coinciden con los
nombres que se manejan en el userguide. Para ver las posibilidades de configuracin del registro WDTCTL, revisar
la pgina 355 del userguide.

GPIO (General-purpose input/output)


La via de comunicacin ms bsica entre un microcontrolador y el mundo exterior son las entradas y salidas
digitales. La utilizacin de lgica digital permite almacenar informacin de forma elctrica sin ambigedad en su
lectura, adems de permitir una manipulacin ms simple que en el caso analgico.
Por salida o entrada digital se entiende que cada pin acepta solamente dos estados de voltaje: High = 1 (Vcc) y
Low = 0 (Tierra).

Registros importantes

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

8 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

Para manipular cada pin GPIO se deben configurar los siguientes registros.
PxSEL, PxSEL2
La combinacin entre PxSEL y PxSEL2 determinar la funcin de cada pin, permitiendo optar entre I/O,
funcin del perifrico primario, etc. Prcticamente en todas las aplicaciones utilizaremos I/O.
Los registros PxSEL y PxSEL2 son del tipo escritura y por defecto el valor de ambos es 0.
PxDIR
Corresponde a un registro de escritura en el cual se determina si cada pin seleccionado anteriormente como I/O
es de entrada (I) o salida (O). Su valor por defecto es 0.
Bit = 0: Pin de entrada.
Bit = 1: Pin de salida.
PxOUT
Corresponde al valor que escribiremos en los pines seleccionados como Output.
Bit = 0: Output low.
Bit = 1: Output high.
PxIN
Corresponde a un registro solo de lectura el cual almacena el valor de los pines de entrada.
Bit = 0: Input low.
Bit = 1: Input high.
PxREN
Registro solo de escritura que permite habilitar las resistencias de Pullup/Pulldown en los pines que fueron
puestos como entrada.
Bit = 0: Resistencias de Pullup/Pulldown desabilitadas.
Bit = 1: Resistencias de Pullup/Pulldown habilitadas.
Para determinar si la resistencia puesta en la entrada corresponde a Pullup o Pulldown debemos utilizar el
registro PxOUT.
Bit = 0: Resistencia de Pulldown.
Bit = 1: Resistencia de Pullup.

Ejemplo 1: Encendido de LEDs


A continuacin presentaremos un cdigo que se encarga de prender y apagar un LED y le iremos haciendo
modificaciones para explorar distintos aspectos de la programacin de microcontroladores y GPIO.

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

9 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

Ejemplo 1.1
En este ejemplo buscamos implementar un cdigo que haga parpadear un LED. Esto se logra cambiando el valor
de una salida de 1 a 0 y viceversa, a una frecuencia que sea apreciable. (Recuerda que si el cambio es muy
rpido no podrs verlo).
/*
Cdigo que prende un LED espera un tiempo, luego apaga
el LED.
En este caso usaremos el LED de la tarjeta que se
encuentra en el pin 0 del puerto 1 (P1.0)
*/
#include <msp430.h>
#include <inttypes.h>

//inclusiones.

void main(){
WDTCTL= WDTPW+WDTHOLD;

//funcion principal
//Apagamos el watchdog

P1SEL= 0x00;
P1DIR|= BIT0;

//Salida el bit 0 del puerto 1

P1OUT|=BIT0;

//LED parte apagado

while(1){
//Loop infinito
P1OUT|=BIT0;
//prende el LED
__delay_cycles(100000); //espera
P1OUT&=~BIT0;
//apaga el LED
__delay_cycles(100000); //espera
}
}

Observacin: la funcin __delay_cycles( ); se encarga de realizar ciclos muertos de procesamiento, en el fondo


espera sin hacer nada una cantidad de ciclos que nosotros le damos como argumento.
Ejemplo 1.2
Este ejemplo es anlogo al anterior. Se utilizaran ambos LEDs disponibles en la placa.
/*
Cdigo que hace parpadear ambos LEDs disponibles en la placa
de forma sincronizada.
Los LEDs de la placa estn en los pines 0 y 6 del puerto 1
*/
#include <msp430.h>
#include <inttypes.h>

//Inlcusiones

void main(){

//Funcin principal

WDTCTL= WDTPW+WDTHOLD;
P1SEL= 0x00;
P1DIR|= (BIT0+BIT6);
P1OUT|=BIT0;
P1OUT&=~BIT6;

//Pines 0 y 6 como salida


//Uno parte apagado y el otro prendido

while(1){
__delay_cycles(100000);
P1OUT^=BIT6;
P1OUT^=BIT0;
}

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

10 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

En esta oportunidad hemos utilizado la funcin XOR la cual se encarga de levantar los bit que estaba en 0 y
bajar los que estaban en 1. De este modo el parpadeo solo necesita una sola linea.
Ejemplo 1.3
Ahora agregaremos la posibilidad de cambiar la frecuencia de parpadeo de los LED por medio de un botn
como entrada. La idea es que cada vez que se presione el botn el LED parpadee ms rpido, luego vuelve a la
frecuencia original.
/*
Los LED se encuentran en los pines 0 y 6 del puerto 1
El botn se encuentra en el pin 3 del puerto 1
*/
#include <msp430.h>
#include <inttypes.h>
int i=0;
int T=30000;

//Inculsiones

//Declaracin de variables.

void main(){
WDTCTL= WDTPW+WDTHOLD;
P1SEL= 0x00;
P1DIR|= (BIT0+BIT6);

//Salidas

P1DIR&=~BIT3;
P1REN|=BIT3;

//Entradas
//Pull-down para la entrada

P1OUT|=BIT0;
P1OUT&=~BIT6;
while(1){
for(i=0;i<T;i++);

//primer for

if((P1IN&BIT3)==0){
T=T-1500;}

// primer if

P1OUT^=BIT6;
P1OUT^=BIT0;

//toggle para las salidas

if(T<=1500){T=30000;}

//segundo if

}
}

Al principio se realizan las mismas declaraciones de siempre. Al momento de definir las salidas hemos agregado
las lineas correspondiente a las entradas. Dentro del while, usamos el primer for para esperar T ciclos vacos.
Luego entramos al primer if, en ste preguntamos si la entrada es igual a 0. De ser as, entonces el tiempo de
espera T se disminuye. Luego hacemos parpadear los LEDs. El segundo if se preocupa de revisar las
condiciones de borde para que T siempre sea un nmero valido.
Ejemplo 1.4
Ahora implementaremos el mismo cdigo anterior con la diferencia principal de que utilizaremos interrupciones.
En general stas son tiles ya que nos permiten ahorrarnos lineas de cdigo y implementar soluciones ms
eficientes. El programa se efectuara de forma normal hasta que ocurra un evento especifico (por ejemplo que se

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

11 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

presione un botn). En ese caso el programa interrumpe su ejecucin y se salta hasta la rutina de interrupcin.
Una vez terminada esta vuelve a ejecutarse de forma normal.

#include <msp430.h>
#include <inttypes.h>
int i=0;
int T=30000;
void main(){
WDTCTL= WDTPW+WDTHOLD;
P1SEL= 0x00;
P1DIR|= (BIT0+BIT6);
P1DIR&=~BIT3;
P1REN|=BIT3;
P1IE|=BIT3;
P1IES|=BIT3;
P1IFG&=~BIT3;

//Habilitamos las interrupciones, mas informacin en el userguide.

P1OUT|=BIT0;
P1OUT&=~BIT6;
_BIS_SR(GIE);
while(1){
for(i=0;i<T;i++);

//Habilitamos las interrupciones generales. IMPORTANTE!!


//El mismo cdigo anterior

P1OUT^=BIT6;
P1OUT^=BIT0;
if(T<=1500){T=30000;}
}
}
//Rutina de interrupcin.
#pragma vector= PORT1_VECTOR
__interrupt void Led_ISR (void){
P1IFG&=~BIT3;
T=T-2000;
}

//Para salir de una interrupcin SIEMPRE es necesario limpiar la bandera.

Como podemos ver cuando se presione el botn el programa se interrumpir y se salta hasta la rutina de
interrupcin. En ella se acorta el periodo de espera y luego se regresa al cdigo original. Como podemos ver con
esta solucin no es necesario revisar en cada iteracin si es que esta apretado o no el botn, el periodo T se
acortara solo cuando sea necesario.
Ejemplo 1.5
Finalmente en el siguiente cdigo se muestra como realizar definiciones a conveniencia tanto de variables como
de funciones. El programa es igual al ejemplo 1.4 en cuanto a funcionalidad se refiere.
#include <msp430.h>
#include <inttypes.h>
#define led1 BIT0
#define led2 BIT6
void led_toggle(uint8_t led);
void led_init();

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

12 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

int i=0;
int T=30000;
void main(){
WDTCTL= WDTPW+WDTHOLD;
led_init();
_BIS_SR(GIE);

//PAGINA 49 USER GUIDE.

while(1){
for(i=0; i<T;i++);
led_toggle(led1+led2);
if(T<=1500){T=30000;}
}
}

void led_toggle(uint8_t led){


P1OUT^=led;
}
void led_init(){
P1SEL= 0x00;
P1DIR|= (BIT0+BIT6);
P1DIR&=~ BIT3;
P1REN|= BIT3;
P1IE|=BIT3;
P1IES|=BIT3;
P1IFG&=~BIT3;
P1OUT|=BIT0;
P1OUT&=~BIT6;
}

#pragma vector= PORT1_VECTOR


__interrupt void Led_ISR (void){
P1IFG&=~BIT3;
T=T-2000;
}

ADC
Ejemplo 1: Uso bsico del ADC
#include <msp430.h>
void main(void) {
WDTCTL = WDTPW + WDTHOLD;

// Se detiene el watchdog

// ADC
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON;
ADC10CTL1 = INCH_5 + SHS_0 + ADC10DIV_0 + ADC10SSEL_0 + CONSEQ_0;
ADC10AE0 = BIT5;
ADC10CTL0 |= ENC;
// LEDs
P1SEL = 0;
P1DIR |= BIT0 + BIT6;

//
//
//
//

Vcc reference, 16 clocks, on


input channel 5, trigger on ADC10SC bit,
Entrada del ADC en P1.5
Se enciende

// set P1.0 and P1.6 as output (1) pins

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

13 de 15

P1OUT &= ~BIT0;


P1OUT &= ~BIT6;

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

// Apaga led rojo


// Apaga led verde

while(1){
__delay_cycles(100000);
ADC10CTL0 |= ADC10SC;
while( ADC10CTL1 & ADC10BUSY );

// Esperamos un poco
// Empieza conversin del ADC
// Espero a que la conversin est lista

/*
* ADC10MEM guarda el valor de la conversin digital.
* Es un registro de 10 bits, por lo que su valor mximo es 2^10 = 1024
* */
if( ADC10MEM > 512 ){
P1OUT |= BIT0;
P1OUT |= BIT6;
} else {
P1OUT &=~ BIT0;
P1OUT &=~ BIT6;
}

// Si el valor digital convertido supera la mitad de la escala, encender los leds.

}
}

Comunicacin UART
Ejemplo 1: Enviando un caracter
#include <msp430.h>
void main(void) {
WDTCTL = WDTPW + WDTHOLD;

// Se detiene el watchdog

// Configuro el clock a 16MHz


BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
BCSCTL2 &=~ SELS;
// Configuracin UART
P1SEL
|= (BIT1 + BIT2);
P1SEL2
|= (BIT1 + BIT2);
UCA0CTL1
|= UCSSEL_2;
UCA0CTL1
|= UCSWRST;

//
//
//
//

P1.1 = RXD, P1.2=TXD (Configuran Los Puertos)


P1.1 = RXD, P1.2=TXD
SMCLK
Resetea el modulo

/*
* Los siguientes registros configuran la velocidad de transmisin: 9600 baud con 16.000.000 HZ
* Las configuraciones posibles estn listadas en el userguide, pgina 435.
*
* */
UCA0BR0 = 1666;
UCA0BR1 = 1666>>8;
UCA0MCTL = 6<<1;
UCA0CTL1 &= ~UCSWRST;
// **Initialize USCI state machine**
while (1){
__delay_cycles(100000);
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF = 'N';
}

// USCI_A0 TX buffer ready?


// Envo caracter 'N' permanentemente

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

14 de 15

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

Ejemplo 2: Enviando strings (Arreglo de caracteres)


#include <msp430.h>
char palabra[8] = "HOLA\n";

// EL caracter "\n" indica un salto de lnea en Windows, til para mejorar la lectur

void UART_TXchar2();

// Declaro la funcin para poder usarla, la definicin se encuentra al final del cd

void main(void) {
WDTCTL = WDTPW + WDTHOLD;

// Se detiene el watchdog

// Configuro el clock a 16MHz


BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
BCSCTL2 &=~ SELS;
// Configuracin UART
P1SEL
|= (BIT1 + BIT2);
P1SEL2
|= (BIT1 + BIT2);
UCA0CTL1
|= UCSSEL_2;
UCA0CTL1
|= UCSWRST;

//
//
//
//

// Configuracin del Baudrate


UCA0BR0 = 1666;
UCA0BR1 = 1666>>8;
UCA0MCTL = 6<<1;
UCA0CTL1 &= ~UCSWRST;

// **Initialize USCI state machine**

while (1){
__delay_cycles(100000);
UART_TXchar2(palabra);
}

P1.1 = RXD, P1.2=TXD (Configuran Los Puertos)


P1.1 = RXD, P1.2=TXD
SMCLK
Resetea el modulo

// Envo "HOLA\n" permanentemente

}
// Para enviar strings (arreglo de char), es necesario enviar cada char individualmente
void UART_TXchar2( unsigned char *c )
{
int i = 0;
for(i;i<20; i++){
if(c[i] == 0){
break;
}else{
while (!(IFG2&UCA0TXIFG));
// USCI_A0 TX buffer ready?
UCA0TXBUF = c[i];
// Envo el caracter "i" del arreglo de chars
}
}
}

Ejemplo final: Juego Snake


Como experiencia final se prepar un juego simple basado en en clsico "Snake" para unir las funcionalidades
GPIO, ADC y comunicacin UART.
El cdigo que se provee instruye al microcontrolador para recibir interrupciones desde 4 pines (P1.3, P1.4, P1.6
y P1.7) para poder manejar a la culebra hacia arriba, abajo, izquierda o derecha. Al mismo tiempo est leyendo
permanentemente una entrada analgica por el puerto P1.5 que maneja la velocidad del juego. Finalmente, el
microcontrolador est permanentemente enviando seales mediante UART al PC en un formato entendible por
el juego.

06/07/2015 03:27 p. m.

Taller de Microcontroladores: MSP430 - IEEE-PUC

15 de 15

Pin Funcionalidad

http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontrol...

Comentario

P1.3 UP

Entrada digital

P1.4 DOWN

Entrada digital

P1.5 Velocidad

Entrada analgica (por ejemplo, un potencimetro)

P1.6 LEFT

Entrada digital. Es necesario desconectar el jumper del led para poder ocuparlo como
entrada digital.

P1.7 RIGHT

Entrada digital

Las palabras enviadas por el microcontrolador tienen el siguiente formato:


"LEFT-VEL34A"

La primera parte de la palabra contiene la direccin a la que se quiere dirigir la culebra.


La segunda parte contiene un nmero en formato hexadecimal que indica la velocidad del juego.
El programa analiza este string y realiza los cambios necesarios segn la instruccin recibida.
El cdigo fuente del juego se puede descargar desde [Aqu. (http://codesmesh.com/snake-game-in-c/) ] El
software fue modificado para poder recibir las instrucciones del microcontrolador.
Obtenido de http://web.ing.puc.cl/~ieee/wiki/index.php?title=Taller_de_Microcontroladores:_MSP430&
oldid=103
Esta pgina fue modificada por ltima vez el 1 ene 2014, a las 23:48.
Esta pgina ha sido visitada 10 023 veces.

06/07/2015 03:27 p. m.

También podría gustarte