آموزش میکروکنترلر AVRمیکروکنترلرهمه ی مطالب

آموزش AVR: ارتباط سریال AVR (قسمت1)

در این پست با ارتباط سریال  AVR آشنا می شین این پست در واقع پیش نیاز قسمت سوم راه اندازی ماژول بلوتوث HC-05 است که بعد از این پست منتشر می شود.  در این پست به طور مفصل در مورد ارتباط سریال بحث می شه و شاید فکر کنید که راه اندازی ارتباط سریال سخت هستش ولی در آخر همین پست چند کد قرار داده می شود در حد 10 سطر که تقریبا تمام نیاز هاتون رو برطرف می کنه استفاده از ارتباط سریال خیلی راحت و سر راست است به وسیله ی کد هایی که در ادامه می آید پس پست رو تا آخر بخونین.

آشنایی با مفهوم USART در ارتباط سریال

Universal synchronous and A synchronous serial reviser and transmitter

فرستنده – گیرنده سریال عمومی هم زمان و غیر هم زمان

USART وسیله ای است که امکان برقراری ارتباط سریال Full-Duplex (دو طرفه) به صورت هم زمان و غیر هم زمان را بین دو وسیله فراهم می کند. وظیفه اصلی USART تبدیل داده موازی و سریال و برعکس است. در طرف فرستندهUSART یک بایت را به صورت موازی دریافت کرده و بیت های آن را طبق یک الگوی مشخص بیت به بیت ارسال می کند. در طرف گیرنده USART دیگری وجود دارد که بیت ها را دریافت کرده و آن ها را تبدیل به حالت موازی می کند.

قالب داده در ارتباط سریال:

ارتباط سریال در AVR

بیت شروع:

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

بیت های داده:

بیت های داده می تواند بین 5 تا 9 متغییر باشد و انتخاب تعداد با کاربر است. اطلاعات کاربر دراین بیت ها ارسال می شود.

بیت توازن:

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

بیت یابیت های پایان:

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

مفهوم Baud Rate:

Baud rate عرض هر بیت را مشخص می کند دو طرف ارتباط باید از عرض هربیت اطلاع داشته باشند. اگر در یک ارتباط سریال baud rate برابر 9600bps ( (bite per secondباشد. به این معنی است که فرستنده باید 9600 بیت را در یک ثانیه ارسال کند.

در این صورت عرض هر بیت برابر می شود با :

Tbit=1/baud rate= 1/9600 = 104 us

USART در میکروکنترلر ATmega32:

USART شامل دو بخش مجزای فرستنده و گیرنده است. که هر کدام دارای یک شیفت ریجیستر می باشند. در بخش ارسال داده به شکل موازی از ریجستر UDR به شیفت ریجستر منقل شده و پس از اعمال بیت شروع بیت توازن و غیره بیت به بیت از پایه ی TXD به بیرون شیفت داده می شود. در قسمت دریافت نیز داده ی سریال از پین RXD دریافت شده وارد بافر USART می شود. و پس از آن به ریجیستر UDR منقل می شود.

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

 رجیسترهای ارتباط سریال AVR

رجیستر UDR :

UDR

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

رجیستر UCSRA :

UCSRA

بیت 0 – MPCM:

با یک کردن این بیت میکروکنترلر به حالت ارتباط چند پردازنده ای می رود. زمانی که این بیت یک باشد در این حالت فریم های دریافت شده توسط واحد دریافت کننده USART که شامل اطلاعات آدرس نیستند صرفنظر می شود و این فریم ها در بافر قرار نمی گیرند. به عبارتی دیگر در اتصال چند میکروکنترلر به صورت سریال این مد کاربرد دارد.

بیت1 – U2X :

این بیت فقط در عملکرد آسنکرون کاربرد دارد و باید در حالت سنکرون در این بیت صفر نوشت. با نوشتن یک منطقی در این بیت تقسیم فرکانسی برای تولید نرخ انتقال داده از 05 به 2 تبدیل شده و در نتیجه نسبت نرخ انتقال داده 2 برابر حالت سنکرون می شود.

 بیت 2 -PE :

زمانی که در قالب کاراکتر دریافتی خطای توازن رخ دهد این بیت یک خواهد شد و تا زمانی معتبر است که رجیستر UDR خوانده نشده باشد. موقع مقدار دهی رجیستر UCSRA باید در این بیت صفر نوشت.

 بیت 3- DOR:

اگر این بیت یک گردد به این معنی است که بافر دریافت پر شده و اگر کاراکتر جدیدی به شیفت رجیستر وارد، و یا بیت شروع جدیدی تشخیص داده شود اطلاعات جدید از بین می رود و یک خطا بنام Data Over Run به وجود می آید. موقع مقدار دهی به رجیستر UCSRA باید این بیت را صفر کنیم.

بیت 4 – FE :

اگر این بیت یک شود نشان دهنده بروز مشکل در قالب داده دریافتی است. مثلا اگر بیت Stop کاراکتر بعدی صفر باشد این بیت یک می گردد و تا زمانی معتبر است که رجیستر UDR خوانده نشده باشد. موقع مقدار دهی به رجیستر USCRA باید در این بیت صفر نوشت.

بیت 5- UDRE :

این پرچم نشان دهنده آمادگی بافر ارسال دیتا UDR می باشد. به عبارت دیگر یک شدن این بیت نشان دهنده خالی بودن بافر برای پذیرش داده جدید است. در صورت فعال بودن وقفه خالی بودن رجیستر دیتا، یک شدن این پرچم می تواند تولید وقفه کند.

بیت6 – TXC :

زمانی که داده های سریال به بیرون شیفت رجیستر انتقال می یابند و داده جدیدی برای ارسال موجود نباشد این بیت یک می گردد و در صورت فعال بودن وقفه ارسال، می تواند یک وقفه کامل شدن ارسال ایجاد نماید.

بیت7 – RXC :

زمانی که دیتای دریافتی در بافر دریافت UDR موجود باشد و این بافر خوانده نشده باشد این بیت یک می گردد و در صورت فعال بودن وقفه دریافت، می تواند یک وقفه کامل ایجاد نماید.

رجیستر UCSRB :

UCSRB

بیت 0 – TXB8 :

وقتی که داده فریم ارسالی را 7 بیتی انتخاب کنیم این بیت به عنوان بیت نهم داده ارسالی در نظر گرفته می شود. دقت کنید در این حالت باید قبل از نوشتن 2 بیت در رجیستر UDR ، بیت نهم را بنویسید.

بیت 1 – RXB8 :

وقتی که داده فریم دریافتی را 7 بیتی انتخاب کنیم این بیت به عنوان بیت نهم داده دریافتی در نظر گرفته می شود. دقت کنید در این حالت باید قبل از خواندن 2 بیت در رجیستر UDR ، بیت نهم را بخوانید.

 بیت 2 – UCSZ2 :

ترکیب این بیت به همراه بیت های UCSZ0:1 واقع در رجیستر UCSRC تعداد بیت های دیتا در فریم سریال(اندازه کاراکتر)در حالت دریافت و ارسال را تعیین می کنند.

  بیت3 – TXEN :

با یک کردن این بیت ارسال کننده USART فعال می گردد و عملکرد عادی پایه PD1 قطع شده و نقش دوم آن فعال می گردد.

بیت 4- RXEN :

با یک کردن این بیت دریافت کننده USART فعال می گردد و عملکرد عادی پایه PD0 قطع شده و نقش دوم آن فعال می گردد. در صورت غیرفعال بودن این بیت، پرچم های FE, DOR و PE نامعتبر خواهد بود.

بیت 5 – UDRIE :

با یک کردن این بیت وقفه خالی بودن رجیستر UDR فعال می گردد و به شرطی که وقفه کلی باشد و پرچم  UDRIE واقع در رجیستر UCSRA فعال گردد، وقفه خالی بودن رجیستر UDR اجرا می گردد.

بیت6 – TXCIE :

با یک کردن این بیت وقفه کامل شدن ارسال فعال می گردد و در صورتی که وقفه سراسری فعال باشد و پرچم TXC در رجیستر UCSRA یک شده باشد، وقفه کامل شدن ارسال، اجرا می شود.

  بیت 7 – RXCIE :

با یک کردن این بیت وقفه کامل شدن دریافت فعال می گردد و در صورتی که وقفه سراسری فعال باشد و پرچم RXC در رجیستر UCSRA یک شده باشد، وقفه کامل شدن دریافت، اجرا خواهد شد.

رجیستر UCSRC :

UCSRC

  بیت0 – UCPOL :

این بیت در مد ارتباط سریال سنکرون استفاده می شود. در این مد در حالت فرستنده پالس همزمانی بر روی پایه خروجی XCK ارسال می گردد و در حالت دریافت پالس همزمان کننده از پایه XCK دریافت می گردد. اگر این بیت صفر باشد نمونه برداری از دیتای دریافتی با لبه پایین رونده و تغییر دیتای ارسال در لبه بالا رونده پالس XCK صورت می گیرد و اگر این بیت را یک کنیم این حالت معکوس می شود.

بیت  1و2 – UCSZ0:1 :

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

bit set up

  بیت3 – USBS :

این بیت تعداد بیت های Stop را برای فرستنده تعیین می کند و تاثیری در حالت گیرنده ندارد. اگر این بیت را صفر کنیم یک بیت Stop و اگر یک کنیم دو بیت Stop ارسال می گردد.

  بیت 4و 5 – UPM0:1 :

توسط این دو بیت می توان بیت توازن ارسالی را توسط ارسال کننده تعیین کرد. به طور اتوماتیک ارسال کننده بیت توازن را به همراه دیتا ارسال می کند و به همین ترتیب گیرنده می تواند بعد از دریافت دیتا بیت توازن را تشخیص دهد و در صورت بروز مشکل پرچم PE را فعال کند.

بیت6 – UMSEL :

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

بیت7 – URSEL :

این بیت برای انتخاب دسترسی به یکی از رجیسترهای UCSRC یا UBRRH به کار می رود. برای دسترسی به رجیستر UCSRC باید در این بیت یک نوشته شود.

رجیستر UBRR :

UBBR

توسط این ریجیستر baud rate ارتباط سریال تنظیم می شود همان طور که می بینید این ریجیستر 16 بیت دارد و برای مقدار دهی به آن باید UBRRL و UBBRH مقداردهی شود.

در جدول پایین نحوه ی محاسبه ی مقدار UBRR برای تنظیم مقدار baud rate  آمده است.

baud rate

کریستال هایی که می توان با استفاده از آن ها به خطای baud rate صفر رسید 1.8432 ، 3.6864 ، 7.3728 ، 11.0592 ، 14.7456 و 16 مگاهرتز می باشند. در دیتاشیت قطعات AVR می توان لیست برخی از Baud rate ای متداول و مقادیر مربوط به آن ها را پیدا کنید. جدول پایین نیز از دیتاشیت در اینجا قرار داده شده است.

example boud rate

 

نمونه کد برای اه اندازی ارتباط سریال AVR:

#include <mega32.h>
#include <stdio.h>
char a[];
void main(void)
{
DDRA=0x00;
DDRC=0xff;
PORTC=0x00;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

while (1)
      {
       scanf("%s",a);
       printf("resive= %s\n",a);

      }
}

ویدیوی آموزش ارتباط سریال:

در این ویدیو با نحوه تنظیم ریجیستر ها با code vizard آشنا و برنامه نوشته شده در بالا بر روی میکروکنترلر پروگرم شده و تست می شود.

 

 

 

علی عزتی

علی عزتی هستم. رشته ی مهندسی برق الکترونیک رو خوندم. علاقه ی من به یادگیری و به اشتراک گذاشتن چیز هایی که یاد گرفتم. باعث شد تا الکترولب ایجاد بشه. علاقه ی زیادی به الکترونیک دارم. و دوست دارم چیزهای جدید یادبگیرم و بسازم ... :))

نوشته های مشابه

34 دیدگاه

  1. سلام
    لطفا در مورد وقفه usart توضیح دهید. من تنضیمات رو از کد ویزارد انجام دادم و rx interrupt رو فعال کردم ولی فقط یک بار اطلاعات دریافت میکنه و برای بار دوم به بعد اطلاعات دریافت نمی کنه

    تشکر فراوان

    1. سلام
      من تا حالا با rx interrupt کار نکردم اگه می تونید کدتون رو بفرستید تا نگاه کنم. ایمیل رو هم به ایمیل تون می فرستم تا کد رو واسم بفرستید.

  2. سلام تشکر
    مشکلم حل شد
    مشکل این بود که برنامه رو دستور scanf میموند تا زمانی که اطلاعات از پایه RX دریافت بشه . با استفاده از وقفه و دستور if این مشکل حل شد
    اگر توضیح کاملتر خواستید بگید تا بیشتر توضیح بدم
    تشکر

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

  3. سلام
    روچشم
    با استفاده از کدویزارد بعد از انتخاب کردن گزینه receiver گزینه rx interrup ظاهر شده که با انتخاب این گزینه وقفه RX فعال میشود و کد ها توسط کد ویزارد تولید میشود .
    در کد های تولید شده یک متغییر تعریف شده از نوع bit به نام rx_counter که وقتی اطلاعات به پایه rx میرسه 1 میشه و به کمک دستور if میکرو دیگر رو دستور scanf یا getchar توقف نمی کند
    مثل دستور زیر
    if(rx_counter) scanf(“%s”,d) /*n

    n*/ رو حذف کنید میخواستم دستور کامل بشه

  4. سلام
    من خیلی از مطالب وبلاگتون استفاده کردم و ممنون
    من ماژول بلوتوث رو به راحتی تونستم با دیدن پستای شما راه اندازی کنم
    اما ارتباط سریال بین کامپیوتر و میکرو نتوستم برقرار کنم
    سوالی که دارم اینه که اگر کریستال 11.0592 نباشه و 16 باشه این ارتباط برقرار نمیشه ؟
    من کدویزارمو با کریستال 16 نوشتم و با 16 هم مدارو بستم ولی جواب نگرفنتم:(

    1. سلام خوشحالم که مطالب وبلاگ به دردتون خورده در مورد ارتباط سریال نکته ای هست که باید درصد خطا کمتر از 2 درصد باشه با کریستال 11.0592 مگاهرتز خطای ارتباط سریال صفر میشه نکته ای دیگه که رعایتش واجبه باید زمین مبدل سریال با زمین مدار میکرو یکسان باشه. و با کریستال 16 مگا هم نباید مشکلی باشه برای تنظیم رجیستر های یاود ریت از جدول هایی که در دیتاشیت mega 32 هست می تونید استفاده کنید این جدول ها در صفحه 165 دیتاشیت وجود داره

      1. خیلی ممنون بررسی میکنم امیدوارم درست شه!
        البته زمین مدارم یکی بود و ازون نظر مشکل نداشت .

  5. UCSRC=0x86;
    این رجیستر در همه حال برای من به این شکل تولید میشه ولی چیزی که شما نوشتید به صورت UCSRC=0x06;
    تفاوتش چیه ؟ چرا کد ویزارد اونطوری تولید میکنه؟
    توضیحات رجیسترارو خوندم ولی سر درنیاوردم

    1. بیت urcsel در بین دو رجیستر UCSRC و UBRRH مشترک است. اگر این بیت رو در رجیستر UCSRC یک کنیم می تونیم اطلاعات رو در این رجیستر ذخیره کنیم و اگر بخواهیم رجیستر UBRRH رو تغییر بدهیم باید این بیت رو در این رجیستر 1 کنیم. و گرنه تغییرات ذخیره نمی شود. درستش 0x86 هست ولی کدویزارد اشتباهی برای من 0x06 رو تولید کرده و شما همون 0x86 استفاده بکنید من تصحیح می کنم کد رو

  6. من برنامه رو تصحیح کردم و همچنین کریستال 11.0592 هم تهیه کردم ولی بازم جواب نمیگیرم
    پورت سریالم با ماژول به راحتی ارتباط برقرار میکنه اما با میکرو نه ! من چیزی به ذهنم نمیرسه 🙁
    شما تو فیلم آموزشی پین دو تا دستور اسکن و پرینت دیلی هم گذاشتید مقدارش چقدره ؟ بدون تاخیر کار نمیکنه ؟من 1000 میلی ثانیه گذاشتم.

    1. من فکر میکنم میکروم ی مشکلی داره
      من یه بار برنامه برای تایمر نوشتم و میکرو کار میکرد یک بار هم همین برنامه رو زمانی نوشتم که ارتباط سریال هم تو کدویزارد لحاظ شده بود اما اینبار کلا دیگه میکرو هیچکاری برام انجام نمیداد
      میدونید مشکل از کجاست؟

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

    1. من از نرم افزار progisp استفاده می کنم و امکانی داره که انتخاب میکنی تنظیمات فیوز بیت رو قبلا فیوز بیت رو در پست های قبلی توضیح دادم جستوجو کنید پیداش می کنید تو سایت

  8. با عرض سلام

    من مراحل مربوط به سریال رو به درستی انجام دادم.
    در پروتئوس هم نتیجه گرفتم.
    در عمل هم نتیجه گرفتم!
    وقتی میکرو ها رو با پورت سریال به کامپیورت متصل میکنم، اون چیزهای که می خواستم رو انجام میده!
    اما مشکلی که پیش اومده این هست که میکرو دیگه قابل پروگرام نیست!
    تا الان سه تا از میکروهام اینطور شده و دیگه نمیشه پروگرامشون کرد!
    راهنمایی بفرمایید

    1. سلام
      پرورگرم نشدن میکرو میتونه دلالیل مختلف باشه که من چند تا از اونا رو اینجا میگم و شما چک کن:
      1- کلاک میکرو رو روی چیزی به غیر از کلاک داخلی میکرو تنظیم کنید. در این صورت اگر مثلا روی کریستال خارجی تنظیم شه باید هنگام پروگرم کردن کریستال نیز به میکرو وصل بشه و در صورت وصل نبودن پروگرم نمیشه
      2- در تنظیمات فیوزبیت SPI رو غیر فعال کننید که در این صورت تقریبا راهی برای برگرداندن میکرونیست
      3- میکرو کلا بسوزه و قابل استفاده نشه چون میگین کار میکنه پس این گزینه هم منتفی هستش

  9. سلام
    خسته نباشید

    آیا این طبیعه که بعد از فعال کردن tx , rx نمیشه از پول آپ یا هر نوع input استفاده کرد؟
    بار ها تلاش کردم و متوجه شدم فقط بعد از فعال کردن rx مشکل پیش میاد!
    پروژه رو آپلود کردم لطفا راهنمایی بفرمایید
    proteus بهمراه atmel studio
    https://www.mediafire.com/?lkqnyj256mifyj5
    توضیح مختصر:
    مرحله 1:با ارسال کارکتر 1 ازطریق ویرچوال ترمینال پورت b.0 روشن وبا ارسال کارکتر 0 پورت b خاموش میشه.
    مرحله 2:با فشار دادن کلید پول آپ در پورت c.0 کلمه ی pop به ترمینال اسال میشه.
    مرحله دو بعد از فعال کردن rx انجام نمیشه!

  10. سلام خیلی ممنون از آموزش خوبتون
    من می خواستم دو تا میکرو رو به روش سریال به میکرو وصل کنم و از طریق کامپیوتر به هردو تا میکرو فرمان بدم
    مثلا میکروی اول led یک رو روشن کنه (یه دستور ساده )
    ولی نمیدونم چه جوری میتونم یه آدرس خاص به هر کدوم از میکرو ها تخصیص بدم .
    و همین طور با هایپر ترمینال چه جوری دستورشو بنویسم.

    ممنون میشم اگه کمکم کنید.

    1. سلام
      من منظور شما رو متوجه نشدم یعنی می خواهید با 1 پورت سریال 2 میکروکنترلر رو کنترل کنید؟

  11. سلام
    منظورم اینه که دو تا میکرو که به صورت slave به هم وصل شدن رو میخوام به کامپیوتر وصل کنم. و کامپیوتر در واقع master باشه.
    حالا نمیدونم چه جوری توی هایپر ترمینال میکروها رو انتخاب کنم.
    یعنی آدرس هر میکرو رو چه جوری تعیین کنم. تا دستوری رو که مینویسم فقط یکی از میکرو ها انجام بده.
    کامپیوتر transmitter باشه و میکروها فقط receiver باشن.
    ممنون

    1. من مطمئن نیسم که بشه یا نه ولی می تونید به یک میکرو وصل بشید و بقیه میکروهاتون رو با اون میکرو از طریق SPI کنترل کنید

  12. دمتون گرم خیلی حال کردم من حمید هستم مقیم آمریکا من هم علاقه دارم چیزهایی یاد بگیرم دنبال روش استفاده از سنسور حرارتی تک وزیر بودم که با سایت شما برخورد کردم
    بیایید با تلگرام در ارتباط باشیم
    شماره من +12019260801

    1. Id تلگرام من در پایین سایت هست کاری داشتید میتوانید با این id در تماس باشید

  13. با سلام
    ببخشید توی میکروهای که دوتا usart دارن مثل مگا ۶۴ به بالا چطور میشه توی بیسکام این را پیاده کرد همه فعال سازی ها با تابع است ؟؟؟؟؟؟؟؟؟!!!

  14. با سلام
    میخاستم بدونم که بهتره در قسمت usart قسمت rxintrupt و txintrupt فعال بشود یا نه؟
    حالا اگر فعال کردیم چجوری میتونیم از اطلاعات موجود در بافر گیرنده استفاده کنیم ؟
    الان میخام اطلاعات دریافتی از یک ماژول را برش بدهم و وقسمت هایی از اون رو بردارم ولی متأسفانه نمیدونم چجوری باید به اطلاعات داخل بافر دسترسی پیدا کنم.

  15. سلام من ارتباط بین میکرو و کامپیوتر م برقراری ولی هر دیتایی ارسال میکنم علامت سوال داخل کامپیوترم میاد باید چیکار کنم

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

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

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