آموزش رابط سریال USART قسمت ۱۲

همان طور که می دانید رابط سریال USART یکی از پر کاربردترین سیستم های ارتباطی AVR با دنیای بیرون می باشد و کاربرد زیادی از قبیل ارتباط با رایانه ارتباط با سایر میکرو ها و همچنین ارتباط و راه اندازی سایر ماژولها دارد

در این بخش به راه اندازی این رابط ارتباطی و ارتباط آن با سایر میکرو کنترلر ها خواهیم پرداخت

قبل از فعال سازی پورت سریال باید آن را تنظیم کرده سپس فعال کنیم تنظیمات عبارت است از سرعت انتقال (Baud Rate) ، قالب داده ها(۵،۶،۷،۸،۹ بیتی) ، حالت سنکرون و آسنکرون و آسنکرون با سرعت دو برابر ، حالت مستر و …

واحد USART دارای ۵ رجیستر به صورت زیر است که به توضیح آنان می پردازیم:

 

۱-رجیستر UDR: این رجیستر رجیستر دریافت و ارسال داده می باشد و یک رجیستر هشت بیتی است بدین صورت که زمانی که اطلاعات دریافت می گردد در این رجیستر ذخیره می گردد و قابل خواند است و زمانی که بخواهیم اطلاعاتی را ارسال کنیم در این رجیستر خواهیم نوشت تا میکرو اقدام به ارسال آن نماید.

 

 

۲-رجیستر UCSRA:

این رجستر بیشتر برای کنترل وضعیت پورت سریال کاربرد دارد.

UCSRA

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

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

بیت UDRE یا بیت خالی بودن بافر این بیت زمانی که بافر ارسال آماده نوشتن باشد فعال می باشد

بیت FE یا خطای فریم این بیت زمانی که در فریم دریافتی اشکالی وجود داشته باشد یک خواهد شد(همیشه این بیت زمان نوشتن در رجیستر UCSRA باید صفر کرد)

بیت DOR زمانی فعال می شود که بافر دریافت پر شده و اطلاعات جدید وارد این بافر شود که در این حالت اطلاعات جدید از بین رفته و این بیت یک می شود و تا زمانی که اطلاعات از بافر خوانده نشود یک باقی خواهد ماند (همیشه این بیت زمان نوشتن در رجیستر UCSRA باید صفر کرد)

بیت PE یا خطای توازن این بیت زمانی یک خواهد بود که خطای توازن در داده دریافتی رخ دهد.

بیت U2X یا دو برابر کننده سرعت ارسال با یک کردن این بیت سرعت ارسال دو برابر خواهد شد و فقط در حالت آسنکرون مورد استفاده قرار می گیرد و در حالت سنکرون باید صفر باشد.

بیت MPCM  این حالت ارتباط شبکه ای بین میکرو ها را فعال می کند.

از دو بیت آخر این رجیستر(U2XوMPCM) استفاده چندانی نمی شود(البته خودم تا حالا استفاده نکردم)

 

 

۳-رجیستر UCSRB:

UCSRB

بیت RXCIE با یک کردن این بیت وقفه دریافت فعال شده و زمانی که داده ای دریافت شد به زیر برنامه مورد نظر پرش خواهیم کرد

بیت TXCIE با یک کردن این بیت وقفه ارسال فعال شده و زمانی که داده ای ارسال شد به زیر برنامه مورد نظر پرش خواهیم کرد

بیت UDRIE با یک کردن این بیت وقفه خالی بود رجیستر داده (UDRE در رجیستر قبل) فعال خواهد شد

بیت RXEN یا بیت فعال کننده دریافت

بیت TXEN یا بیت فعال کننده ارسال

بیت UCSZ2 این بیت به همراه دوبیت دیگر در یک رجیستر دیگر قالب داده را مشخص می کند که بعدا توضیح داده خواهد شد

بیت RXB8 این بیت زمانی که از قالب ۹ بیتی استفاده کنیم بیت نهم دریافتی در این بیت ذخیره شده و قابل خواندن است و باید قبل از خواندن هشت بیت دیگر در UDR این بیت خوانده شد

بیت TXB8 این بیت زمانی قابل استفاده می باشد که از قالب نه بیتی استفاده کنیم و برای ارسال بیت نهم کاربرد دارد و باید برای ارسال بیت نهم اول بیت نهم در این بیت نوشته شود سپس هشت بیت دیگر و در رجیستر UDR نوشته شود

 

 

۴-رجیستر UCSRC:

قبل توضیح بیت های این رجیستر باید توجه داشت که طبق گفته های دیتاشیت آدرس I/O این رجیستر با رجیستر UBRRH یکسان میباشد و برای این که بتوان این رجیستر را تنظیم کرد باید بیت آخر این رجیستر (URSEL یا همان بیت انتخاب رجیستر) را یک کرد پس در هر حالت برای تنظیم رجیستر UCSRC باید اول URSEL را یک کنیم.

بیت UMSEL یا بیت انتخاب مد کاری اگر این بیت یک باشد مد کاری سنکرون(همزمان) و اگر صفر باشد USART در حالت آسنکرون(غیر همزمان) کار خواهد کرد.

بیت UPM0 و UPM1 یا بیت تعین مود توازن این بیت تعیین میکند که واحد ارسال بیت توازن زوج را تولید کند یا فرد را که طبق جدول زیر تنظیم میشود با فعال کردن بیت توازن طبق جدول زیر واحد گیرنده اگر خطایی در توازن رخ دهد بیت PE در رجیستر UCSRA که قبلا گفته شد یک خواهد شد

طبق جدول زیر :حالت اول غیر فعال حالت دوم تعریف نشده حالت سوم توازن زوج حالت چهارم توازن فرد

UPM

بیت USBS یا بیت انتخاب تعداد بیت پایانی این بیت تعین میکند که Stopbit چند بیت باشد که اگر این بیت یک باشد دو stopbit ارسال خواهد شد و اگر صفر باشد یک stopbit ارسال خواهد شد.

بیت های UCSZ1,0 یا بیت های تعیین سایز کارکتر این بیت ها سایز کارکتر را طبق جدول زیر تعیین میکند توجه داشته باشد بیت UCSZ2 در رجیستر قبلی یعنی UCSRB قرار دارد

ucsz

بیت UCPOL این بیت در حالت سنکرون کاربرد داشته و تعین میکند که ار لبه بالا رونده یا پایین رونده نمونه برداری شود.

 

 

۵-تنظیم نرخ انتقال یا BAUD RATE:

ubrr

 

رجیستر UBRR یک رجیستر شانزده بیتی است که از دو رجیستر به نام UBRRH و UBRRL تشکیل شده طبق گقته دیتاشیت میکرو رجیستر UBRRH با رجیستر دیگری بنام UCSRC دارای آدرس یکسانی در فضای I/O هستند(همان طور که در قسمت قبل گفته شد) و به همین خاطر برای تنظیم این رجیستر همان طور که در شکل بالا مشاهده میکنید بیت URSEL در نظر گرفته شده وقتی این بیت صفرباشد رجیستر UBRRH را می توان تنظیم کرد و زمانی که یک باشد رجیستر UCSRC تنظیم خواهد شد.پس در اینجا بیت آخر UBRRH را صفر در نظر خواهیم گرفت.

برای تنطیم باود ریت باید بیت های ۰ الی ۱۱ ریجستر فوق را مقدار دهی کنیم

فرمول بدست آوردن باود ریت:

ubrr-formola

باود ریت های استاندارد برای پروتکل سریال عبارتند از ۱۲۰۰ ، ۲۴۰۰ ، ۴۸۰۰ ، ۹۶۰۰ ، ۱۹۲۰۰ ، ۳۸۴۰۰ ، ۵۷۶۰۰ ، ۱۱۵۲۰۰ ….

 

بطور مثال برای تعیین باودریت ۹۶۰۰ و با فرکانس ۸مگا هرتز میکرو  UBBR بصورتت زیر خواهد بود :

UBRR=(8000000/(16*9600))-1=51.08

عدد ۵۱٫۰۸ را روند کرده و عدد ۵۱ را در UBRR قرار می دهیم همچنین باید توجه داشته باشیم که خطای مجاز باید کم تر از ۲+- درصد باشد پس با قرار دادن UBRR جدید ذر فرمول بالا بادریت جدید را با بادریت مورد نظر مقایسه کرده و خطا را بدست می آوریم:

(این فرمول همان فرمول بالا می باشد)BuadRate=Foc/16*(UBRR+1)

BuadRate=8000000/16*(51+1)=9615.38

(فرمول خطا)Erorr=((new BuadRate/Buadrate)-1)*100

error=((9615.38/9600)-1)*100

error=0.16%

همان طور که مشاهده کردید خطای بدست آمده کمتر از یک درصد است پس عدد ۵۱ برای UBRR قابل قبول است عدد ۵۱ را به دو قسمت ۸ بیتی تبدیل کرده و قسمت کم ارزش را در UBRRL و قسمت پرارزش را در UBRRH می نویسیم در اینجا چون عدد ۵۱ خود کمتر از ۸ بیت است پس  UBRRH=0 و UBRRL=51 خواهد شد

(در صورتی که UBRR بزرگتر از ۲۵۵ باشد بیشتر از ۸ بیت بوده و میتوان به دوقسمت تبدیل کرد)

دانلود نرم افزار کمکی آندروید برای محاسبه UBRR برای باودریت میکرو

UBRRCalcAndroid

وبسایت کمکی برای محاسبه UBRR

حال با یک مثال به برنامه ریزی و راه اندازی پورت سریال خواهیم پرداخت:

پیش فرض ها: مگا۳۲ فرکانس ۸ مگا هرتز باودریت ۹۶۰۰ بدون توازن با یک Stopbit و سایز ۸بیتی  مود آسنکرون(این تنظیمات معمولا تنظیمات پیشفرض سیستم های رایانه ای می باشد )

پس برای مد ۸ بیتی باید UCSZ0=1 و UCSZ1=1 و UCSZ2=0 باشد

و بیت توازن غیر فعال UPM0=0 و UPM1=0 و سایز StopBit یک بیت باشد USBS=0

ومد آسنکرون UMSEL=0

و بادریت را هم محاسبه کردیم و عدد ۵۱ بدست آمده پس UBRRH=0 و UBRRL=51 ویا بصورت هگر UBRRH=0x00 و UBRRL=0x33

و همچنین ارسال و دریافت را فعال می کنیم TXEN=1 و RXEN=1

وهمچنین توجه دادشته باشید هنگام تنظیم رجیستر UCSRC طبق گفته های بالا(به علت یکسان بودن آدرس دو رجیستر) مقدار URSEL=1 باشد

پس کد بصورت زیر است:

نحوه ارسال اطلاعات : با استفاده از فایل کتابخانه ای stdio.h براحتی و بدون نیاز به چک کردن رجیستر ها و نوشتن در آنها میتوانیم اطلاعات را ارسال کنیم:

تابع putchar : این تابع می تواند یک کارکتر را به پورت سریال ارسال کند

تابع puts : این تابع می تواند چند کارکتر را که در یک متغییر ذخیره شده را ارسال کند

تابع putf : این تابع می تواند چند کارکتر را که در یک فلش ذخیره شده را ارسال کند

تابع printf : این تابع می تواند یک رشته متنی را فرمت دهی کرده و ارسال کند

تابع sprintf: این تابع میتواند یک رشته متنی را فرمت دهی کند و در یک متغیر ذخیره کند این تابع اطلاعات را ارسال نمیکند(قبلا با این تابع در بحث نمایشگر ها آشنا شده ایم)

مثال:

خروجی برنامه فوق در پروتئوس:

test1

دریافت اطلاعات از پورت سریال:

تابع scanf برنامه را تازمانی که از پورت سریال اطلاعات دریافت نکند متوقف می کند و اگر اطلاعات را دریافت کند در متغییر مورد نظر ذخیره کرده و ادامه می دهد اطلاعات دریافتی حتما باید دارای کارکتر اینتر یا اسپیس در انتهای خود باشد

همان طور که در برنامه بالا میبینید برنامه منتظر میماند تا اطلاعاتی دریافت کنید و سپس همان اطلاعات کمی تغییر داده و دوباره ارسال میکند

خروجی بصورت زیر است فایل پروژه را دانلود و اجرا کرده و خود خروجی را تست کنید:

test2

مثال آخر ارتباط دو میکرو و کنترل یک ال ای دی:در این مثال یک میکرو دستور روشن شدن و خاموش شدن را ارسال میکند و میکرو گیرنده دستورات را چک کرده و اجرا می کند میکروی فرمان دهنده دستورات روشن خاموش را از طریق فشردن دو کلید ارسال خواهد کرد:

میکروی فرمان دهنده:

میکروی گیرنده:

خروجی:

sender-receiver

دانلود کل پروژه هالینک کمکی (رمز فایل فشرده آدرس سایت با حروف کوچک می باشدwww.agd.ir)

در قسمت بعدی آموزش به ارتباط میکرو با رایانه و راه اندازی وقفه ها خواهیم پرداخت برای آموزش بعدی قطعه زیر که یک مبدل USB به سریال است را نیاز داریم تا براحتی بتوانیم میکرو را به رایانه متصل کنیم:

usb-ttl-adpt_1-500x500

این ماژول را از فروشگاه زیر میتوانید تهیه کنید(فروشگاه زیر هیچ ربطی به این سایت نداشته و فقط جهت اطلاع از امکانات این ماژول و قیمت لینک داده شده)

ماژول مبدل USB به TTL

 

13 دیدگاه در “آموزش رابط سریال USART قسمت ۱۲

  1. سلام..بابت اموزشاتون ممنون..فقط ی سوال داشتم..در مثال تست ۱ چرا فقط یک بار خروجی را در محیط ویرچال ترمینال نشون میده (اونم ی تعداد کاراکتر سی) ینی دفعه بعد که اجرا میکنی هیچی نشون نمیده..

  2. با سلام و ممنون از آموزشهای خوبتون
    میخواستم بدونم چطور میشه در برنامه میکرو کاری کرد که میکرو برای گرفتن فرمان از طریق پورت سریال برنامه اش متوقف نشه و کار خودش رو بکنه و فقط وقتی اطلاعاتی از پورت سریال رسید اون اطلاعات رو دریافت کنه ؟
    ممنون

  3. سلام دوستان یه سوال .من یه دیتا رو ینی دمای محیط رو به صورت عدد تنها میفرستم پشت سرم ولی توی pc یه سری عدد ۴بیتی مثلا ۵ تا ۴ بیتی میاد .و هر چقد هم که دما بالا پایین میره اون عدده بدون تغییر میاد .مشکل کجاست گیج شدم واقعا

  4. با سلامممنون از مطلب بسیار عالیتون
    من میخواهم با استفاده از avr یک فرستنده ir درست کنم که led رو بر روی پورت tx خاموش و روشن کنم و اطلاعات از این طریق منتقل بشن ولی گیرنده من در فرکانس ۳۸khz کار میکنه میخواستم بدونم همین اطلاعاتی که بصورت ۰ و ۱ از پایه tx بیرون میاد رو چجوری باید مدیریت کنم تا با فرکانس گیرنده هماهنگ بشه و بتونم از طریق گیرنده نور فرا بنفش رو دریافت کنم؟
    گیرنده ir من TSOP1738 هستش
    اگر تنها یک راهنمایی فرمایید که از چه طریق میتونم این عمل رو کنترل کنم ممنون میشم لازم به توضیح نیست خودم سرچ میکنم.
    با تشکر

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

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