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

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

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

رجیسترهای USART

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

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

رجیستر TXSTA

راه اندازی واحد USART میکروکنترلرهای PIC
راه اندازی واحد USART میکروکنترلرهای PIC
  • CSRC : انتخاب منبع کلاک در حالت سنکرون
  • TX9 : فعال سازی ارسال 9 بیتی
  • TXEN  : فعال سازی واحد ارسال
  • SYNC : انتخاب مد عملکرد : 1= آسنکرون ، 0=سنکرون
  • BRGH : انتخاب مد سرعت : 1= پرسرعت ، 0 = کم سرعت
  • TRMT : بیت نشان دهنده وضعیت ارسال : 1=ارسال کامل ، 0 = ارسال نشده
  • OERR : نشان دهنده خطای اجرای مجدد
  • TX9D : بیت نهم بافر ارسال

رجیستر RCSTA

راه اندازی واحد USART میکروکنترلرهای PIC
راه اندازی واحد USART میکروکنترلرهای PIC
  • SPEN : فعال سازی USART
  • RX9 : فعال سازی دریافت 9 بیتی
  • SREN : فعال سازی دریافت یکباره (در حالت سنکرون)
  • CREN : فعال سازی دریافت پی در پی در حالت آسنکرون
  • ADDEN : فعال ساز تشخیص آدرس و وقفه دریافت در حالت آسنکرون 9 بیتی
  • FERR : نشان دهنده خطای فریم
  • OERR : نشان دهنده خطای اجرای مجدد
  • RX9D : بیت نهم بافر دریافت

محاسبه Baud Rate

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

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

 

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

 

منبع:  میکرودیزاینرالکترونیک

 

مطلب قبلیآموزش جانمایی، مسیریابی و سیم کشی قطعات در آلتیوم دیزاینر
مطلب بعدیساختمان یا استراکچر (struct) در زبان برنامه نویسی C

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید