Академический Документы
Профессиональный Документы
Культура Документы
Prctica 6:
Comunicacin serie
asncrona: la UART
Curso 2012/2013
NDICE
1
1.
Introduccin ............................................................................................................................. 1
1.1
Objetivo ............................................................................................................................ 1
1.2
1.3
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.
Microcontroladores
6) Cierre la aplicacin.
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)
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
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
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
/* ========================================================================== */
Curso 2012/2013
// 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
char rx_buffer[RX_BUFFER_SIZE+1];
char tx_buffer[TX_BUFFER_SIZE+1];
/* ========================================================================== */
/* ============ PROTOTIPOS ================================================== */
/* ========================================================================== */
void Config_uC(void);
void Config_Perifericos();
/* ========================================================================== */
/* ============ PROGRAMA PRINCIPAL ========================================== */
/* ========================================================================== */
int main(void) {
/* ------------ Variables --------------------------------------------------- */
unsigned char frec, ciclo;
int val;
unsigned char cont_buff;
Microcontroladores
// Habilita interrupciones
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
:
*/
*/
*/
*/
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;
//
//
//
//
//
//
// toggle/reset
// SMCLK + /8 + up/down
// P1.6 -> TA0.1 (PWM)
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
// Detiene watchdog
// Limpia flag interrupcion watchdog
Microcontroladores
} // void Config_Perifericos(void)
/* ========================================================================== */
/* ============ RUTINAS TRATAMIENTO INTERRUPCION ============================ */
/* ========================================================================== */
/*
/*
/*
/*
/*
/*
/*
/*
-------------------------------------------------------------------------Funcion
: void RTI_WD(void)
Descripcion : Antirrebote del pulsador S2
Argumentos
:
Devuelve
:
Fuentes
: WDTIFG
Llama a
:
--------------------------------------------------------------------------
*/
*/
*/
*/
*/
*/
*/
*/
+ 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
// 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
Curso 2012/2013
// TX dato
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
:
--------------------------------------------------------------------------
*/
*/
*/
*/
*/
*/
*/
*/
// ------------ 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)
Microcontroladores
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