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

Microcontroladores

Grado en Ingeniera de Tecnologas de Telecomunicacin

Prctica 6:
Comunicacin serie
asncrona: la UART

CURSO ACADMICO 2012/2013

Prctica 6: Comunicacin serie asncrona: la UART

Curso 2012/2013

NDICE
1

1.

Introduccin ............................................................................................................................. 1
1.1

Objetivo ............................................................................................................................ 1

1.2

Instalacin del programa en el PC .................................................................................... 1

1.3

Configuracin de la placa LaunchPad .............................................................................. 2

PRCTICA 6: COMUNICACIN SERIE A TRAVS DE LA UART ....................................................... 4

Prctica 6: Comunicacin serie asncrona: la UART

Curso 2012/2013

1 INTRODUCCIN
Este documento describe la Prctica 6 de la asignatura, la cual pretende ofrecer una visin
general de la comunicacin serie a travs de la UART.
Para ello se parte de los conocimientos adquiridos en las prcticas anteriores, por lo que puede
ser necesaria su consulta para desarrollar algunos aspectos bsicos que ya se han tratado
anteriormente.
La prctica establece una comunicacin serie entre una aplicacin que se ejecuta en el PC y un
programa que se ejecuta en el microcontrolador:

1.1 Objetivo
En numerosas aplicaciones el microcontrolador cumple una funcin de interfaz entre un conjunto
de sensores o actuadores y otro procesador ms potente que realiza el tratamiento de los datos,
como, por ejemplo un PC. La forma de comunicacin ms extendida entre microcontrolador y el
PC es la comunicacin serie asncrona: el puerto serie.
Esta prctica tiene como objetivo bsico ofrecer un primer contacto con la utilizacin de la UART
para realizar una comunicacin serie asncrona entre un PC y el microcontrolador.

1.2 Instalacin del programa en el PC


1) Accede al campus virtual y descargue el fichero
Inst Practica 6.msi:

2) Ejecute el instalador (slo para Windows) y acepte


todos los pasos que va indicndole el mismo.

3) Si todo ha ido bien, debera haberse creado una


nueva entrada en el men de inicio y un acceso
directo en el escritorio:

Nuevo grupo Microcontroladores conteniendo acceso directo al


programa Prctica 6 en el men Inicio de Windows.

Acceso directo al programa


Prctica 6 en el escritorio.

Microcontroladores

Grado en Ingeniera de Tecnologas de Telecomunicacin

4) Desconecte la placa LaunchPad si la tiene conectada


al PC y arranque la aplicacin. Debera ver una
ventana informando de que no se detecta ninguna
placa conectada.

5) Pulse OK. Debera entonces ver la ventana de


la aplicacin ComSerie:

6) Cierre la aplicacin.

1.3 Configuracin de la placa LaunchPad


La versin 1.4 de la placa MSP EXP430G2 LaunchPad se comercializaba con Microcontroladores
de la familia MSP430G2XX como el MSP430G2231 que no disponan de perifricos de tipo USCI,
que implementan la UART en hardware. La versin 1.5 ya se comercializa con MSP430G2553,
que s dispone de este perifrico.

Diagrama de bloques del MSP43G2231, (sin USCI)

Diagrama de bloques del MSP430G2553, (con USCI)

Para realizar una comunicacin serie asncrona con el PC en el MSP430G2231 se utiliza lo que
se llama una Software UART (UART hecha en software), implementada por medio del
temporizador y bloque de salida (para la transmisin msp430 PC) y su bloque de captura
(para la recepcin PC msp430)

Prctica 6: Comunicacin serie asncrona: la UART

Curso 2012/2013

En los dispositivos MSP430G2533 (los que ponemos en las placas de laboratorio Rev 1.4) y en
los MSP430G2553 (los que traen las placas Rev 1.5), los terminales de entrada y salida del
temporizador que se utilizan para hace la UART software y los de entrada y salida de la USCI (la
UART hardware), son los mismos pero estn invertidos. Por tanto, para que la comunicacin entre
PC y microcontrolador se produzca correctamente, es necesario invertir las conexiones TXD y
RXD en los jumpers J3 de la placa LaunchPad.
Esta se realiza de distinta manera dependiendo de si utilizas una de las LaunchPad del
laboratorio (1.4) o una que hayas adquirido ms recientemente (1.5). En la versin 1.4 es
necesario utilizar dos cables para invertir las conexiones. En la versin 1.5, esto ya est
previsto y basta con girar noventa grados los conectores, como indica la impresin de la
placa, para que estos queden segn la configuracin HW UART1:

RXD
TXD
VCC
TEST
RESET

Configuracin HW UART en la LaunchPad Rev 1.4

Configuracin HW UART en la LaunchPad Rev 1.5

Para los que tengis curiosidad: esta solucin no se le ocurri a Texas Instruments, si no a un
aficionado a la electrnica de la comunidad de usuarios de la LaunchPad. Texas Instruments
pregunt a la comunidad de usuarios a travs de sus foros cmo queran que fuera el diseo de la
versin 1.5, dando varias opciones. Finalmente no adoptaron ninguna de ellas, sino que optaron
por la sugerida por uno de los miembros de esta comunidad. Diseo electrnico 2.0?
http://e2e.ti.com/support/microcontrollers/msp430/f/166/t/86277.aspx?pi77810=3
3

Microcontroladores

Grado en Ingeniera de Tecnologas de Telecomunicacin

2 PRCTICA 6: COMUNICACIN SERIE A TRAVS DE LA UART


2.1 Descripcin
El programa siguiente establece una comunicacin serie asncrona full dplex entre el
microcontrolador y la aplicacin Practica 6 instalada anteriormente en el PC. Existen tres tipos
de mensajes que se pueden enviar:

Dos tipos de mensajes entre el PC y el microcontrolador, uno para variar la frecuencia de


parpadeo del LED2 y otro para variar su ciclo de trabajo.

Un tipo de mensaje entre el microcontrolador y el PC, para avisar al PC de que la


recepcin de mensajes est habilitada o deshabilitada.

2.2 Cdigo
A continuacin se muestra el fichero Practica_06a.c.
Cuadro 1. Cdigo del programa Practica_06a.c
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*

**************************************************************************
UNIVERSIDAD DE MALAGA
DEPARTAMENTO DE TECNOLOGIA ELECTRONICA
http://www.uma.es
http://www.dte.uma.es
==========================================================================
PROGRAMA
: Practica6a.c
VERSION
: 1.0
TARGET
: Kit LaunchPad - Microcontrolador MSP430G2533
DESCRIPCION : Codigo de la Practica 6
Si se utiliza el comportamiento simple del pulsador S2
conmuta el LED1 al ser S2 soltado.
Si se utiliza el comportamiento multifuncin del pulsador
S2 conmuta el parpadeo del LED2 mediante un PWM.
Se utiliza un antirrebote para el pulsador S2.
RECURSOS
: Watchdog (WD), Temporizadores (T0,T1), USCIs (UA),
Pulsadores (S2), LEDs (LED1, LED2)
AUTOR
: Eduardo Javier Perez Rodriguez (edu@uma.es)
FECHA
: 29/04/13
COMENTARIOS : 1 tabulador = 8 espacios
**************************************************************************

*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/

/* ========================================================================== */
/* ============ INCLUDES ==================================================== */
/* ========================================================================== */
#include "io430g2533.h"

// MSP430G2533

#include <math.h>
#include <stdlib.h>
#include <stdio.h>

// rint
// atoi
// sprintf

/* ========================================================================== */
/* ============ CONSTANTES ================================================== */
/* ========================================================================== */
#define
#define
#define
#define
#define
#define
#define
#define

ON
OFF
PULS_ON
PULS_OFF
LED_ON
LED_OFF
RX_BUFFER_SIZE
TX_BUFFER_SIZE

1
0
0
1
1
0
3
2

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

Activo
Desactivo
Pulsador presionado
Pulsador soltado
LED encendido
LED apagado
Tamano buffer recepcion
Tamano buffer transmision

/* ========================================================================== */

Prctica 6: Comunicacin serie asncrona: la UART

Curso 2012/2013

/* ============ TIPOS DATOS ================================================= */


/* ========================================================================== */
typedef union {

// Flags

unsigned char total;


struct {
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
};
} flags;

char
char
char
char
char
char
char
char

f0
f1
f2
f3
f4
f5
f6
f7

// Todos
:
:
:
:
:
:
:
:

1;
1;
1;
1;
1;
1;
1;
1;

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

Flag
Flag
Flag
Flag
Flag
Flag
Flag
Flag

0
1
2
3
4
5
6
7

/* ========================================================================== */
/* ============ VARIABLES GLOBALES ========================================== */
/* ========================================================================== */
flags tareas;
//
BIT0: Tarea_0 -> Pulsador S2
//
BIT1: Tarea_1 -> Recepcion datos

// Flags activacion tareas:

char rx_buffer[RX_BUFFER_SIZE+1];
char tx_buffer[TX_BUFFER_SIZE+1];

// Buffer recepcion + '\0'


// Buffer transmision + '\0'

/* ========================================================================== */
/* ============ PROTOTIPOS ================================================== */
/* ========================================================================== */
void Config_uC(void);
void Config_Perifericos();
/* ========================================================================== */
/* ============ PROGRAMA PRINCIPAL ========================================== */
/* ========================================================================== */
int main(void) {
/* ------------ Variables --------------------------------------------------- */
unsigned char frec, ciclo;
int val;
unsigned char cont_buff;

// PWM LED2: frecuencia y ciclo


// Valor recibido
// Contador

/* ------------ Configuracion microcontrolador ------------------------------ */


Config_uC();
/* ------------ Configuracion perifericos ----------------------------------- */
Config_Perifericos();
/* ------------ Inicializacion variables ------------------------------------ */
tareas.total = 0;
for (cont_buff = 0; cont_buff < RX_BUFFER_SIZE; cont_buff++) {
rx_buffer[cont_buff] = 0;
} // for (cont_buff = 0; cont_buff < RX_BUFFER_SIZE; cont_buff++)
rx_buffer[RX_BUFFER_SIZE] = '\0';
for (cont_buff = 0; cont_buff < TX_BUFFER_SIZE; cont_buff++) {
tx_buffer[cont_buff] = 0;
} // for (cont_buff = 0; cont_buff < TX_BUFFER_SIZE; cont_buff++)
tx_buffer[TX_BUFFER_SIZE] = '\0';
frec = 1;
ciclo = 50;
TA0CCR0 = (unsigned int) rint(62500.0/frec);
TA0CCR1 = (unsigned int) rint(625.0*ciclo/frec);

Microcontroladores

Grado en Ingeniera de Tecnologas de Telecomunicacin

/* ------------ Inicio ------------------------------------------------------ */


__enable_interrupt();

// Habilita interrupciones

/* ------------ Bucle principal --------------------------------------------- */


for (;;) {
// ------------ Bajo consumo
__low_power_mode_0();

// Bajo consumo (LPM0)

// ------------ Tareas activas


while (tareas.total != OFF) {

// Mientras alguna tarea activa

// ------------ [Tarea_0 -> Pulsador S2]


if (tareas.f0 == ON) {
// Si Tarea_0 activa
tareas.f0 = OFF;
// Limpia flag Tarea_0
P1OUT_bit.P0 = ~(P1OUT_bit.P0);
// Conmuta LED1
IE2_bit.UCA0RXIE = ~(IE2_bit.UCA0RXIE); // Conmuta interrupcion USCI_A0 RX
sprintf(tx_buffer, "S%d", IE2_bit.UCA0RXIE);
IE2_bit.UCA0TXIE = ON;
// Habilita interrupcion USCI_A0 TX
} // if (tareas.f0 == ON)
// ------------ [Tarea_1 -> Recepcion datos]
if (tareas.f1 == ON) {
// Si Tarea_1 activa
tareas.f1 = OFF;
val = atoi(&rx_buffer[1]);

// Limpia flag Tarea_1


// Valor recibido

switch (rx_buffer[0]) {
case 'F':
case 'f':
{
if ((val >= 0) && (val <= 50)) {
// Si valor de frecuencia valido
frec = val;
TA0CCR0 = (unsigned int) rint(62500.0/frec);
TA0CCR1 = (unsigned int) rint(625.0*ciclo/frec);
} // if ((val >= 0) && (val <= 50))
break;
} // case 'F' - case 'f'
case 'C':
case 'c':
{
if ((val >= 1) && (val <= 99)) {
// Si valor de ciclo valido
ciclo = val;
TA0CCR1 = (unsigned int) rint(625.0*ciclo/frec);
} // if ((val >= 1) && (val <= 99))
break;
} // case 'C' - case 'c'
} // switch (rx_buffer[0])
} // if (tareas.f1 == ON)
} // while (tareas.total != OFF)
} // for (;;)
} // int main(void)
/* ========================================================================== */
/* ============ FUNCIONES =================================================== */
/* ========================================================================== */
/*
/*
/*
/*

-------------------------------------------------------------------------Funcion
: void Config_uC(void)
Descripcion : Configuracion del microcontrolador
Argumentos
:

*/
*/
*/
*/

Prctica 6: Comunicacin serie asncrona: la UART


/*
/*
/*
/*

Devuelve
:
Llamada desde: main
Llama a
:
--------------------------------------------------------------------------

Curso 2012/2013
*/
*/
*/
*/

void Config_uC(void) {
/* ------------ Variables --------------------------------------------------- */
/* ------------ Inicio ------------------------------------------------------ */
WDTCTL = WDTPW + WDTHOLD;
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
} // void Config_uC(void)
/*
/*
/*
/*
/*
/*
/*
/*

// Detiene watchdog
// Frecuencia DCO (1MHz)

-------------------------------------------------------------------------Funcion
: void Config_Perifericos(void)
Descripcion : Configuracion de los perifericos
Argumentos
:
Devuelve
:
Llamada desde: main
Llama a
:
--------------------------------------------------------------------------

*/
*/
*/
*/
*/
*/
*/
*/

void Config_Perifericos(void) {
/* ------------ Inicio ------------------------------------------------------ */
// ------------ [LED1, LED2]
P1DIR_bit.P0 = P1DIR_bit.P6 = ON;
// P1.6 -> Salida (LED2)
P1OUT_bit.P0 = LED_ON;
P1OUT_bit.P6 = LED_OFF;

// P1.0 -> Salida (LED1)


// P1.0 -> Enciende LED1
// P1.6 -> Apaga LED2

// ------------ [Pulsador S2]


P1DIR_bit.P3 = OFF;
P1REN_bit.P3 = ON;
P1OUT_bit.P3 = ON;
P1IES_bit.P3 = ON;
P1IFG_bit.P3 = OFF;
P1IE_bit.P3 = ON;

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

P1.3 -> Entrada (S2)


P1.3 -> Resistencia activa
P1.3 -> Resistencia pullup
P1.3 -> Flanco bajada
Limpia flag P1.3
Habilita interrupcion P1.3

// ------------ [Temporizador T0]


TA0CCR0 = 0x0000;
TA0CCR1 = 0x0000;
TA0CCTL1 = OUTMOD_2;
TA0CTL = TASSEL_2 + ID_3 + MC_3;
P1SEL_bit.P6 = ON;
P1SEL2_bit.P6 = OFF;

// toggle/reset
// SMCLK + /8 + up/down
// P1.6 -> TA0.1 (PWM)

// ------------ [USCI UA]


P1SEL_bit.P1 = P1SEL_bit.P2 = 1;
P1SEL2_bit.P1 = P1SEL2_bit.P2 = 1;

// P1.1 -> RX ; P1.2 -> TX

UCA0CTL1_bit.UCSWRST = ON;
UCA0CTL1_bit.UCSSEL1 = ON;
UCA0BR1 = 0x00;
UCA0BR0 = 0x68;
UCA0MCTL = 0x02;
UCA0CTL1_bit.UCSWRST = OFF;
IFG2_bit.UCA0RXIFG = OFF;
IE2_bit.UCA0RXIE = ON;

// Detiene USCI_A0
// SMCLK: 1 MHz
// 9600 baudios
// Inicia USCI_A0
// Limpia flag interrupcion USCI_A0 RX
// Habilita interrupcion USCI_A0 RX

WDTCTL = WDT_MDLY_32;

// Configura watchdog ~ 32 ms

while (IFG1_bit.WDTIFG != ON) {


// Mientras interrupcion watchdog no activa
}
WDTCTL = WDTPW + WDTHOLD;
IFG1_bit.WDTIFG = OFF;

// Detiene watchdog
// Limpia flag interrupcion watchdog

Microcontroladores

Grado en Ingeniera de Tecnologas de Telecomunicacin

} // void Config_Perifericos(void)
/* ========================================================================== */
/* ============ RUTINAS TRATAMIENTO INTERRUPCION ============================ */
/* ========================================================================== */
/*
/*
/*
/*
/*
/*
/*
/*

-------------------------------------------------------------------------Funcion
: void RTI_WD(void)
Descripcion : Antirrebote del pulsador S2
Argumentos
:
Devuelve
:
Fuentes
: WDTIFG
Llama a
:
--------------------------------------------------------------------------

*/
*/
*/
*/
*/
*/
*/
*/

#pragma vector = WDT_VECTOR


__interrupt void RTI_WD(void) {
/* ------------ Variables --------------------------------------------------- */
/* ------------ Inicio ------------------------------------------------------ */
WDTCTL = WDTPW
P1IFG_bit.P3 =
P1IE_bit.P3 =
} // __interrupt
/*
/*
/*
/*
/*
/*
/*
/*

+ WDTHOLD;
OFF;
ON;
void RTI_WD(void)

// Detiene watchdog
// Limpia flag interrupcion P1.3
// Habilita interrupcion P1.3

-------------------------------------------------------------------------Funcion
: void RTI_USCIA0RX(void)
Descripcion : Recepcion de datos serie
Argumentos
:
Devuelve
:
Fuentes
: UCA0RXIFG
Llama a
:
--------------------------------------------------------------------------

*/
*/
*/
*/
*/
*/
*/
*/

#pragma vector=USCIAB0RX_VECTOR
__interrupt void RTI_USCIA0RX(void) {
/* ------------ Variables --------------------------------------------------- */
static unsigned int cont_rx = 0;

// Numero datos RX

/* ------------ Inicio ------------------------------------------------------ */


rx_buffer[cont_rx] = UCA0RXBUF;
cont_rx++;
if (cont_rx == RX_BUFFER_SIZE) {
// Si recibidos todos los datos
cont_rx = 0;
tareas.f1 = ON;
} // if (cont_rx == RX_BUFFER_SIZE)
IFG2_bit.UCA0RXIFG = OFF;

// RX dato

// Activa Tarea_1
// Limplia flag interrupcion USCI_A0 RX

if (tareas.total != OFF) {
// Si alguna tarea activa
__low_power_mode_off_on_exit();
// Sale bajo consumo (LPM0)
} // if (tareas.total != OFF)
} // __interrupt void RTI_USCIA0RX(void)
/*
/*
/*
/*
/*
/*
/*
/*

-------------------------------------------------------------------------Funcion
: void RTI_USCIA0TX(void)
Descripcion : Transmision de datos serie
Argumentos
:
Devuelve
:
Fuentes
: UCA0RXIFG
Llama a
:
--------------------------------------------------------------------------

*/
*/
*/
*/
*/
*/
*/
*/

#pragma vector=USCIAB0TX_VECTOR
__interrupt void RTI_USCIA0TX(void) {
/* ------------ Variables --------------------------------------------------- */
static unsigned int cont_tx = 0;

// Numero datos TX

Prctica 6: Comunicacin serie asncrona: la UART

Curso 2012/2013

/* ------------ Inicio ------------------------------------------------------ */


UCA0TXBUF = tx_buffer[cont_tx];
cont_tx++;
if (cont_tx == TX_BUFFER_SIZE) {
// Si transmitidos todos los datos
cont_tx = 0;
IE2_bit.UCA0TXIE = OFF;
} // if (cont_tx == TX_BUFFER_SIZE)

// TX dato

// Deshabilita interrupcion USCI_A0 TX

IFG2_bit.UCA0TXIFG = OFF;
// Limplia flag interrupcion USCI_A0 TX
} // __interrupt void RTI_USCIA0TX(void)
/*
/*
/*
/*
/*
/*
/*
/*

-------------------------------------------------------------------------Funcion
: void RTI_P1(void)
Descripcion : Rutina tratamiento interrupcion puerto P1
Argumentos
:
Devuelve
:
Fuentes
: P1IFG.P3
Llama a
:
--------------------------------------------------------------------------

*/
*/
*/
*/
*/
*/
*/
*/

#pragma vector = PORT1_VECTOR


__interrupt void RTI_P1(void) {
/* ------------ Variables --------------------------------------------------- */
/* ------------ Inicio ------------------------------------------------------ */
P1IE_bit.P3 = OFF;

// Deshabilita interrupcion P1.3

// ------------ Antirrebote
WDTCTL = WDT_MDLY_32;
IFG1_bit.WDTIFG = OFF;
IE1_bit.WDTIE = ON;
// ------------ Antirrebote

// Configura watchdog
// Limpia flag interrupcion watchdog
// Habilita interrupcion watchdog

if (P1IES_bit.P3 == ON) {
// Si flanco de bajada (pulsador presionado)
} // if (P1IES_bit.P3 == ON)
else {
// Si flanco de subida (pulsador soltado)
tareas.f0 = ON;
// Activa Tarea_0
} // else: if (P1IES_bit.P3 == ON)
P1IES_bit.P3 = ~(P1IES_bit.P3);
P1IFG_bit.P3 = OFF;
if (tareas.total != OFF) {
// Si alguna tarea activa
__low_power_mode_off_on_exit();
} // if (tareas.total != OFF)
} // void RTI_P1(void)

// P1.3 -> Conmuta flanco


// Limpia flag interrupcion P1.3

// Sale bajo consumo (LPM0)

7) Analiza el programa e intenta entender su funcionamiento antes de ejecutarlo. Se


recomienda dibujar un flujograma como ayuda.
8) Realiza los pasos necesarios para compilar, cargar y ejecutar el programa Practica6a.c en
la placa LaunchPad.
9) Ejecuta el programa en el PC Practica 6. Esta vez, al estar la placa LaunchPad
conectada al PC, la aplicacin debera detectar su presencia. Conecta eligiendo primero el
puerto adecuado y luego pulsando Conectar:

Microcontroladores

Grado en Ingeniera de Tecnologas de Telecomunicacin

10) Observa el comportamiento del LED2 (verde) en la placa LaunchPad mientras cambias el
valor de los discos Frecuencia y Ciclo de Trabajo en la aplicacin ComSerie.
11) Responde a las siguientes preguntas. Para ello es posible que tengas que utilizar el
depurador y colocar puntos de ruptura en distintos puntos del programa Practica6a.c que
se ejecuta en el microcontrolador.
Pregunta 1. Qu caracteres se envan desde el PC cuando se modifica la frecuencia de
parpadeo?:
Pregunta 2. Qu caracteres se envan desde el PC cuando se modifica el ciclo de trabajo?
12) Acciona el pulsador S2 y observa el comportamiento del programa ComSerie.
Pregunta 3. Qu caracteres se envan hacia el PC cuando se acciona el pulsador S2?
El programa ComSerie est preparado para reconfigurar los discos de seleccin a los valores
1Hz y 50% cuando recibe el comando S3. Sin embargo el cdigo Practica6a.c nunca enva
estos comandos.
Pregunta 4. Qu modificaciones se han de producir en el programa Practica6a.c para que se
enve el comando S3 cuando se acciona el pulsador S1 (RESET)? Realiza estas
modificaciones.

10

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