background image

Laboratorium 5 – transmisja szeregowa 

Transmisja szeregowa za pomoc

ą

 układu UART  

 
 
Układ Usart MSP430 umoŜliwia transmisję szeregową w trybie asynchronicznym. 
USART podłączony jest do urządzeń zewnętrznych za pomocą 2 zewnętrznych pinów, 
URXD i UTXD (3.4 i 3.5).  
Pracę w tym trybie, umoŜliwiającym komunikację z komputerem przez port RS-232, 
zerując bit SYNC w rejestrze sterującym. 
 

 

 
Format ramki danych. 
 

background image

Ramka danych  trybu asynchronicznego UART składa się z następujących  pól: 

 

bit startu, 

 

7 lub 8 bitów danych 

 

Bit parzystości /nieparzystości 

 

address bit (address-bit mode),  

 

1 lub 2 bitów stopu. 

 
 

 

 
Prędkość transmisji uzaleŜniona jest od częstotliwości zegara taktującego i zawartości 
odpowiednich rejestrów sterujących: UxBR1, UxBR0, UxMCTL. 

 
 

 

Typowe pr

ę

dko

ś

ci transmisji  

Ustawienia rejestrów sterujących dla standardowych prędkości transmisji (dla zegara 32,768-
Hz (ACLK)  i 1,048,576-Hz SMCLK) przedstawia poniŜsza tabela: 
 

 

 
Sposób wyznaczania dowolnej innej prędkości określa dokumentacja układu MSP430. 
 

 

Rejestry układu USART 

 

background image

 
 
 

 

 
 

background image

 

 
 

background image

 

background image

 

 

 

Przykładowy kod: 

 
Porty układu UART s
ą przyłączone do pinów 3.4 i 3.5 
 

#define Tx 0x10            // P3.4 
#define Rx 0x20            // P3.5 

 
 
Przykład inicjalizacji portów 3.4 i 3.5 do pracy w trybie UART 
 

#include <msp430x14x.h> 

background image

#include "portyUart.h" 
 

 

void initPortyUart(void) 

 P3SEL |= Tx + Rx; 
 P3DIR |= Tx; 
 P3DIR &= ~ Rx; 

 
Inicjalizacja układu UART do pracy z szybkością 1200 b/s. 
 

#include <msp430x14x.h> 
#include "uart.h" 
 
 
 
void initUart( int Speed) 
{  
int i; 
 

BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL 8MHz 

   do 
 

 

IF1 &= ~OFIFG;                       // Czyszczenie flgi OSCFault 

 

 

for (i = 0xFF; i > 0; i--);           // odczekanie  

 

   while ((IFG1 & OFIFG));               // dopóki OSCFault jest ci

ą

gle ustawiona  

   BCSCTL2 |= SELM1+SELM0 ;              // MCLK =LFXT1  
 
 switch(Speed) 
  { 
  case 1200:{ 
   ME1 |= UTXE0 + URXE0;                 // Wł

ą

czenie USART0 TXD/RXD 

   UCTL0 |= CHAR;                        // 8-bitów 
   UTCTL0 |= SSEL0;                      // UCLK = ACLK 
   UBR00 = 0x0A;                         // 8MHz/Speed in Bauds 
   UBR10 = 0x1A;                         //     
   UMCTL0 = 0x5B;                        // Modulation 
   UCTL0 &= ~SWRST;                      // Inicjalizacja UARTA 
   IE1 |= URXIE0;                        // Wł

ą

czenie przerwa

ń

 od RX  

   break; 
   } 
  } 

 
//---------------- wysyłanie znaku --------- 
void UartCharTransmit(unsigned char znak) 

 while ( (IFG1 & UTXIFG0)==0);          // gdy ukł

ą

d nie jest zaj

ę

ty       

 TXBUF0=znak;                           // wysyłamy znak 

 
//---------------- wysyłanie napisu ---------- 
void UartStringTransmit(char * napis)    

  while( *napis) 
    UartCharTransmit(*napis ++);    

 
 

Wysyłanie danych z prędkością 1200 b/s. 

 

#include<msp430x14x.h> 
#include "uart.h" 
#include "lcd.h" 

background image

#include "portyUart.h"  
#include "portyLcd.h"  
 
char Bufor[30];                         // bufor odczytywanych danych 
int low=0;                              // znacznik pocz

ą

teku danych w buforze   

int high=0;                             // zmacznik ko

ń

ca danych w buforze 

 
void main(void) 

 WDTCTL=WDTPW + WDTHOLD;                // wył

ą

czenie WDT 

   
 InitPortsLcd();                        // inicjalizacja portów LCD 
 InitLCD();                             // inicjalizacja LCD 
 clearDisplay();                        // czyszczenie wy

ś

wietlacza 

 initPortyUart();                       // inicjalizacja portow UART   
 initUart(1200);                        // inicjalizacja UARTa pr

ę

dko

ść

 transmisji    

 
 _EINT();                               // wł

ą

czenie przerwa

ń

  

 
while(1)                                // niesko

ń

czona p

ę

tla 

 { 
   UartStringTransmit("Tekst");        // wysłanie napisu Tekst do ternimala  
   UartDecimalTransmit(1);             // wysłanie cyfry jeden  
 
   while(high != low)                  // gdy odebrano dane  
    { 
     putc(Bufor[low]);                 // wypisanie danych na wy

ś

wietlaczu     

     low= (++low)%30;                  // inkrementowanie znaczika pocz

ą

tka danych       

    } 
 } 

 
#pragma vector=UART0RX_VECTOR           // procedura obsługi przerwania UART 
__interrupt void usart0_rx (void) 
{  
Bufor[high]=RXBUF0;                     // wpisanie odebranych danych do bufora 
high=(++high)%30;                       // inkrementowanie znacznika ko

ń

ca danych 


 
 
 

Zadania: 
 

1.

 

Ustawi

ć

 pr

ę

dko

ść

 transmisji na 2400, 9600, 115200 b/s. Format 

ramki danych: 8 bitów danych, 1 bit stopu, bez parzysto

ś

ci. 

2.

 

Zdefiniowa

ć

 4 napisy. Wysłanie ka

Ŝ

dego z napisów do okna 

terminala zainicjowa

ć

 za pomoc

ą

 naci

ś

ni

ę

cia jednego z 4 

klawiszy 

3. Wy

ś

wietli

ć

 aktualny czas z zegara na ekranie terminala. 

 

Aktualizowa

ć

 wy

ś

wietlany czas co 1 sekund

ę