راه اندازی واحد 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 استفاده نمود.

مطلب پیشنهادی:  آشنایی با میکروکنترلرهای PIC

راه اندازی واحد 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);
 }
 }

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

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    

دیدگاهتان را بنویسید

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

4 دیدگاه

  1. سلام
    یک برنامه ال ای دی چشمک زن برای میکرو کنترلر pic18f4520 نوشتم، برنامه درست هستش فقط یک مشکلی که هستش میکرو شروع به کار نمیکنه.
    وقتی پایه Vdd یا Vss یا هر دو را با انگشتهام نگه میدارم و لمس میکنم کار میکنه و وقتی دستم رو بر میدارم دوباره از کار میافته.

    ممنون میشم اگه جوابم رو بدید.