Professional Documents
Culture Documents
USART
Cada uma destas máquinas pode ser configurada para operar em modos de transmissão
distintos:
É 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
Página 137
Página 138
Página 139
26.4. O padrão de comunicação serial RS232 (EIA232).
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.
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 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:
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.
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.
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.
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.
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:
O fator N depende de qual dos dois modos de velocidade está selecionado na máquina.
Página 147
• Fator N quandoUSOC16 = 1 Æ OVERSAMPLING;
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.
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.
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.
#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?
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?
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.
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.
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.
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.
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).
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:
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
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.
O erro individual de cada bit pode ser calculado através da seguinte expressão:
Onde:
Vamos a um exemplo. Queremos descobrir quais são os valores de erro transmissão para
cada bit nas seguintes condições:
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%.
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:
Vamos fazer os cálculo para o mesmo exemplo utilizado na transmissão, mas agora
ajsutando a máquina para a recepção:
Isto significa que o máximo erro que existirá em um bit deste caractere será de 5,08%.
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.
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.
Página 167
26.16.2. Interrupção numa operação de RX
Página 168
Página 169
Página 170
26.18. Dois códigos de exemplo de configuração e uso da USART.
#include <msp430xG46x.h>
void main(void)
{
volatile unsigned int i;
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 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
}
}
#include <msp430xG46x.h>
void main(void)
{
volatile unsigned int i;
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
#pragma vector=USART1RX_VECTOR
__interrupt void USART1_rx (void)
{
while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready?
TXBUF1 = RXBUF1; // RXBUF1 to TXBUF1
}
27.1. EXERCÍCIO-18
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.
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