ارتباط سریال در AVR (جلسه ۱۷)

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

  • توضیحات
  • کدنویسی
  • شبیه سازی

منظور ما از انتقال داده، ارسال اطلاعات از یک میکروکنترلر به یک میکروکنترلر دیگر و یا به یک کامپوتر و همچنین از کامپوتر به یک میکروکنترلر می باشد.شما با خواندن این پست آشنایی مختصری در مورد انواع روشهای انتقال داده و همچنین اصول ارتباط سریال و انواع آن در میکروکنترلر avr کسب می کنید.سپس ارتباط سریال با uart به صورت مفصل در AVR توضیح داده خواهد شد.

دو روش کلی برای انتقال داده مابین میکروپروسسورها وجود دارد

۱- انتقال داده به روش موازی

معمولا در این روش به ازای هر بیت یک سیم برای انتقال وجود دارد.به عنوان مثال اگر هر داده در قالب یک بایت باشد برای انتقال آن از ۸ سیم استفاده می شود.و یا اینکه در دو نوبت ۴ بیتی روی ۴ سیم داده منتقل می شود.سرعت انتقال اطلاعات در این روش نسبت به انتقال به روش سریال بالاتر است زیرا در واحد زمان تعداد بیت های بیشتری تبادل می شوند.از این روش برای انتقال اطلاعات از کامپیوتر به وسایل جانبی که در فاصله نزدیکی از کامپیوتر قرار دارند استفاده می شود زیرا با طولانی شدن مسیر و به خاطر تعداد زیاد سیم ها در صد خطا در اثر نویز و تغییر شکل پالس ها به خاطر افزایش ظرفیت خازنی سیمهایی که در مجاور هم هستند بیشتر می شود.پس برای انتقال داده در فواصل طولانی(بیش از یک یا دو متر) انتقال موازی روش مناسبی نیست.

۲-انتقال داده به روش سریال

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

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

در این پست در مورد روش استفاده از USART برای انتقال داده در تراشه های avr توضیحاتی داده خواهد شد.

انتقال داده به صورت سریال با USART در AVR

ارتباط سریال از دو روش همزمان و غیر همزمان برای انتقال داده استفاده می کند.در روش همزمان در هر لحظه یک بلوک داده منتقل می شود در حالی که در روش غیرهمزمان در هر لحظه یک بایت تبادل می شود.نوشتن برنامه هایی که هر یک از این دو روش را استفاده کند امکانپذیر است اما ممکن است برنامه ها طولانی و خسته کننده شوند.برای همین ترشه های IC خاصی برای ارتباطات سریال توسط سازندگان زیادی با عنوان (UART(universal asynchronous receiver-transmitter و (USART(universal synchronous-asynchronous receiver-transmitterتولید می شود.AVR یک USART داخلی دارد که در مورد آن توضیح داده خواهد شد.

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

۱-یک طرفه:

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

۲- نیمه دوطرفه:

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

۳-تمام دو طرفه:

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

Slide1

انتقال سریال همزمان به طور گسترده ای برای ارسال های کاراکتری مورد استفاده قرار می گیرد.در حالی که برای انتقال بلوکی داده ها از روش همزمان استفاده می شود.در روش غیر همزمان هر کاراکتر داده در میان بیت آغاز و پایان قرارداده می شود.به این کار قالب بندی گفته می شود.بیت آغاز همیشه یک بیت صفر است و بیت پایان که می تواند یک یا دو بیت باشد همیشه یک است.شکل زیر نموته ای از قالب بندی را برای ارسال کد اسکی کاراکتر A نشان می دهد.(کد اسکی کاراکتر A عدد دودویی ۰۱۰۰۰۰۰۱ می باشد).

ارتباط سریال هنگامی که هیچ انتقالی صورت نمیگیرد، سیگنال یک است که به آن نشانه می گویند.به سیگنال صفر نیز فاصله می گویند.انتقال با بیت آغاز و به دنبال آن d0 شروع گشته و بعد بقیه بیت ها تا d7 و بالاخره یک بیت پایان که نشان دهنده پایان کاراکتر A است، ارسال می شود.

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

نرخ انتقال داده

سرعت انتقال داده در ارتباط سریال برحسب bps (بیت بر ثانیه) بیان می شود.یک اصطلاح پر استفاده دیگر برای bps عبارت نرخ انتقال(baud rate) است.نرخ انتقال از اصطلاحات مودم است و به عنوان تعداد تغیرات سیگنال در ثانیه تعریف می شود.در مودم ها مواردی وجود دارد که تنها یک تغییر در سیگنال، موجب انتقال چندین بیت داده می گردد.اما وقتی سیم رسانا مورد نظر است، نرخ انتقال و bps یکسان هستند و به همین دلیل  اصطلاحات bps و نرخ انتقال را به جای هم به کار می بریم. برای انتقال داده به روش سریال مابین دو دستگاه باید توجه داشته باشیم که از لحاظ سرعت انتقال داده با یکدیگر هماهنگ باشند.

پایه های RX و TX در ATMEGA32

توضیحات در مورد ارتباط سریال در این پست بر مبنای میکروکنترل ATMEGA32 میباشد. در ATMEGA32 دو پایه به طور خاص برای ارسال و دریافت داده سریال به کار می روند.این دو پایه TXD و RXDنامیده شده و بخشی از گروه پورت D در بسته بندی ۴۰ پایه است. داده هایی که ارسال می شوند از طریق پایه TXD ارسال می شوند و داده هایی که دریافت می شوند از طریق پایه RXD وارد می شوند.

Slide1

در میکروکنترلر avr پنج ثبات به usart اختصاص دارد که عبارتند از:

۱- (UDR(USART DATA REGISTER

۲-(UCSRA(USART CONTROL STATUS REGISTER A

۳-(UCSRA(USART CONTROL STATUS REGISTER B

۴-(UCSRA(USART CONTROL STATUS REGISTER C

۵-(UBRR(USART BUAD RATE REGISTER

در ادامه در مورد هر یک از ثبات های بالا و نحوه کار با آنها جهت تنطیمات ارتباط سریال توضیح خواهیم داد.

ثبات UBRR و نرخ انتقال در AVR

AVR داده ها را با نرخ های انتقال متفاوتی ارسال و دریافت می کند.نرخ انتقال در AVR قابل برنامه ریزی است.با داشتن فرکانس کریستال مقدار عددی که در UBRR ریخته می شود نرخ انتقال را مشخص می کند.فرمول زیر ارتباط بین مقداری که در این ثبات ریخته می شود و فرکانس کریستال(FOSC) را مشخص می کند.

 ((Desired baud rate=fosc/(16(X+1

در معادله بالا X مقداری است که بر روی UBRR ریخته می شود.مقدار X را می توانیم از طریق همین معادله و با مشخص کردن نرخ انتقال بدست بیاوریم.جدول زیر مقادیر X را برای نرخ های انتقال مختلف به شرط fosc=8MH نشان می دهد.

 Slide1

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

ثبات UBRR یک ثبات ۱۶ بیتی است ولی تنها ۱۲ بیت آن می تواند برای تنطیم نرخ انتقال استفاده شود.بیت ۱۵ این ثبات URSEL نام دارد که از آن برای دسترسی به ثبات های UBRRH و UCSRC استفاده می شود.بقیه بیت ها رزو شده اند.

Slide1

ثبات های UDR

در AVR برای داشتن ارتباط سریال دوطرفه دو ثبات جابه جایی ارسال و دریافت وجود دارد.هر ثبات جابه جایی مستقیم به یک بافر متصل شده است.این بافرها بافر ارسال داده و بافر دریافت داده نام دارند.این بافر ها آدرس I/O مشترکی دارند که ثبات داده (UDR) نامیده می شود.وقتی داده ای را بر روی UDR می نویسیم به بافر ثبات ارسال داده(TXB) منتقل می شود و وقتی داده ای را از UDR می خوانیم محتوای بافر ثبات دریافت داده(RXB) برگردانده می شود.

ثبات های UCSR

 این ثبات ها برای کنترل، تنظیم و بررسی وضعیت ارتباط سریال به کار می روند.در ادامه توضیح مختصری از نقش هر یک از بیت های این ثبات ها داده خواهد شد و بعد فرایندی از انتقال داده به روش سریال توضیح داده می شود.

ثبات UCSRA

 Slide1

بیت RXC:

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

بیت TXC:

هنگامی که تمام محتویات ثبات جابه جایی ارسال فرستاده شد و داده جدیدی در بافر ثبات ارسال داده(TXB) موجود نباشد این پرچم یک می شود.می توان این بیت را با نوشتن یک در محلش در ثبات پاک کرد.این بیت برای تولید وقفه تکمیل ارسال هم استفاده می شود.با اجرا شدن سرویس وقفه تکمیل ارسال، این بیت به طور اتوماتیک صفر می شود.

بیت UDRE:

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

بیت FE:

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

بیت DOR:

از این بیت جهت تشخیض لبریز شدن داده استفاده می شود.این بیت وقتی یک می شود که بافر دریافت داده و ثبات جابه جایی دریافت پر باشند و بیت شروع جدیدی دریافت شود.

 بیت PE:

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

بیت U2X:

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

بیت MPCM:

این بیت مد ارتباط چند پروسسوری را فعال می کند.توضیحات در مورد این مد در انتهای مطالب  بحث خواهد شد.

باید توجه داشته باشید که بیت های FE, DOR و PE تا وقتی اعتبار دارند که بیت های بافر دریافت داده (UDR) خوانده نشده باشند.در صورت عدم استفاده از این بیت ها باید هنگام نوشتن بر روی ثبات USCRA مقدار این بیت ها صفر شوند.

ثبات UCSRB 

Slide1

 بیت RXCIE:

برای فعال سازی وقفه پرچم RXC در UCSRA باید این بیت یک باشد.

بیت TXIE:

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

بیت UDRIE:

 برای فعال سازی وقفه پرچم UDR در UCSRA باید این بیت یک باشد.

بیت RXEN:

برای فعال سازی گیرنده USART باید این بیت یک باشد.

بیت TXEN:

برای فعال سازی فرستنده USART باید این بیت یک باشد.

بیت UCSZ2:

این بیت به همراه بیت های UCSZ1:0 که در ثبات UCSRC قرار دارند تعداد بیت های داده یا اندازه کارکتر را در یک فریم مشخص می کنند.

بیت RXB8:

هنگامی که اندازه داده  ۹ بیتی باشد، نهمین بیت از داده دریافت شده در این بیت قرار می گیرد.

بیت TXB8:

هنگامی که اندازه داده  ۹ بیتی باشد، نهمین بیت از داده ای که می خواهیم ارسال کنیم در این بیت قرار می گیرد.

ثبات UCSRC

Slide122

بیت URSEL:

به وسیله این بیت می توانیم مشخص کنیم که آیا به ثبات UCSRC دسترسی داشته باشیم یا UBRRH. برای در نظر گرفتن برخی ملاحظات تکنیکی این دو ثبات دارای آدرس I/O مشترکی هستند.هنگام استفاده از این خانه ها باید توجه خاصی داشته باشیم.این بیت کنترل می کند که کدام یک از این دو ثبات هدف عملیات نوشتن است.اگر URSEL در طول عملیات نوشتن صفر باشد، مقدار UBRRH به روز می شود.در غیر این صورت UCSRC به روز می شود.

بیت UMSEL:

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

بیت های UPM1:0:

این بیت ها نوع تولید و چک کردن بیت توازن را فعال یا غیرفعال کرده و آن را تنظیم می کند.

UPM0 UPM1 عملکرد
۰ ۰ غیرفعال
۱ ۰ ذخیره
۰ ۱ توازن زوج
۱ ۱ توازن فرد
بیت USBS:

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

بیت های UCSZ1:0:

این بیت ها در ترکیب با بیت USCZ2 از ثبات USCRB، اندازه کاراکتر در یک فریم را تعیین میکنند.

اندازه کاراکتر UCSZ0 UCSZ1 UCSZ2
۵ ۰ ۰ ۰
۶ ۱ ۰ ۰
۷ ۰ ۱ ۰
۸ ۱ ۱ ۰
۹ ۱ ۱ ۱
بیت USPOL:

این بیت برای مد همزمان به کار می رود.

قبل از شروع ارتباط سریال باید گیرنده یا فرستنده usart را با یک کردن بیت های RXEN برای (برای فعال سازی گیرنده) و TXEN (برای فعال سازی فرستنده)در ثبات UCSRB، فعال نماییم.بعد از آن باید مد عملیاتی را به وسیله بیت UMSEL از ثبات UCSRC مشخص کنیم که معمولا از مد غیر همزمان استفاده می کنیم.بنابراین برای استفاده از مد غیر همزمان این بیت باید صفر شود.باید توجه داشته باشیم که اندازه کاراکتر در ارسال کننده و دریافت کننده یکسان باشد در غیر این صورت انتقال داده با شکست مواجه خواهد شد.ما در این آموزش از سایز ۸ بیتی کاراکتر استفاده می کنیم.همچنین مد بیت توازن و تعداد بیت های پایانی از دیگر عواملی هستند که گیرنده و فرستنده باید قبل از شروع تبادل داده بر روی آن توافق داشته باشند. تنظیمات آنها باید در دستگاه هایی که قرار است تبادل انجام دهند  یکسان باشد.در این آموزش از بیت توازن استفاده نمی کنیم و تعداد بیت پایانی را هم یک در نظر می گیریم.اگر بخواهیم از داده ۹ بیتی استفاده کنیم باید از بیت های RXB8 و TXB8  در ثبات UCSRB به عنوان بیت نهم داده ای که در ثبات UDR قرار می دهیم استفاده کنیم.

فرایند ارسال داده به روش سریال

۱- مقدار ۰x08 را در ثبات UCSRB میرزیم.با این کار بیت TXEN یک میشود و USART در حالت فرستده فعال می شود.فرستنده هنگام فعال شدن عملیات عادی پورت را برای پایه TXD لغو و از آن برای انتقال سریال داده استفاده می کند.

۲-مقدار ۰X06 را در ثبات UCSRC میریزیم.با این کار فرستده در حالت مد غیر همزمان با فریم داده ۸ بیتی، بدون بیت توازن و یک بیت پایانی قرار می گیرد.

۳-ثبات UBRR با یکی از مقادیری که در جدول بالا ارائه شد پر می شود.البته برای استفاده از این جدول فرکانس کریستال باید ۸MH باشد.اگر بخواهیم از فرکانس های کاری دیگری استفاده کنیم باید از فرمولی که برای محاسبه نرخ انتقال داده شد استفاده کنیم.

۴-بعد از تنظیم نرخ انتقال بایت کاراکتری را که می خواهیم به صورت سریال ارسال کنیم در ثبات UDR قرار می دهیم.

۵-بیت UDRE از ثبات UCSRA را چک می کنیم تا از خالی شدن UDR پس از ارسال داده مطمئن شویم.با یک شدن این بیت ارسال داده انجام شده است.

۶-برای انتقال کاراکتر بعدی به مرحله ۴ می رویم.

با نظارت بر پرچم UDRE، از لبریز نشدن ثبات UDR مطمئن می شویم.اگر قبل از خالی شدن ثبات UDR بایت دیگری را در آن بنویسم داده قبلی از بین می رود.به دو روش می توانیم این بیت را چک کنیم.یک روش بررسی کردن مداوم این بیت توسط یک حلقه، تا زمانی که مقدار آن یک شود  و روش دیگر استفاده از وقفه مربوط به ارسال داده است.در روش استفاده از وقفه از اشتغال میکروکنترلر جهت بررسی مداوم این بیت جلوگیری می شود و تنها در هنگامی که بافر ارسال خالی شود بیت UDRE یک شده و CPU را وادار به رسیدگی سرویس وقفه تکمیل ارسال می کند. برای فعال کردن وقفه باید علاوه بر فعال کردن بیت وقفه عمومی در ثبات وضعیت، بیت فعال ساز وقفه تکمیل ارسال با نام UDRIE از ثبات UCSRB یک شود.

مثال۱:برنامه ای برای ATMEGA32 بنویسید که کاراکتر “F” را به صورت سریال و با نرخ انتقال ۹۶۰۰ در فرکانس کریستال ۸MH به صورت پیوسته  و بدون استفاده از وقفه ارسال کند. (جواب مثال در زبانه مربوط به کد آمده است)

مثال۲:در برنامه مثال بالا  از وقفه خالی بودن بافر ارسال استفاده شود.(جواب مثال در زبانه مربوط به کد آمده است)

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

۱- مقدار ۰X10 را در ثبات UCSRB می ریزیم.با این کار بیت RXEN را یک می کند و USART را در حالت گیرنده فعال می کند.همچنین عملیات عادی پورت را برای پایه RXD لغو کرده و آن را برای انتقال سریال داده استفاده می کند.

۲- مقدار ۰X06 را در ثبات UCSRC می ریزیم.با این کار USART در حالت انتقال غیرهمزمان با فریم داده هشت بیتی، بدون بیت توازن و یک بیت پایانی قرار می گیرد.

۳-ثبات UBRR با یکی از مقادیری که در جدول بالا ارائه شد پر می شود.البته برای استفاده از این جدول فرکانس کریستال باید ۸MH باشد.اگر بخواهیم از فرکانس های کاری دیگری استفاده کنیم باید از فرمولی که برای محاسبه نرخ انتقال داده شد استفاده کنیم.

۴- با بررسی بیت RXC از ثبات UCSRA مطمئن می شویم که تمام کاراکتر به طور کامل دریافت شده است.پس از دریافت کامل بایت داده این بیت یک می شود. در این هنگام باید محتویات ثبات UDR را که حاوی داده دریافتی می باشد به محل مطمئنی منتقل کنیم.اگر در انجام این کار تعلل کنیم با ورود داده جدید داده قبلی از بین می رود.به دو روش سرکشی مداوم و وقفه می توانیم از تکمیل دریافت مطمئن شویم.برای فعال سازی روش وقفه علاوه بر یک بودن بیت فعالساز وقفه عمومی باید بیت RXCIE در ثبات UCSRB یک باشد. در این صورت با تکمیل دریافت بیت RXC یک شده و میکروکنترلر را وادار به پرش در جدول بردار وقفه و استفاده از سرویس وقفه می کند.

۵- برای دریافت بایت داده بعدی به مرحله ۵ می رویم.اگر وقفه فعال باشد نیاز به سرکشی مداوم نیست.

مثال۳: برنامه ای برای ATMEGA32 بنویسید که بایت های داده را به طور سریال بگیرد و بر روی پورت B قرار دهد.نرخ انتقال را برابر ۹۶۰۰ و طول کاراکتر را ۸بیتی با یک بیت توفق در نظر می گیریم.(جواب مثال در زبانه مربوط به کد آمده است)

مثال ۴:برنامه ای برای AVR  بنویسید که یک کاراکتر از پورت سریال دریافت کند.اگر کاراکتر دریافتی مابین a تا z بود آن را به حروف بزرگ تبدیل کرده و پس بفرستد.نرخ انتقال را ۹۶۰۰ ،یک بیت توقف و طول کاراکتر ۸ بیتی در نظر بگیرید.

دو برابر کردن نرخ انتقال در AVR

دو روش برای افزایش نرخ انتقال داده در AVR وجود دارد:

۱- استفاده از کریستالی با فرکانس بالاتر.

۲-تغییر یک بیت در ثبات UCSRA.

استفاده از گزینه اول در بسیاری از شرایط امکان پذیر نمی باشد زیرا کریستال سیستم ثابت است.بنابراین برای این کار از روش دوم استفاده می کنیم.با ثابت بودن فرکانس کریستال می توانیم از بیت U2X در ثبات UCSRA برای دو برابر کردن نرخ انتقال استفاده کنیم.وقتی AVR روشن می شود این بیت صفر است.بایک کردن این بیت نرخ انتقال دو برابر می شود.

ارتباط سریال سنکرون(همزمان)

در اینجا ما فقط به توضیح مختصری از این مد عملیاتی اکتفا می کنیم و ذکر مثال را در آینده به صورت پروژه ارائه می دهیم.

برای استفاده از این مد با ید بیت UMSEL در ثبات UCSRC یک شود.در این حالت پایه XCK در حالت slave به عنوان ورودی پالس ساعت و در حالت master به عنوان خروجی پالس ساعت استفاده می شود. چنانچه بیت UCPOL در رجیستر UCSRC فعال باشد، نمونه برداری در لبه بالا رونده و تغییر داده در لبه پایین رونده پالس XCK انجام می شود. در صورت صفر بودن بیت UCPOL نمونه برداری در لبه پایین رونده و تغییر داد در لبه بالا رونده پالس XCK انجام خواهد شد.یکی از کاربردهای استفاده از این مد خواندن صفحه کلید کامپیوتر است.

Slide1

مد ارتباط چند پردازنده ای(MPCM)

از این مد برای برای شبکه بندی بین میکروکنترلرها استفاده می شود که می توان با یک نمودن بیت MPCM از رجیستر UCSRA آن را فعال نمود. فرض کنید یک میکرو کنترلر فرمانده یا master و تعدادی میکرو کنترلر فرمانبر یا slave که به آن متصلند وجود داشته باشد. اگر مستر قصد داشته باشد به یکی از فرمانبرها دسترسی داشته باشد باید آن را آدرس دهی کند(آدرس هرفرمانبر قبلا توسط برنامه نویس مشخص می شود) و سپس داده به فرمانبر مورد نظر ارسال شود.برای این منظور در مستر می توان از قالب اطلاعات ۹ بیتی استفاده نمود. در این حالت بین نهم(TXB8) هنگامی که اطلاعات ارسالی شامل آدرس است باید یک باشد و در صورتی که اطلاعات ارسالی شامل داده باشد این بیت باید صفر باشد.تمام فرمانبرها نیز باید در قالب ۹ بیتی قرار بگیرند و همچنین مد چند پردازنده ای آنهارا باید با یک کردن بیت MPCM فعال کنیم. یک شدن این بیت در سمت گیرنده باعث می شود که فریمهای دریافتی از نوع داده و آدرس از هم تفکیک شوند. به طوری که اگر MPCM=1 باشد فقط فریم هایی که شامل آدرس هستند در بافر UDR قرار خواهند گرفت و فریم های شامل داده در بافر قرار نمیگیرند. با صفر کردن این بیت در سمت فرمانبر هردو فریم دریافتی داده و آدرس در بافر UDR قرار خواهند گرفت. این روش باعث کاهش تعداد فریم های دریافتی و اشتغال پردازنده می شود.بیت MPCM در سمت مستر کاربردی ندارد.زمانی که مستر قصد ارسال داده به یکی از فرمانبر ها را داشته باشد با ارسال یک فریم ۹بیتی آدرس به آنها عملیات را شروع می کند.یک بیت از این ۹ بیت، بیت آدرس است(TXB8).تمام فرمانبر ها این فریم را دریافت کرده و آن را با آدرس خود مقایسه می کنند.هر کدام از آنها که انتخاب شده باشند بیت MPCM خود را پاک کرده و منتظر دریافت داده می مانند.در غیر این صورت این بیت همچنان یک است و فرمانبر در حالت انتظار برای دریافت آدرس می باشد.زمانی که مستر داده را برای فرمانبر انتخاب شده ارسال می کند، بیت TXB8 باید صفر باشد. پس از اتمام ارسال داده فرمانده بیت نهم خود را یک می کند و در حالت آدرس دهی قرار می گیرد.همچنین فرمانبر مورد نظر نیر باید با یک کردن بیت MPCM خود در حالت انتظار آدرس قرار بگیرد.

نکته: توجه داشته باشید که طول داده مابین فرمانده و فرمانبر باید یکسان باشد. طول داده هر مقداری که باشد بیت TXB8  برای تمایز مابین داده و آدرس استفاده می شود.

ارتباط سریال

استاندارد RS232

امروزه RS232 یکی از پرکاربردترین استانداردهای اتصال سریال است.اما از آنجا که این استاندارد خیلی پیش از ظهور خانواده منطقی TLL تنظیم شده بود سطوح ولتاژهای ورودی و خروجی آن با TLL سازگار نیستند.در RS232 منطق یک با ۳V- تا ۲۵V- و منطق صفر با  ۳V+ تا ۲۵V+ مشخص می شود.فاصله بین ۳V- تا ۳V+ تعریف نشده است. در نتیجه برای اتصال RS232 به یک یک سیستم میکروکنترلر باید از مبدلهای ولتاژی مانند MAX232 جهت تبدیل سطوح ولتاژ RS232 به TTL و بالعکس استفاده کنیم(سطح ولتاژ TTL پنچ ولت است).

ارتباط سریال

کامپیوترهای PC معمولا دو پورت COM دارند که هر دو از رابط نوع RS232 می باشند.در سال های اخیر یکی از این پورت ها با USB جایگزین شده است.ما می توانیم برای آزمایشات ارتباط سریال، پورت سریال AVR را به پورت COM1 در PC متصل کنیم.در صورت نبودن پورت COM  می توانیم از یک مبدل COM به USB استفاده کنیم.

در شکل زیر دو نوع پورت RS232 را با نام های ۹-DB و ۲۵-DB را مشاهده می کنید.

ارتباط سریال

ساده ترین اتصال AVR به پورت RS232  به وسیله سه اتصال امکان پذیر است.تنها کافیست پایه TXD میکروکنترلر به پایه RXD پورتRS232 و پایه RXD میکروکنترلر به پایه TXD پورت RS232 متصل شود و یا اتصال مشترک GND هم داشته باشند. این اتصال باید به وسیله رابط MAX232 باشد.در شکل زیر نحوه اتصال را مشاهده می کنید.

Slide1

در انتها پروژه ای ساده از نحوه ارتباط بین دو میکروکنترلر ارائه شده است که می توانید فایل های مربوطه را از لینک زیر دریافت کنید.

AVR مورد استفاده ATMEGA32 می باشد.دو میکرو کنترلر مقدار موجود بر روی پورت B خورا خوانده و با روش سریال به AVR مقابل میفرستند تا بر روی پورت A میکروی مقابل نمایش داده شود.

کد زبان C مربوط به این پروژه که در محیط کدویژن نوشته شده در زبانه برنامه نویسی ارائه شده است.

کد c مربوط به پروژه

 

جواب مثال۱:

 

جواب مثال۲:

 

جواب مثال۳:

 

جواب مثال ۴:

 

شمایی از فیزیک پروژه در پروتئوس:

ارتباط سریال

 

شما می توانید فایل های مربوط به این پروژه را از لینک زیر دریافت کنید.

پسورد فایل فشرده: www.microlearn.ir

دانلود فایل های پروژه

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

درباره‌ی احسان عبداللهی

احسان عبداللهی
احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات | در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۹۳ نظر

  1. Avatar

    سلام خسته نباشید
    (while(!(UCSRA & (1<<UDRE

    علامت ! یعنی چی؟؟

    بودن و نبودنش چه فرقی داره؟؟؟؟؟؟

    • احسان عبداللهی

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

  2. Avatar

    سلام
    در مثال ۲ خط ۱۹ که می خواستیم از وقفه استفاده کنیم بیت TXCIE رو یک کردین نه UDRIE چرا؟؟
    مگه وقفه UDR با UDRIE فعال نمیشه؟

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

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