Elektronik / Mikrodenetleyici Projeleri/

MSP430 ve UART Denemesi

Ne zamandır MSP430 ile ilgili bir uygulama yapmıyordum bu yüzden bugün biraz kafamı diğer işlerden uzaklaştırmak ve notlarımı düzenlemek için MSP430’un UART kısmına göz atmaya karar verdim.

Fakat ilk hevesle baktığım bu çevre birimini, MSP430’un datasheet’inden anlamak gerçekten zor. Sanırım bu yüzdendir ki sitesinde her mikrodenetleyici ile ilgili ufak tefek onca kod parçacığı var. Ben de bu kodları inceleyerek bu birimi çözmeyi başardım ve MSP430F2112 ile simülasyonu yaptım.

MSP430 UART Birimi

Bu denememde kullandığım MSP430 için kullanmamız gereken USCI_Ax modülünün UART modunun şemasını aşağıdan görebilirsiniz. Yine aşağıdaki şemadan görebileceğiniz üzere bu birim IrDA için de ayrılmış özelliklere sahip olsa da biz bu uygulamamızda bu noktaya değinmeyeceğiz.

MSP430_UART

Yukarıdaki şekle tekrar bakarsak öncelikli olarak belirlememiz gereken kısım, UART birimi için gerekli olan saat kaynağımızdır. Bu kaynak UCA0CTL1 registerinden ayarlanabilir. Ben uygulamada bu kaynağı SMCLK olarak belirledim ve yapmamız gerekenleri aşağıya şöyle sıraladım.

1) UCA0CTL1‘dan parity, data ve stop bitleri gibi bilgiler belirlenir.
2) (SMCLK Frekansı/Baud Rate) formülünden çıkan sayının 15-8. bitleri UCA0BR1, 7-0. bitleri UCA0BR0 registerlerine yüklenerek baudrate ayarlanır.
3) UCA0MCTL registeri ile tam çıkmayan sonuçlarda oluşabilecek hataları engellemek için hata düzeltme değeri buraya girilir.

Örneğin SMCLK frekansımı 1Mhz, baudrate değerimiz 9600 olursa 1M/9600=104,16.. şeklinde çıkar. Burada ondalıklı kısmın ilk değeri 1’i alırsak modülasyon değerimiz UCA0MCTL=UCBRS0 olur. UCBRS0 değeri UCBRS0..UCBRS7’ye kadar gitmektedir ve değerler binary şekildedir. Örneğin SMCLK frekansımız 32khz olduğunda bu değer 32k/9600=3.33 çıkar. Buradan ondalığın ilk değeri 3 çıkar ve UCA0MCTL=UCBRS1+UCBRS0 şeklinde tanımlanır. Ayrıca hata düzeltilmesi yapılmadan da UART birimi çalışabilmektedir, fakat profesyonel uygulamalarda bu tercih edilmez.
4) Bunları yaptıktan sonra UCA0CTL1 registerindenin 0. biti temizlenmelidir. Bu bit temizlenmez ise UART birimi resette kalır ve birim çalışamaz.

5) Son olarak bilgi almak için UCA0RXBUF ve göndermek için ise UCA0TXBUF registerlerini kullanabilirsiniz. Ayrıca alım ve gönderim FIFO’larının boş olup olmadıklarını ise sırasıyla IFG2 registerinin 0. ve 1. bitlerinden kontrol edebilirsiniz.

Registerlerin daha ayrıntılı kullanımları için kullandığınız MSP430’un datasheet’ine bakabilirsiniz. Yukarıda saydıklarımızı bir kütüphane haline getirirsek UART.h ve UART.c aşağıdaki gibi olmaktadır.

UART.h

#define CLK  			16000000  // SMCLK değeri
#define UART0_BAUD_RATE  	19200	  // Baudrate
#define UART0_WORD_LENGTH  	0	  // 1: 7bit, 0:8bit
#define UART0_STOP_BIT  	0	  // 0: Stop bit=1, 1: Stop bit=2/1.5
#define UART0_PARITY  		0	  // 0: Parity yok, 1: Parity var
#define UART0_PARITY_SEL  	0	  // 0: Odd, 1: Event

extern void uart_init(void);
extern void uart_putch(unsigned char c);
extern char uart_getch(void);
extern void uart_string(const char *st);

UART.c

#include "msp430.h"
#include "UART.h"

void uart_init(void)
{
  UCA0CTL0=0x00;                      // UART mode, asenkron
  UCA0CTL0=(UART0_PARITY < < 7)|(UART0_PARITY_SEL << 6)|(UART0_WORD_LENGTH << 4)|(UART0_STOP_BIT << 3);

  UCA0CTL1 |= UCSSEL_2;               // SMCLK
  UCA0BR1=(CLK/UART0_BAUD_RATE)/256;  // Baudrate hesaplanıyor
  UCA0BR0=(CLK/UART0_BAUD_RATE)%256;

  UCA0MCTL = UCBRS0;                  // Bu baud hesabına göre değişebilir
  UCA0CTL1 &= 0xFE;                   // Software reset kaldırılıyor
}

void uart_putch(unsigned char c)
{
  while(!(IFG2 & 0x02));		// Transmit gönderim FIFO'su boş mu?
    UCA0TXBUF=c;
}

char uart_getch(void)
{
  while(!(IFG2 & 0x01));		// Receive alım FIFO'su boş mu?
    return UCA0RXBUF;
}

void uart_string(const char *st)
{
  while(*st)
    uart_putch(*st++);
}

Görüldüğü üzere UART kütüphanesi oldukça sadedir. Aşağıda ise örnek için kullandığım kodları görebilirsiniz.

#include "msp430.h"
#include "uart.h"

void main( void )
{
    WDTCTL  = WDTPW + WDTHOLD;
    BCSCTL1 = CALBC1_16MHZ;   // Kristal 16MHz'e ayarlanıyor
    DCOCTL  = CALDCO_16MHZ;

    P3SEL = 0x30;             // P3.4 ve P3.5 UART için yönlendirildi
    P3DIR = 0xFF;

    uart_init();
    uart_string("Hello World\r\n");
    uart_string("www.FxDev.org");

    for(;;)
      uart_putch(uart_getch()); // Echo yaptırılıyor
}

Uygulamanın çalışan simülasyonunu da aşağıdaki resimden (tıklarsanız büyür) görebilirsiniz.

MSP430-Uygulama

Yukarıdaki uygulama görüldüğü üzere yazılım kontrollüdür ve amatörcedir. Bu uygulamaya daha fazla işlev katmak için kesmeleri kullanırsak kodumuz aşağıdaki gibi olmaktadır.

#include "msp430.h"
#include "uart.h"

volatile unsigned char i=0;
 
void main( void )
{
    WDTCTL  = WDTPW + WDTHOLD;
    BCSCTL1 = CALBC1_16MHZ;       // Kristal 16MHz'e ayarlanıyor
    DCOCTL  = CALDCO_16MHZ;
    
    P1SEL = 0x00;
    P1DIR = 0xFF;
    P1OUT = 0x00;
    P3SEL = 0x30;                 // P3.4 ve P3.5 UART için yönlendirildi
    P3DIR = 0xFF;

    uart_init();
    uart_string("Hello World\r\n");
    uart_string("www.FxDev.org");
  
    IE2 |= UCA0RXIE + UCA0TXIE ;  // Alım ve gönderim kesmeleri aktif
    
    _EINT();                      // Kesmeler açılıyor             
}

// Gönderim kesmesi
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
   while(!(IFG2 & 0x01));                 // Receive alım FIFO'su boş mu?
    P1OUT = i++;
}

// Alım kesmesi
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
    while(!(IFG2 & 0x02));		// Transmit gönderim FIFO'su boş mu?
      UCA0TXBUF=UCA0RXBUF;
}

Yukarıdaki kodlara dikkat edilirse gönderim kesmesinde her bir karakter için P1'deki çıkışlar binary olarak aktif edilmektedir.

Yazımı bitirmeden önce MSP430'ların 3.3V gerilim ile çalıştıkları için MAX232 entegresi kullanılamayacaklarını belirtmek isterim. Bu iş için ya kendiniz step-up özellikli bir devre tasarlamalı ya da piyasada 3.3V için özelleştirilmiş MAX3232 entegresini MSP430 uygulamalarınız için kullanabilirsiniz. Bu uygulama ile ilgili tüm dosyalar: MSP430 ve UART Denemesi

Dosya indirme LINK listesi (TXT formatında) link-21515.zip şifre-pass: 320volt.com

Herkese çalışmalarında başarılar dilerim ;)

  1. İbrahim YILDIZ 2013/05/17
  2. Orhan 2013/05/17
  3. A. Tahir 2013/05/17
  4. FxDev 2013/05/17
  5. A. Tahir 2013/05/17
  6. FxDev 2013/05/17
  7. serap 2013/05/17
  8. FxDev 2013/05/17
  9. omer 2013/05/17

Yorum

Soru: