میکروکنترلرهای 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); } }
امیدوارم این مطلب آموزشی برایتان مفید باشد.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام
یک برنامه ال ای دی چشمک زن برای میکرو کنترلر pic18f4520 نوشتم، برنامه درست هستش فقط یک مشکلی که هستش میکرو شروع به کار نمیکنه.
وقتی پایه Vdd یا Vss یا هر دو را با انگشتهام نگه میدارم و لمس میکنم کار میکنه و وقتی دستم رو بر میدارم دوباره از کار میافته.
ممنون میشم اگه جوابم رو بدید.
سلام ، احتمالا یک قسمتی از سیم کشی مدار را درست انجام نمیدید ، به شماتیک های نمونه دقت کنید و همچنین دقت کنید زمین مدارتون هم وصل باشه.
باید پایه ی ریست به ۵ ولت وصل باشه و به پایه های osc هم کریستال و خازن وصل کنی.
سلام.
به احتمال زیاد فیوز بیت ها رو درست تنظیم نکردین إ