میکروکنترلرهای PIC مشابه میکروکنترلرهای AVR یا ARM دارای واحد داخلی USART در دو مد سنکرون و آسنکرون میباشند. در این آموزش واحد آسنکرون یا غیر همزمان (UART) میکروکنترلر PIC16F877A را بررسی و راه اندازی میکنیم.
رجیسترهای USART
رجیسترهای مرتبط با واحد USART عبارت اند از:
- TXSTA : رجیسترهای کنترل وضعیت ارسال
RCSTA : رجیسترهای کنترل وضعیت دریافت
SPBRG : تنظیم Baudrate
TXREG : رجیستر ارسال داده USART
RCREG : رجیستر دریافت داده USART
رجیستر TXSTA
- CSRC : انتخاب منبع کلاک در حالت سنکرون
- TX9 : فعال سازی ارسال 9 بیتی
- TXEN : فعال سازی واحد ارسال
- SYNC : انتخاب مد عملکرد : 1= آسنکرون ، 0=سنکرون
- BRGH : انتخاب مد سرعت : 1= پرسرعت ، 0 = کم سرعت
- TRMT : بیت نشان دهنده وضعیت ارسال : 1=ارسال کامل ، 0 = ارسال نشده
- OERR : نشان دهنده خطای اجرای مجدد
- TX9D : بیت نهم بافر ارسال
رجیستر RCSTA
- SPEN : فعال سازی USART
- RX9 : فعال سازی دریافت 9 بیتی
- SREN : فعال سازی دریافت یکباره (در حالت سنکرون)
- CREN : فعال سازی دریافت پی در پی در حالت آسنکرون
- ADDEN : فعال ساز تشخیص آدرس و وقفه دریافت در حالت آسنکرون 9 بیتی
- FERR : نشان دهنده خطای فریم
- OERR : نشان دهنده خطای اجرای مجدد
- RX9D : بیت نهم بافر دریافت
محاسبه Baud Rate
در ارتباط USATR باید هر دو طرف ارتباط از Baudrate مشابه استفاده کنند. برای تنظیم مقدار Baudrate از رجیستر 8 بیتی SPBRG استفاده میشود. برای این منظور میتوان از جدول زیر برای مقداردهی به رجیستر SPBRG استفاده نمود.
به عنوان مثال در فرکانس 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); } }
امیدوارم این مطلب آموزشی برایتان مفید باشد.
منبع: میکرودیزاینرالکترونیک