Wydział Informatyki Katedra Systemów Czasu Rzeczywistego Laboratorium Architektury Komputerów |
Data 15.12.2009 |
Ćwiczenie nr 6 Temat: Uart Zespół nr 2 1. Robert Jarocki Grupa nr 6 2. Jarosław Jastrzębski |
Prowadzący …...................... Ocena …...................... |
Zadanie:
Napisać program wyświetlający na wyświetlaczu msp430 znaki wprowadzana za pomocą klawiatury komputera.
Teoria:
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, właczamy 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;
addres bit (address-bit mode);
1, 1.5 lub 2 bity stopu.
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:
Schemat układu:
Kod programu:
#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
int i=0;
int di=0;
int si=0;
int ti=0;
int x=0;
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 2400 Budoów
_EINT(); // włączenie przerwań
while(1)
{
while(high != low) // gdy odebrano dane
{
if(i%16==0) SEND_CMD(DD_RAM_ADDR2);
if(i%32==0)
{
clearDisplay();
SEND_CMD(DD_RAM_ADDR);
}
putc(Bufor[low]); // wypisanie danych na wyświetlaczu
low= (++low)%30; // inkrementowanie znaczika początka danych
i++;
x++;
if(x>=9)
{
di++;
x=0;
}
if(di>=9)
{
si++;
di=0;
}
if(si>=9)
{
ti++;
si=0;
}
if(ti>0) UartCharTransmit(ti+48);
if(si>0) UartCharTransmit(si+48);
if(di>0) UartCharTransmit(di+48);
UartCharTransmit(x+48);
UartCharTransmit(' ');
}
}
}
#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
}
void initPortyUart(void)
{
P3SEL |= Tx + Rx;
P3DIR |= Tx;
P3DIR &= ~ Rx;
}
void initUart( int Speed)
{
int i;
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL 8MHz
do
{
IFG1 &= ~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 ++);
}