راه اندازی سریال (USART) در AVR کدویژن

میکروکنترلر AVR راه های ارتباطی زیادی از جمله USART , SPI , TWI , USI و USB دارد که هر کدام کاربرد خاص خود را دارند.

امروز ما میخوایم رابط ارتباطی USART رو مورد بررسی و آموزش قرار بدیم.

سریال در لغت به معنی پشت سر هم , ما دو نوع کلی روش ارتباطی داریم یکی سریال و یکی دیگه موازی , در ورش موازی معمولا برای هر بیت یک سیم در نظر گرفته میشه مثلا اگه بخوایم یک بایت رو ارسال کنیم باید از 8 سیم استفاده کنیم. اما در روش سریال انتقال داده توسط 1 سیم انجام میشه , مثلا اگه داده‌ها در قالب یک بایت باشن، برای انتقال هر بایت، بیت‌ها با ترتیب و قالب مشخصی بر روی سیم قرار می‌گیرن.

parallel and serial

سریال USART در AVR:

انتقال داده داخل AVR به سه روش میتونه باشه:

1- یک طرفه

در این روش دیتا فقط ارسال یا دریاف میشود.

2- تمام دوطرفه

در این روش دیتا در هر زمانی هم میتونه ارسال و هم دریافت بشه.

3- نیمه دوطرفه

در این روش دیتا در زمان مشخص میتونه ارسال یا دریافت بشه.

usart serial method

پین های USART در ATMEGA16:

atmega 16 usart

رجیستر های USART در AVR:

1-UDR

2.UCSRA

3.UCSRB

4.UCSRC

5.UBRR

در USART پنج رجیستر وجود داره که به اونا میپردازیم.

اولین رجیستر رجیستر UDR که مخفف USART DATA REGISTER این رجیستر یه رجیستر 8 بیتی که دیتای ارسالی و دریافتی یوزارت داخلش ذخیره میشه.

برای مثال:

;’UDA=’1

دستور بالا کاراکتر ‘1’ رو ارسال میکنه

رجیستر بعدی UCSR که مخفف USART Control and Status Register این رجیستر برای کنترل و تنظیمات یوزارت که از سه بخش UCSRA , UCSRB , UCSRC تشکیل شده و دستورات مهمش رو میگیم.

UCSRA:

UCSRA

بیت RXC: این بیت پرچم دریافت اطلاعات , یعنی هر وقت داده ای دریافت بشه این بیت 1 میشه.

بیت TXC: وقتی داده ای ارسال میشه این بیت 1 میشه.

بیت UDRE: این بیت وضعیت پر بودن یا خالی بودن بافر رو نشون میده.

بیت FE: اگه خطایی در دریافت یا ارسال اطلاعات بوجود بیاد این بیت 1 میشه.

بیت U2X: این بیت سرعت انتقال داده رو دوبرابر میکنه.

UCSRB:

UCSRB

بیت RXCIE: با 1 شدن این بیت وقفه دریافت فعال میشه.

بیت TXCIE: با 1 شدن این بیت وقفه ارسال فعال میشه.

بیت RXEN: این بیت گیرنده ارتباط سریال رو فعال میکنه.

مثال:

;UCSRB=0b00010000

بیت TXEN: این بیت فرستنده ارتباط سریال رو فعال میکنه.

مثال:

;UCSRB=0b00001000

UCSRC:

UCSRC

بیت URSEL: برای تنظیم رجیستر UCSRC این بیت رو باید 1 کنیم.

بیت UMSEL: این بیت مد ارتباط سریال رو مشخص میکنه , اگه بیت 1 باشه میره روی مد سنکرون و اگه 0 باشه آسنکرون.

بیت های UCSZ2 و UCSZ1 و UCSZ0: این بیت ها برای تایین سایز کاراکتر ها هستن.

نکته: بیت UCSZ2 در رجیستر UCSRB قرار داره.

UCSZ

رجیستر UBRR:

رجیستر UBRR که مخفف (USART BUAD RATE REGISTER) برای تنظیم سرعت ارسال اطلاعات استفاده میشه که به اصلاح به اون (Baud Rate) میگن , رجیستن UBRR یه رجیستر 16 بیتی که از دو رجیستر UBRRL و UBRRH تشکیل شده.

UBRR

بیت های 0 تا 11: تو این بیت ها اعدادی متناسب با باود ریت نوشته میشه که از فرمول زیر بدست میان.

Buad rate

باود ریت: 1200 , 2400 , 4800 , 9600 , 19200 , 38400 , 57600 , 115200

مثال: مقدار UBRR با فرکانس 8 مگاهرتز و باود ریت 9600 را محاسبه کنید:

UBRR 9600

حالا عدد بدست اومده رو رند و اونو به باینری تبدیل کنید و داخل رجیستر UBRR قرار بدید.

9600 Baut Rate

;UBRRH=0b00000000

;UBRRL=0b00110011

خیلی خوب دیگه فکر کنم توضیحات کافیه بهتره بریم سراغ برنامه نویسی در محیط کدویژن.

مثال1: برنامه ای بنویسید که در میکرو اول با زدن کلید یک کاراکتر ‘a’ و با زدن کلید دو کاراکتر ‘b’ رو ارسال کنه و در میکرو دوم اگر ‘a’ دریافت شد LED را روشن و اگر ‘b’ دریافت شد LED را خاموش کند.

USART in Proteus

کد مربوط به U1 (فرستنده):

#include <mega8.h>           // تعریف میکروکنترولر مگا 8
#include <delay.h>              // تعریف تابع تاخیر

void main(void)                    // باز کردن حلقه برنامه اصلی
{

UCSRA=0b00000000;          
UCSRB=0b00001000;           // فعال سازی مود فرستنده یوزارت
UCSRC=0b10000110;           // تنظیم کردن سایز کاراکتر های ارسالی و دریافتی به 8 بیت

UBRRH=0b00000000;          // تنظیم باودریت به 9600
UBRRL=0b00110011;           // تنظیم باودریت به 9600

DDRB.0=0;                            // تعریف پین 0 پورت B به عنوان ورودی (کلید شماره 1)
DDRB.1=0;                             // تعریف پین 1 پورت B به عوان ورودی (کلید شماره 2)

while (1)          // باز کردن حلقه تکرار
    {

    if(PINB.0==0)         // اگر پین 0 پورت B صفر شد (اگر کلید شماره 1 زده شد)
    {
    delay_ms(30);         // یک تاخیر 30 میلی ثانیه برای حذف لرزش کلید (Debounce)
    UDR='a';                 // کاراکتر 'a' را ارسال کن
    }

    if(PINB.1==0)         // اگر پین 1 پورت B صفر شد (اگر کلید شماره 2 زده شد)
    {
    delay_ms(30);         // یک تاخیر 30 میلی ثانیه برای حذف لرزش کلید (Debounce)
    UDR='b';                 // کاراکتر 'b' را ارسال کن
    }
}
}

کد مربوط به U2 (گیرنده):

#include <mega8.h>
#include <delay.h>

void main(void)
{

int d;      //تعریف متغیر d

UCSRA=0b00000000;
UCSRB=0b00010000;          //فعال سازی مود گیرنده یوزارت
UCSRC=0b10000110;

UBRRH=0b00000000;
UBRRL=0b00110011;

DDRB.0=1;           // تعریف پین 0 پورت B به عنوان خروجی (LED)

while (1)
{
  d=UDR;                 // خواندن یوزارت و دادن آن به متغیر d
  delay_ms(1);

    if(d=='a')            // اگر دیتای دریافتی کاراکتر 'a' بود
    {
    PORTB.0=1;        // ال ای دی را روشن کن
    }

    if(d=='b')            // اگر دیتای دریافتی کاراکتر 'b' بود
    {
    PORTB.0=0;         // ال ای دی را خاموش کن
    }
}
}

نکته: فرکانس میکرو را روی 8 مگاهرتز قرار بدید …. نیازی به استفاده از کدویزارد نیست

دستور های مهم در یوزارت:

UDR

با استفاده از این دستور میتوانید کاراکتر مورد نظر را ارسال کنید.

مثال: کاراکتر ‘a’ را ارسال کن

;’UDR=’a


()getchar

این دستور منتظر میماند تا دیتایی دریافت شود تا آن را بخواند.

مثال: دیتای دریافتی را دریافت کن و در متغیر a بریز

;()a=getcher


()putsf

با این دستور میتوانید یک رشته ارسال کنید.

مثال: کلمه “PCBdl.ir” را ارسال کنید

;putsf(“PCBdl.ir”)


()puts

توسط این دستور میتوانید یک آرایه را ارسال کنید

مثال:

;{‘P’ , ‘C’ , ‘B’ , ‘d’ , ‘l’}=[]unsigned char i

;puts(i)

3.5 4 رای ها
رأی دهی به مقاله
اشتراک در
اطلاع از
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها

ورود به PCBdl

کاربر جدید هستید؟

عضویت

قبلا ثبت نام کرده اید؟

برای خرید باید وارد شوید

کاربر جدید هستید؟