Академический Документы
Профессиональный Документы
Культура Документы
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
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
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:
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 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
(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.
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
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.
//
//
//
//
Definicin
Asignacin
Asignacin
Asignacin
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
// Definicin de registros
A |= B;
A &= ~B;
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.
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.
*/
#include <msp430.h>
#include <inttypes.h>
void main(){
WDTCTL= WDTPW+WDTHOLD;
//inclusiones.
//funcion principal
//Apagamos el watchdog
P1SEL= 0x00;
P1DIR|= BIT0;
P1OUT|=BIT0;
while(1){
//Loop infinito
P1OUT|=BIT0;
//prende el LED
__delay_cycles(100000); //espera
P1OUT&=~BIT0;
//apaga el LED
__delay_cycles(100000); //espera
}
}
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;
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;
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;
P1OUT|=BIT0;
P1OUT&=~BIT6;
_BIS_SR(GIE);
while(1){
for(i=0;i<T;i++);
P1OUT^=BIT6;
P1OUT^=BIT0;
}
}
if(T<=1500){T=30000;}
//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);
while(1){
for(i=0; i<T;i++);
led_toggle(led1+led2);
if(T<=1500){T=30000;}
}
P1SEL= 0x00;
P1DIR|= (BIT0+BIT6);
P1DIR&=~ BIT3;
P1REN|= BIT3;
P1IE|=BIT3;
P1IES|=BIT3;
P1IFG&=~BIT3;
P1OUT|=BIT0;
P1OUT&=~BIT6;
ADC
// 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;
//
//
//
//
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;
}
}
}
Comunicacin UART
// Se detiene el watchdog
P1SEL2
UCA0CTL1
UCA0CTL1
|= (BIT1 + BIT2);
|= UCSSEL_2;
|= UCSWRST;
/*
* 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';
}
// EL caracter "\n" indica un salto de lnea en Windows, til para mejorar la lec
void UART_TXchar2();
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
// Se detiene el watchdog
//
//
//
//
while (1){
__delay_cycles(100000);
UART_TXchar2(palabra);
}
}
// 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
}
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
P1.4 DOWN
P1.6 LEFT
P1.7 RIGHT
Entrada digital
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.