Você está na página 1de 40

26.

USART

26.1. Máquinas de comunicação serial no MSP430.

Os dispositivos MSP430 tem dois tipos de máquinas para comunicação serial:

• USART: Universal Synchronous/Asynchronous Receive/Transmit;


• USCI: Universal Serial Communication Interface;

Cada uma destas máquinas pode ser configurada para operar em modos de transmissão
distintos:

• UART: Universal Asynchronous Receive/Transmit;


• SPI: Synchronous Peripheral Interface;
• I2C: Inter-Integrated Circuit

É necessário consultar o datasheet de cada dispositivo para saber exatamente qual máquina
está presente no chip e quais as funcionalidades ativas. Para os dois dispositivos que temos
presentes na Experimenter Board, tem-se as seguintes máquinas seriais:

• MSP430x20x2, MSP430x20x3:
o USCI: Universal Serial Communication Interface;
ƒ SPI: Synchronous Peripheral Interface;
ƒ I2C: Inter-Integrated Circuit
• MSP430Xg461x:
o USART: Universal Synchronous/Asynchronous Receive/Transmit;
ƒ UART: Universal Asynchronous Receive/Transmit;
ƒ SPI: Synchronous Peripheral Interface
o USCI: Universal Serial Communication Interface;
ƒ Enhanced UART: Universal Asynchronous Receive/Transmit;
ƒ IrDA Encoder & Decoder: Infrared Data Association
ƒ SPI: Synchronous Peripheral Interface;
ƒ I2C: Inter-Integrated Circuit

Página 135
26.2. O RS232 na Experimenter Board

Durante o nosso treinamento serão abordadas as máquinas USART e USCI do


MSP430FG4618, ambas configuradas para modo UART, como veremos a seguir.
Porém apenas a USCI tem conexão com o terminal DB9 da placa, como pode ser visto
pelo diagrama elétrico acima.
Página 136
26.3. Breve introdução à comunicação serial.

Página 137
Página 138
Página 139
26.4. O padrão de comunicação serial RS232 (EIA232).

26.4.1. O que é RS232

RS é uma abreviação de “Recommended Standard”. Ela relata uma padronização de uma


interface comum para comunicação de dados entre equipamentos, criada no início dos anos
60, por um comitê conhecido atualmente como “Electronic Industries Association” (EIA).

Naquele tempo, a comunicação de dados compreendia a troca de dados digitais entre um


computador central (mainframe) e terminais de computador remotos, ou entre dois terminais
sem o envolvimento do computador. Estes dispositivos poderiam ser conectados através de
linha telefônica, e conseqüentemente necessitavam um modem em cada lado para fazer a
decodificação dos sinais.

Dessas idéias nasceu o padrão RS232. Ele especifica as tensões, temporizações e funções
dos sinais, um protocolo para troca de informações, e as conexões mecânicas. A mais de 30
anos desde que essa padronização foi desenvolvida, a EIA publicou três modificações. A
mais recente, EIA232E, foi introduzida em 1991. Ao lado da mudança de nome de RS232
para EIA232, algumas linhas de sinais foram renomeadas e várias linhas novas foram
definidas.

26.4.2. Definições de sinais

Se a norma EIA232 completa for implementada, o equipamento que faz o processamento


dos sinais é chamado DTE (Data Terminal Equipment – usualmente um computador ou
terminal), tem um conector DB9 macho, e utilizando os pinos mostrados na figura a seguir
para sinais ou terra.

O equipamento que faz a conexão (normalmente uma interface com a linha telefônica) é
denominado de DCE (Data Circuit-terminating Equipment – usualmente um modem), tem um
conector DB9 fêmea, e utilizando os pinos mostrados na figura a seguir para sinais ou terra.

Página 140
Um cabo de conexão entre dispositivos DTE e DCE contém ligações em paralelo, não
necessitando mudanças na conexão de pinos. Se todos os dispositivos seguissem essa
norma, todos os cabos seriam idênticos, e não haveria chances de haver conexões
incorretas.

Diversos sinais são necessários para conexões onde o dispositivo DCE é um modem, e eles
são utilizados apenas quando o protocolo de software os emprega. Para dispositivos DCE
que não são modem, ou quando dois dispositivos DTE são conectados diretamente, poucos
sinais são necessários.

Os sinais de temporização de transmissão e recepção são utilizados somente quando o


protocolo de transmissão utilizado for síncrono. Para protocolos assíncronos, padrão 8 bits,
os sinais de temporização externos são desnecessários.

Os nomes dos sinais que implicam em uma direção, como “Transmit Data” e “Receive Data”,
são nomeados do ponto de vista dos dispositivos DTE. Se a norma EIA232 for seguida a
risca, estes sinais terão o mesmo nome e o mesmo número de pino do lado do DCE.

Infelizmente, isto não é feito na prática pela maioria dos usuários, provavelmente
porque em alguns casos torna-se difícil definir quem é o DTE e quem é o DCE. A figura
a seguir apresenta a convenção utilizada para os sinais mais comuns.

Página 141
26.4.3. Definições de sinais

As funções dos sinais da norma EIA232 podem ser subdivididos categorias, apresentados
na tabela a seguir.

Página 142
26.4.4. Características dos sinais

Todas as linhas, sejam elas de informações de dados, temporização ou controle, podem ser
representadas pelo mesmo circuito elétrico equivalente da figura a seguir:

Este circuito equivalente aplica-se aos sinais originados tanto no DTE quanto no DCE. A
capacitância “Co” não é especificada na norma, mas deve ser assumida como pequena e
consistir apenas de elementos parasitas. “Ro” e “Vo” são escolhidos de forma tal que a
corrente de curto-circuito não exceda a 500 mA.

Sinais com tensão entre –3 volts e –25 volts com relação ao terra (pino 7) são
considerados nível lógico “1” (condição marca), e tensões entre +3 volts e +25 volts são
considerados nível lógico “0” (condição espaço). A faixa de tensões entre –3 volts e +3
volts é considerada uma região de transição para o qual o estado do sinal é indefinido.

Página 143
Quatro sinais foram implementados com segurança à falhas (“fail-safe design”) no qual
durante a desenergização ou desconexão do cabo, seus sinais estarão desabilitados (nível
lógico “0”). São eles:

• Sinal RTS – desabilitado


• Sinal SRTS – desabilitado
• Sinal DTR – DTE não pronto
• Sinal DSR – DCE não pronto

26.5. Modo UART na máquina USCI.

Como foi abordado na breve introdução a comunicação serial, através da máquina USCI,
configurada em modo UART, será possível conectar o MSP430 ao mundo externo através
de dois pinos: UCA0RXD e UCA0TXD. Isto permitirá a transmissão de dados em modo full
duplex.

Algumas das características que estão presentes neste modo são:


• Transmissão de 7 ou 8 bits de dados, com ou sem paridade;
• Registradores de TX e RX independentes;
• Buffers de TX e RX separados;
• Transmissão e recepção através de LSB-first;
• Possibilidade de transmissão de bit de endereçamento;
• Detector de início de recepção com possibilidade de acordar o dispositivo;
• Taxa de transmissão programável;
• Indicador de erro de TX/RX;
• Capacidade de interrupção independente para TX e RX.

Quando neste modo, a USCI transmite e recebe caracteres a uma determinada taxa de bits
em modo assíncrono, para outro dispositivo. O tempo que é gasto para transmitir cada bit de
dado é baseado na freqüência de baud rate ajustada na USCI, e é sempre a mesma para
transmitir e receber informações.

26.6. Inicializando a USCI.

A máquina USCI é resetada toda vez que ocorrer um PUC ou quando o bit USCWRST = 1.
Após a ocorrência de um PUC, o bit USCWRST sempre é levado para nível lógico um, o que
significa dizer que a USCI sempre começa a operar em condição de reset. É necessário
passar este bit para nível lógico zero para que a operação com a USCI seja liberada.

Página 144
Isto faz com que os bits UCAxRXIE, UCAxTXIE, UCAxRXIFG, UCRXERR, UCBRK, UCPE,
UCOE, UCFE, UCTOE e UCBTOE sejam resetados, e o bit UCAxTXIFG seja setado. É
importante ter isto em mente, pois após estudar o que cada um destes sinais fazem na
configuração da máquina, você entenderá em que estado ela começa a trabalhar quando o
chip é resetado.

Página 145
26.7. Formato dos dados transmitidos e recebido pela UART da
máquina USCI.

26.8. Gerador de Baud Rate da USCI.

Dentro da máquina USCI tem-se um módulo que tem a capacidade de gerar a base de
tempo necessária para a transmissão de dados em modo assíncrono. Lembre-se que os
dispositivos que fazem comunicação assíncrona necessitam que esta base de tempo seja a
mais precisa possível, de modo que possam identificar perfeitamente onde está cada bit ao
longo do tempo.

Pequenos erros no valor do Baud Rate costumam gerar grandes erros na transmissão de
dados.

O módulo gerador de Baud Rate do MSP430 na máquina USCI pode ser visto na figura a
seguir.

Página 146
No MSP430 a temporização para validar cada bit recebido é mostrado na figura abaixo. A
amostra de informação ocorre nos momentos N/2-1, N/2 e N/2+1 dos pulsos do BRCLK. N é
a relação entre o número de pulsos do BRCLK para cada BITCLK.

26.8.1. Ajuste de Baud Rate da USCI

A fonte de clock é selecionada através dos bits UCSSELx. Esta seleção indicará qual é a
velocidade presente na entrada BRCLK. Sabendo o valor da velocidade de BRCLK (fBRCLK),
o valor da baud rate é calculado através da expressão abaixo:

A máquina USCI pode trabalhar em dois modos de velocidade de baud rate: LOW-
FREQUENCY e OVERSAMPLING. A seleção de qual modo está ajustado na máquina
depende do valor do bit USOC16, onde:

• USOC16 = 0 Æ LOW FREQUENCY;


• USOC16 = 1 Æ OVERSAMPLING;

O fator N depende de qual dos dois modos de velocidade está selecionado na máquina.

• Fator N quando USOC16 = 0 Æ LOW FREQUENCY;

A parte inteira de N será calculada por:

A parte fracionária de N será calculada por:

Página 147
• Fator N quandoUSOC16 = 1 Æ OVERSAMPLING;

A parte inteira de N será calculada por:

A parte fracionária de N será calculada por:

26.8.2. Temporização dos bits de recepção

A temporização na recepção tem duas fontes de erro. A primeira é o tempo de bit a bit, como
acontece na transmissão. A segunda é o erro entre uma borda de início de recepção ocorrer
e o tempo necessário para que a máquina entenda que isto aconteceu e comece a
processar os dados de entrada.

Estes dois erros podem ser melhor visualizados através do mapa de tempos mostrados na
figura a seguir.

A temporização ideal para início do start bit é a metade da temporização de baud rate,
porque cada bit sempre é testado na metade deste período. Assim, a temporização ideal
para todos os bits restantes deve seguir a mesma lógica.

Página 148
26.8.3. Taxas típicas de transmissão e recepção e seus
respectivos erros na máquina USCI no modo UART
• USOC16 = 0 Æ LOW FREQUENCY;

Página 149
• USOC16 = 1 Æ OVERSAMPLING;

Página 150
26.9. Interrupções da USCI no modo UART.

A USCI possui vetores de interrupção separados para TX e RX. Isto permite que os dois
tipos de interrupção ocorram separadamente.

26.9.1. Interrupção numa operação de TX

A flag de interrupção de transmissão UCAxTXIFG é setada pelo transmissor para indicar que
o buffer UCAxTXBUF está pronto para aceitar mais um caractere a ser transmitido. Para que
isto ocorra é necessário que os bits GIE e UCAxTXIE estejam em nível lógico 1. A flag de
interrupção é automaticamente apagada quando o programa entra na rotina de tratamento
de interrupção ou quando um novo caractere é gravado no registrador UCAxTXBUF.
UCAxTXIFG é setada após um PUC ou quando UCSWRST = 1. UCAxTXIE é resetado
após um PUC ou quando UCSWRST = 1.

26.9.2. Interrupção numa operação de RX

A flag de interrupção de recepção UCAxRXIFG é setada pelo receptor quando um caractere


é recebido e gravado com sucesso no buffer UCAxRXBUF. Para que isto ocorra é
necessário que os bits GIE e UCAxRXIE estejam em nível lógico 1. A flag de interrupção é
automaticamente apagada quando o programa entra na rotina de tratamento de interrupção
ou quando o registrador UCAxRXBUF é lido. UCAxRXIFG e UCAxRXIE são
automaticamente resetadas após um PUC ou quando UCSWRST = 1.

26.10. Os principais registradores de controle da USCI.

Página 151
Página 152
Página 153
Página 154
Página 155
26.11. Dois códigos de exemplo de configuração e uso da USCI.

26.11.1. EXEMPLO-33 msp430xG46x_uscia0_9600.c


//******************************************************************************
// MSP430xG46x Demo - USCI_A0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
//
// Description: Echo a received character, RX ISR used. Normal mode is LPM3,
// USCI_A0 RX interrupt triggers TX Echo.
// ACLK = BRCLK = LFXT1 = 32768, MCLK = SMCLK = DCO~1048k
// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 03h )
// //* An external watch crystal is required on XIN XOUT for ACLK *//
//
//
// MSP430xG461x
// -----------------
// /|\ | XIN|-
// | | | 32kHz
// -- |RST XOUT|-
// | |
// | P2.5/UCA0RXD|------------>
// | | 9600 - 8N1
// | P2.4/UCA0TXD|<------------
//
// K. Quiring/ M. Mitchell
// Texas Instruments Inc.
// October 2006
// Built with IAR Embedded Workbench Version: 3.41A
// Revisado por :
// William Antunes
// will.antunesdamaia@gmail.com
// correção das portas para uso do DB9 conectado na placa
//******************************************************************************

#include "msp430xG46x.h"

void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps

do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

//P4SEL |= 0x0C0; // P4.7,6 = USCI_A0 RXD/TXD


P2SEL |= BIT4 + BIT5; // P2.4,5 = USCI_A0 RXD/TXD
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32k/9600 - 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = 0x06; // Modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
P5DIR |= 0x02; // Set P5.1 to output direction
P5OUT ^= 0x02; // Toggle P5.1 using exclusive-OR
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
_BIS_SR(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
}

// Echo back RXed character, confirm TX buffer is ready first


#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
while(!(IFG2&UCA0TXIFG));
P5OUT ^= 0x02; // Toggle P5.1 using exclusive-OR
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
}

Página 156
26.11.2. EXEMPLO-34 msp430xG46x_uscia0_uart_115k_lpm.c

//******************************************************************************
// MSP430xG46x Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK, LPM3
//
// Description: Echo a received character, RX ISR used. Normal mode is LPM3.
// Automatic clock activation for SMCLK through the USCI is demonstrated.
// USCI_A0 RX interrupt triggers TX Echo.
// Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|01h)
// ///* An external watch crystal between XIN & XOUT is required for ACLK *//
//
//
// MSP430xG461x
// -----------------
// /|\ | XIN|-
// | | | 32kHz
// -- |RST XOUT|-
// | |
// | P2.5/UCA0RXD|------------>
// | | 115200 - 8N1
// | P2.4/UCA0TXD|<------------
//
// K. Quiring/ M. Mitchell
// Texas Instruments Inc.
// October 2006
// Built with IAR Embedded Workbench Version: 3.41A
// Revisado por :
// William Antunes
// will.antunesdamaia@gmail.com
// correção das portas para uso do DB9 conectado na placa
//******************************************************************************

#include "msp430xG46x.h"

void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps

do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

//P4SEL |= 0x0C0; // P4.7,6 = USCI_A0 RXD/TXD


P2SEL |= BIT4 + BIT5; // P2.4,5 = USCI_A0 RXD/TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 0x09; // 1MHz 115200
UCA0BR1 = 0x00; // 1MHz 115200
UCA0MCTL = 0x02; // Modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
P5DIR |= 0x02; // Set P5.1 to output direction
P5OUT ^= 0x02; // Toggle P5.1 using exclusive-OR
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt

_BIS_SR(LPM3_bits + GIE); // Enter LPM4, interrupts enabled


}

// Echo back RXed character, confirm TX buffer is ready first


#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
while(!(IFG2&UCA0TXIFG));
P5OUT ^= 0x02; // Toggle P5.1 using exclusive-OR
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
}

Página 157
26.12. Modo UART na máquina USART.

Como foi abordado na breve introdução a comunicação serial, através da máquina USART,
configurada em modo UART, será possível conectar o MSP430 ao mundo externo através
de dois pinos: URXD e UTXD. Isto permitirá a transmissão de dados em modo full duplex.

Algumas das características que estão presentes neste modo são:


• Transmissão de 7 ou 8 bits de dados, com ou sem paridade;
• Registradores de TX e RX independentes;
• Buffers de TX e RX separados;
• Transmissão e recepção através de LSB-first;
• Possibilidade de transmissão de bit de endereçamento;
• Detector de início de recepção com possibilidade de acordar o dispositivo;
• Taxa de transmissão programável;
• Indicador de erro de TX/RX;
• Capacidade de interrupção independente para TX e RX.

Quando neste modo, a USART transmite e recebe caracteres a uma determinada taxa de
bits em modo assíncrono, para outro dispositivo. O tempo que é gasto para transmitir cada
bit de dado é baseado na freqüência de baud rate ajustada na USART, e é sempre a mesma
para transmitir e receber informações.

26.13. Inicializando a USART.

A máquina USART é resetada toda vez que ocorrer um PUC ou quando o bit SWRST = 1.
Após a ocorrência de um PUC, o bit SWRST sempre é levado para nível lógico um, o que
significa dizer que a USART sempre começa a operar em condição de reset. É necessário
passar este bit para nível lógico zero para que a operação com a USART seja liberada.

Isto faz com que os bits URXIEx, UTXIEx, URXIFGx, RXWAKE, TXWAKE, RXERR, BRK,
PE, OE e FE sejam resetados, e os bits UTXIFGx e TXEPT sejam setados. Já as flags
URXEx e UTXEx não são alteradas. É importante ter isto em mente, pois após estudar o
que cada um destes sinais fazem na configuração da máquina, você entenderá em que
estado ela começa a trabalhar quando o chip é resetado.

Página 158
26.14. Formato dos dados transmitidos e recebido pela USART.

Página 159
26.15. Gerador de Baud Rate da USART.

Dentro da máquina USART tem-se um módulo que tem a capacidade de gerar a base de
tempo necessária para a transmissão de dados em modo assíncrono. Lembre-se que os
dispositivos que fazem comunicação assíncrona necessitam que esta base de tempo seja a
mais precisa possível, de modo que possam identificar perfeitamente onde está cada bit ao
longo do tempo.

Pequenos erros no valor do Baud Rate costumam gerar grandes erros na transmissão de
dados.

O módulo gerador de Baud Rate do MSP430 pode ser visto na figura a seguir.

Página 160
No MSP430 a temporização para validar cada bit recebido é mostrado na figura abaixo. A
amostra de informação ocorre nos momentos N/2-1, N/2 e N/2+1 dos pulsos do BRCLK. N é
a relação entre o número de pulsos do BRCLK para cada BITCLK.

26.15.1. Tempo de Bit do Gerador de Baud Rate

O primeiro estágio do gerador de Baud Rate é o contador/comparador de 16 bits.

No início de cada transmissão ou recepção, o contador é carregado um o valor inteiro de


N/2, onde N é o valor de 16 bits armazenados nos dois registradores de 8 bits UxBR0 e
UxBR1.

Este contador é recarregado com INT (N/2) a cada metade de ciclo de transmissão/recepção
de cada bit. Isto Isto resultará o período total de um bit para N BRCLKs. Deste modo, para
um determinado valor do BRCLK, o valor utilizado para Baud Rate irá determinar o requisito
do fator de divisão N, como pode ser visto na equação abaixo.

É claro que matematicamente podemos escrever também que:

Página 161
Lembre-se que o resultado da divisão que gera o valor de N pode resultar em um valor não
inteiro, um valor decimal. A parte inteira deste valor pode ser aproveitada pelo divisor
(prescaler).

O segundo estágio do gerador de Baud Rate é o modulador.

Ele é utilizado para encontrar a parte fracionária de N mais próxima possível do valor real
obtido durante a operação de divisão. Assim, a definição do fator N é:

Onde:

• N: fator de divisão alvo para um determinado Baud Rate;


• UxBR: 16 bits resultantes dos registradores UxBR0 e UxBR1;
• i: posicionamento de cada bit dentro de um caractere transmitido ou recebido;
• n: número total de bits transmitidos ou recebidos em um caractere;
• mi: dado carregado em cada bit (0 ou 1).

Assim, com as informações anteriores, podemos chegar a seguinte expressão:

O valor de BICLK pode ser ajustado para cada bit com o auxílio do modulador, para
encontrar o tempo necessário quando um valor de N não inteiro é obtido. A temporização de
cada bit é expandida para um ciclo do BRCLK se o bit mi do modulador está setado. A cada
momento que um bit é recebido ou transmitido, o próximo bit no registrador de controle do
modulador determina qual a temporização daquele bit. Levar o bit set modulation para nível
lógico 1 incrementará o fator de divisão fornecido por UxBR.

O tempo necessário para a existência de um start bit é determinada pelo valor de UxBR
vezes m0, o próximo bit é determinado por UxBR vezes m1, e assim por diante, até que
todos os bits tenham sido transmitidos. A modulação sempre inicia pelo LSB. Caso o
caractere a ser transmitido seja maior que os 8 bits do padrão de transmissão, o modulador
irá reiniciar a sequência com o valor de m0 e continuará até que todos os bits tenham sido
processados.

Página 162
26.15.2. Determinando o valor da Modulação

Determinar o valor da modulação é um processo interativo. Utilizando a fórmula de erro


mostrada no próximo item deste capítulo inicia-se pelo primeiro bit, calculando o erro
individual de cada bit, para os ajustes do bit de modulação em 0 e em 1.

Em um dos dois casos será obtido o menor valor de erro. Este será o valor ajustado para o
próximo bit, onde deve-se, novamente, testar os dois estados. Este processo se repete até
que todos os bits sejam testados e se obtem um valor do modulador cujo erro seja o menor
possível.

26.15.3. Temporização dos bits de transmissão

A temporização necessária para transmissão de um caractere deve ser o resultado da soma


dos tempos de transmissão de cada bit individualmente. Como o MSP430 modula cada bit
individualmente, o erro acumulativo no caractere inteiro é reduzido.

O erro individual de cada bit pode ser calculado através da seguinte expressão:

Onde:

• Baud Rate: velocidade de transmissão desejada;


• BRCLK: valor da freqüência de entrada no gerador de Baud Rate, que pode ser
fornecida por diversas fontes: UCLKI, ACLK ou SMCLK;
• j: posicionamento de cada bit dentro de um caractere transmitido ou recebido, onde j
= 0 para o start bit, j = 1 para o bit D0, e assim por diante;
• UxBR: 16 bits resultantes dos registradores UxBR0 e UxBR1;

Vamos a um exemplo. Queremos descobrir quais são os valores de erro transmissão para
cada bit nas seguintes condições:

• Baud Rate: 2400;


• BRCLK: 32768 Hz (ACLK);
• UxBR: 13. O valor ideal seria 13,653333 (N = BRCLK / Baud Rate).
• UxMCTL: 0x06Bh:
o m7=0, m6=1, m5=1, m4=0, m3=1, m2=0, m1=1, and m0=1;
o O LSB no UxMCTL é utilizado primeiramente.

Página 163
Fazendo os cálculos:

Isto significa que o máximo erro que existirá em um bit deste caractere será de 5,08%.

26.15.4. Temporização dos bits de recepção

A temporização na recepção tem duas fontes de erro. A primeira é o tempo de bit a bit, como
acontece na transmissão. A segunda é o erro entre uma borda de início de recepção ocorrer
e o tempo necessário para que a máquina entenda que isto aconteceu e comece a
processar os dados de entrada.

Estes dois erros podem ser melhor visualizados através do mapa de tempos mostrados na
figura a seguir.

Página 164
A temporização ideal para início do start bit é a metade da temporização de baud rate,
porque cada bit sempre é testado na metade deste período. Assim, a temporização ideal
para todos os bits restantes deve seguir a mesma lógica. O erro obtido durante este ajuste
pode ser obtido através da equação abaixo:

Onde:

• Baud Rate: velocidade de recepção desejada;


• BRCLK: valor da freqüência de entrada no gerador de Baud Rate, que pode ser
fornecida por diversas fontes: UCLKI, ACLK ou SMCLK;
• j: posicionamento de cada bit dentro de um caractere transmitido ou recebido, onde j
= 0 para o start bit, j = 1 para o bit D0, e assim por diante;
• UxBR: 16 bits resultantes dos registradores UxBR0 e UxBR1;

Vamos fazer os cálculo para o mesmo exemplo utilizado na transmissão, mas agora
ajsutando a máquina para a recepção:

• Baud Rate: 2400;


• BRCLK: 32768 Hz (ACLK);
• UxBR: 13. O valor ideal seria 13,653333 (N = BRCLK / Baud Rate).
• UxMCTL: 0x06Bh:
o m7=0, m6=1, m5=1, m4=0, m3=1, m2=0, m1=1, and m0=1;
o O LSB no UxMCTL é utilizado primeiramente.
Página 165
Bit a bit:

Isto significa que o máximo erro que existirá em um bit deste caractere será de 5,08%.

26.15.5. Taxas típicas de transmissão e seus respectivos erros

A tabela mostrada a seguir foi calculada para um sistema com ACLK de 32768 Hz e SMCLK
de 1048756 Hz.

Página 166
26.16. Interrupções da USART.

A USART possui vetores de interrupção separados para TX e RX. Isto permite que os dois
tipos de interrupção ocorram separadamente.

26.16.1. Interrupção numa operação de TX

A flag de interrupção de transmissão UTXIFGx é setada pelo transmissor para indicar que o
buffer UxTXBUF está pronto para aceitar mais um caractere a ser transmitido. Para que isto
ocorra é necessário que os bits GIE e UTXIEx estejam em nível lógico 1.

A flag de interrupção é automaticamente apagada quando o programa entra na rotina de


tratamento de interrupção ou quando um novo caractere é gravado no registrador UxTXBUF.

UTXIFGx é setada após um PUC ou quando SWRST = 1. UTXIEx é resetado após um


PUC ou quando SWRST = 1. O hardware que garante a ocorrência destas condições é
mostrado na figura abaixo.

Página 167
26.16.2. Interrupção numa operação de RX

A flag de interrupção de recepção URXIFGx é setada pelo receptor quando um caractere é


recebido e gravado com sucesso no buffer UxRXBUF. Para que isto ocorra é necessário que
os bits GIE e URXIEx estejam em nível lógico 1.

A flag de interrupção é automaticamente apagada quando o programa entra na rotina de


tratamento de interrupção ou quando o registrador UxRXBUF é lido.

URXIFGx e URXIEx são automaticamente resetadas após um PUC ou quando SWRST = 1.


é após um PUC ou quando SWRST = 1. O hardware que garante a ocorrência destas
condições é mostrado na figura abaixo.

26.17. Os principais registradores de controle da USART.

Página 168
Página 169
Página 170
26.18. Dois códigos de exemplo de configuração e uso da USART.

26.18.1. EXEMPLO-35 msp430xG46x_usart1_19200.c


//*****************************************************************************
// MSP430xG46x Demo - USART1, Ultra-Low Pwr UART 19200 Echo ISR, 32kHz ACLK
//
// Description: Echo a received character, USART1 RX ISR at high-speed used
// with ultra-low power techniques. Normal operation in LPM3,
// On valid RX character, character echoed back. Use start-bit
// edge detect - URXSE - to automatically (re)enable DCO and trigger ISR. ISR
// must make sure DCO clock source remains enabled for the UART to receive
// full character.
// Software needs to make sure a character has been completely TX'ed, or RX'ed
// before entering LPM3, which disables DCO required for the USART baud rate
// generator. In the example, TX'ing is checked using the TXEPT bit directly.
// RX'ing is checked using the SSEL0 clock select bit as a flag. This is
// possible because UCLK1 = SMCLK when either both SSEL1 and SSEL0 or just
// SSEL1 = 1. In the example, when SSEL1 = SSEL0 = 1 there is no RX'ing, and
// LPM3 is allowed. When SSEL 1 = 1 and SSEL0 = 0 SMCLK is selected, but
// RX'ing is active and the DCO is required, thus LPM3 is not allowed.
// ACLK = LFXT1/8 = 32768/8, MCLK = SMCLK = UCLK1 = DCOCLK = 1048576
// Baud rate divider with 1048576hz= 1048576Hz/19200 ~ 55 (0036h)
// //* An external 32kHz watch crystal on XIN XOUT is required for ACLK *//
//
//
// MSP430FG4619
// -----------------
// /|\| XIN|-
// | | | 32768Hz
// --|RST XOUT|-
// | |
// | P4.0|------------>
// | | 19200 - 8N1
// | 43.1|<------------
//
//
// K. Quiring/ M. Mitchell
// Texas Instruments Inc.
// October 2006
// Built with IAR Embedded Workbench Version: 3.41A
//*****************************************************************************

#include <msp430xG46x.h>

void main(void)
{
volatile unsigned int i;

WDTCTL = WDTPW + WDTHOLD; // Stop WDT


P4SEL |= 0x03; // P4.1,0 = USART1 TXD/RXD
FLL_CTL0 |= XCAP14PF; // Configure load caps

do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD


U1CTL |= CHAR; // 8-bit character
U1TCTL |= SSEL1 + SSEL0 + URXSE; // UCLK = SMCLK, start edge detect
U1BR0 = 0x36; // 1MHz 19200
U1BR1 = 0x00; // 1MHz 19200
U1MCTL = 0x6B; // 1MHz 19200 modulation
U1CTL &= ~SWRST; // Initialize USART state machine
IE2 |= URXIE1; // Enable USART1 RX interrupt

Página 171
for (;;)
{
while (!(U1TCTL & TXEPT)); // Confirm no TXing before --> LPM3
_DINT(); // Disable interrupts for flag test
_NOP();
if (!(U1TCTL & SSEL0))
_BIS_SR(LPM0_bits + GIE); // RX'ing char, LPM, int's active
else
_BIS_SR(LPM3_bits + GIE); // Enter LPM3, int's active
}
}

#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
if ((IFG2 & URXIFG1)) // Test URXIFG0
{
while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready?
U1TXBUF = U1RXBUF; // RXBUF0 to TXBUF0
_BIC_SR_IRQ(LPM3_bits); // Exit LPM3 after reti
U1TCTL |= SSEL0; // SSEL0 = 1, no RX activity
}
else // Start edge
{
U1TCTL &= ~URXSE; // Clear URXS signal
U1TCTL |= URXSE; // Re-enable edge detect
_BIC_SR_IRQ(SCG1 + SCG0); // DCO reamins on after reti
U1TCTL &= ~SSEL0; // SSEL0= 0, RX activity
}
}

26.18.2. EXEMPLO-36 msp430xG46x_usart1_uart_115k.c


//******************************************************************************
// MSP430xG46x Demo - USART1, 115200 UART Echo ISR, DCO SMCLK
//
// Description: Echo a received character, RX ISR used. Normal mode is LPM0.
// USART1 RX interrupt triggers TX Echo.
// Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|08h)
// ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
// //* An external watch crystal between XIN & XOUT is required for ACLK *//
//
// MSP430FG4619
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P4.0/UTXD1|------------>
// | | 115200 - 8N1
// | P4.1/URXD1|<------------
//
// K. Quiring
// Texas Instruments Inc.
// October 2005
// Built with IAR Embedded Workbench Version: 3.39 beta
//******************************************************************************

#include <msp430xG46x.h>

void main(void)
{
volatile unsigned int i;

WDTCTL = WDTPW + WDTHOLD; // Stop WDT


FLL_CTL0 |= XCAP14PF; // Configure load caps

P4SEL |= 0x03; // P4.1,0 = USART1 TXD/RXD

do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

Página 172
ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
U1CTL |= CHAR; // 8-bit character
U1TCTL |= SSEL1; // UCLK= ACLK
U1BR0 = 0x09; // 1MHz 115200
U1BR1 = 0x00; // 1MHz 115200
U1MCTL = 0x08; // 1MHz 115200 modulation
U1CTL &= ~SWRST; // Initialize USART state machine
IE2 |= URXIE1; // Enable USART1 RX interrupt

_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt


}

#pragma vector=USART1RX_VECTOR
__interrupt void USART1_rx (void)
{
while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready?
TXBUF1 = RXBUF1; // RXBUF1 to TXBUF1
}

27. EXERCÍCIOS: Comunicação da EXPBoard via USCI – Modo UART.

27.1. EXERCÍCIO-18

Aproveitando os exemplos EXEMPLO-35 e EXEMPLO-36 escreva um programa que faça


um eco (repetição) o que é digitado através do teclado do PC.

Para tanto a velocidade de funcionamento da porta serial deve ser ajustada para um Baud
Rate de 9600. Utilize o programa Hiperterminal do Windows para estabelecer a conexão
com a Experimenter Board.

27.2. EXERCÍCIO-19

Escreva um programa que faça uma calculadora básica, que trabalhe com as quatro
operações matemáticas elementares: soma, subtração, multiplicação e divisão.

Ao ligar a Experimenter Board, conectá-la ao Hiperterminal do Windows, deve aparecer a


seguinte mensagem:
DIGITE O PRIMEIRO NÚMERO:

O usuário, através do teclado do computador, digita um valor inteiro entre 0 e 65536 e tecla
ENTER. Este valor deve ser transmitido via porta serial ao MSP430, que responde no
Hiperterminal:
DIGITE O SEGUNDO NÚMERO:

O usuário, através do teclado do computador, digita um outro inteiro entre 0 e 65536 e tecla
ENTER. Este valor deve ser transmitido via porta serial ao MSP430, que responde no
Hiperterminal:
DIGITE A OPERAÇÃO A SER REALIZADA:

Página 173
O usuário, através do teclado do computador, digita uma das quatro operações possíveis ( +,
-, * ou /) e tecla ENTER. Este valor deve ser transmitido via porta serial ao MSP430, que
responde no Hiperterminal com o resultado do cálculo:
O RESULTADO É: XXXXXX
Onde XXXXX é o resultado do cálculo. Finalmente o programa deve retornar ao início,
solicitando novamente a entrada do primeiro número.

O programa deve ficar o maior tempo possível em LPM e sair apenas para interagir com o
usuário, realizar os cálculos e apresentar os resultados.

Página 174