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.
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
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>
#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"
#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
ę
.