انستیتو تحقیقات ماهیان

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

۲۳ اردیبهشت ۱۳۹۶

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


رجیسترهای USART :

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

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

رجیستر TXSTA :

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

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

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

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

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

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

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

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

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

رجیستر RCSTA :

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

SPEN : فعال سازی USART

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

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

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

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

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

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

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

محاسبه Baud Rate :

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

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

به عنوان مثال در فرکانس ۲۰MHz ، با نوشتن عدد ۲۵۵ در رجیستر SPBRG مطابق جدول اول در حالت صفر بودن BRGH ، مقدار Baud rate بر روی ۱٫۲Kbit/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();

مثال :

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

#include<pic16f877a.h>
#define SBIT_TXEN     ۵
#define SBIT_SPEN     ۷
#define SBIT_CREN     ۴
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