Вы находитесь на странице: 1из 15

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
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

Esquema simplificado de un microcontrolador.

Un 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).
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/launchpadsmsp430.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)
Launchpad

(http://processors.wiki.ti.com/index.php/Download_CCS)
Placa de testeo (Entregada por ICARO).

Archivos Importantes

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 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

NOT (~)
A

~A

AND (&)
A B A&B
0 0

1 0

0 1
1 1

0000 0001 0010 0011 0100 0101 0110 0111 1000

A si mismo es posible operar con las cifras binarias:

0
1

OR (|)
A B A|B
0 0

1 0

0 1
1 1

1
1

OR exclusivo (^)
A B A^B
0 0

1 0

0 1

1 1

Suma (+)
A

A+B

Carry

0
1
1

0
0
1

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.
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

A=A|B

1 1 1 1 1 0 1 1

1 1 0 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

A = A & ~B

0 0 1 0 0 0 0 0

~B

0 0 1 0 0 1 0 0

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


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

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.
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>
void main(){
WDTCTL= WDTPW+WDTHOLD;

//inclusiones.
//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;

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 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;}

#pragma vector= PORT1_VECTOR


__interrupt void Led_ISR (void){

//Rutina de interrupcin.

T=T-2000;

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();
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;
P1OUT &= ~BIT0;
P1OUT &= ~BIT6;

//
//
//
//

Vcc reference, 16 clocks, on


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

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


// 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);

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

P1SEL2
UCA0CTL1
UCA0CTL1

|= (BIT1 + BIT2);
|= UCSSEL_2;
|= UCSWRST;

// 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

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 lec

void UART_TXchar2();

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

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.
Pin Funcionalidad

Comentario

P1.3 UP

Entrada digital

P1.5 Velocidad

Entrada analgica (por ejemplo, un potencimetro)

P1.4 DOWN
P1.6 LEFT

P1.7 RIGHT

Entrada digital

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


ocuparlo como entrada digital.
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-gamein-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 17 045 veces.

Вам также может понравиться