راه اندازی واحد USART میکروکنترلرهای PIC

میکروکنترلرهای PIC مشابه میکروکنترلرهای AVR یا ARM دارای واحد داخلی USART در دو مد سنکرون و آسنکرون می باشند. در این آموزش واحد آسنکرون یا غیر همزمان (UART) میکروکنترلر PIC16F877A  را بررسی و راه اندازی می کنیم.


رجیسترهای USART :

رجیسترهای مرتبط با واحد USART عبارت اند از :

TXSTA : رجیسترهای کنترل وضعیت ارسال
RCSTA : رجیسترهای کنترل وضعیت دریافت
SPBRG : تنظیم Baudrate
TXREG : رجیستر ارسال داده USART
RCREG : رجیستر دریافت داده USART

رجیستر TXSTA :

راه اندازی واحد USART میکروکنترلرهای PIC

CSRC : انتخاب منبع کلاک در حالت سنکرون

TX9 : فعال سازی ارسال 9 بیتی

TXEN  : فعال سازی واحد ارسال

SYNC : انتخاب مد عملکرد : 1= آسنکرون ، 0=سنکرون

BRGH : انتخاب مد سرعت : 1= پرسرعت ، 0 = کم سرعت

TRMT : بیت نشان دهنده وضعیت ارسال : 1=ارسال کامل ، 0 = ارسال نشده

OERR : نشان دهنده خطای اجرای مجدد

TX9D : بیت نهم بافر ارسال

رجیستر RCSTA :

راه اندازی واحد USART میکروکنترلرهای PIC

SPEN : فعال سازی USART

RX9 : فعال سازی دریافت 9 بیتی

SREN : فعال سازی دریافت یکباره (در حالت سنکرون)

CREN : فعال سازی دریافت پی در پی در حالت آسنکرون

ADDEN : فعال ساز تشخیص آدرس و وقفه دریافت در حالت آسنکرون 9 بیتی

FERR : نشان دهنده خطای فریم

OERR : نشان دهنده خطای اجرای مجدد

RX9D : بیت نهم بافر دریافت

محاسبه Baud Rate :

در ارتباط USATR باید هر دو طرف ارتباط از Baudrate مشابه استفاده کنند. برای تنظیم مقدار Baudrate از رجیستر 8 بیتی SPBRG استفاده می شود. برای این منظور میتوان از جدول زیر برای مقداردهی به رجیستر SPBRG استفاده نمود.

حتما در ادامه این مطلب را هم بخوانید:  برنامه نویسی پورت سریال در متلب قسمت پنجم(تست عملی)

راه اندازی واحد USART میکروکنترلرهای PIC

به عنوان مثال در فرکانس 20MHz ، با نوشتن عدد 255 در رجیستر SPBRG مطابق جدول اول در حالت صفر بودن BRGH ، مقدار Baud rate بر روی 1.2Kbit/s تنظیم می شود.


ارسال یک کاراکتر
:

از تابع زیر برای ارسال یک کاراکتر استفاده می شود.

void UART_TxChar(char ch)
{
while(TXIF==0);
TXIF=0;
TXREG=ch;
}

به عنوان مثال برای ارسال کاراکتر M :

UART_TXChar(‘M’);


دریافت یک کاراکتر :

از تابع زیر برای دریافت یک کاراکتر استفاده می شود.

char UART_RxChar()
{
while(RCIF==0);
RCIF=0;
return(RCREG);
}

به عنوان مثال برای دریافت یک کاراکتر و ذخیره سازی در متغیر str :

str = UART_RxChar();

مثال :

در کد زیر، با مقدار فرکانس کلاک 20MHz و Baud rate برابر 9600 ، عبارت Melec.ir را از طریق خروجی سریال میکروکنترلر ارسال می کنیم. همچنین در صورت دریافت یک کاراکتر، همان کاراکتر را به خروجی سریال ارسال می کنیم.

#include<pic16f877a.h>
#define SBIT_TXEN     5
#define SBIT_SPEN     7
#define SBIT_CREN     4
void UART_Init(int baudRate)
{
TRISC=0x80;
TXSTA=(1<<SBIT_TXEN);
RCSTA=(1<<SBIT_SPEN) | (1<<SBIT_CREN);
SPBRG = (20000000UL/(long)(64UL*baudRate))-1;      // baud rate @20Mhz Clock
}
void UART_TxChar(char ch)
{
while(TXIF==0);
TXIF=0;
TXREG=ch;
}
char UART_RxChar()
{
while(RCIF==0);
RCIF=0;
return(RCREG);
}
int main()
{
char i,a[]={“Melec.ir “};
char ch;
UART_Init(9600);
for(i=0;a[i]!=0;i++)
{
UART_TxChar(a[i]);
}
while(1)
{
ch = UART_RxChar();
UART_TxChar(ch);
}
}

امیدوارم این مطلب آموزشی برایتان مفید باشد.

منبع : exploreembedded

این نوشته را با دوستانتان در تلگرام به اشتراک بگذارید :
⁩لینک گروه پرسش و پاسخ مهندسان الکترونیک   http://bit.ly/2oLHpZM

درباره ی محمد حسین کوهی قمصری

دانشجوی برق گرایش الکترونیک، کارشناسی

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

7 − 3 =