۴-۸ ارتباط ۲ میکروکنترلر AVR از طریق USART

برای این کار ابتدا مداری همانند شکل ۵ را در محیط Proteus ببندید. همان­طور که در شکل می ­بینید ارتباط سریال دو میکروکنترلر از طریق پایه ­های TX و RX صورت می  ­گیرد. این پایه ­ها در این ­دو میکروکنترلر باید به صورت ضربدری به هم متصل شوند، به این معنا که پایه ­ی RX در یک میکرو باید به پایه­ ی TX در دیگر میکروکنترلر وصل شود و همچنین پایه­ ی TX در میکروی اول باید به پایه ­ی RX در میکروی دوم متصل شود. علت این امر هم این است که اطلاعات ارسالی از یک میکرو از درگاه ارسال(TX) باید وارد درگاه دریافت در دیگر میکرو(RX) شود و بالعکس.

 tx-rx-network1

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

در اینجا می ­خواهیم میکروکنترلر اول یک کاراکتر را برای میکروی دوم ارسال کند و میکروی دوم این کاراکتر را بر روی LCD چاپ کند.

در میکروکنترلر اول پس از انتخاب فرکانس میکرو برابر با ۱MHz و همچنین انتخاب این میکرو به عنوان فرستنده و گیرنده و Baud Rate برابر با ۴۸۰۰ کد نویسی را شروع می ­کنیم:

با استفاده از این قطعه کد کاراکتر ‘S’را از طریق ارتباط سریال ارسال کرده­ ایم.

حال باید در میکروکنترلر دوم این کاراکتر را دریافت و آن را روی LCD چاپ کنیم.

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

همانطور که می ­بینید با دریافت کاراکتر ارسالی توسط دستور ()getchar و دادن خروجی این تابع به تابع چاپ کننده ­ی یک کاراکتر روی LCD توانسته ­ایم این کاراکتر را برای زمان محدود بر روی LCD همانند شکل ۶ چاپ کنیم.

ldc-s

شکل ۶ : کاراکتر دریافت شده توسط ارتباط سریال

حال می­ خواهیم رشته­ هایی با طول متفاوت را از یک میکرو ارسال کرده و در میکروی دیگر آن را بخوانیم. برای این کار یک روش حرفه­ ای و مطمئن قرار دادن یک آغاز و یک پایان برای رشته­ های ارسالی است. علت استفاده از این امر کاهش خطای خواندن از درگاه سریال و حصول اطمینان از درست خواندن رشته ­ی ارسالی است. درست خواندن یک رشته به این معنا است ما آن رشته­ ی دریافتی را به درستی از ابتدا خوانده و در آخر آن رشته کار خواندن را تمام کنیم. برای این منظور در میکروی اول رشته را به صورت زیر ارسال می­ کنیم :

همان­طور که می ­بینید در ابتدای رشته کاراکتر ‘*’ و انتهای رشته کاراکتر ‘#’ را قرار داده ایم. علت این امر آن است که در گیرنده بتوانیم ابتدا و انتهای رشته را تشخیص دهیم و تمام کاراکترهای بعد از ابتدا تا انتها به عنوان کاراکترهای اصلی در نظر بگیریم. پس از ارسال رشته یک تاخیر را در نظر گرفته ایم تا اطلاعات به درستی روی باس سریال تثبیت شوند. البته لزومی به استفاده از این نوع تاخیر در ارتباط سریال با کامپیوتر نیست.

در میکروکنترلر دوم نحوه ­ی دریافت و خواندن رشته به سبک زیر است:

ابتدا با اضافه کردن یک رشته به طول مشخص ( در اینجا ۲۰ ) سپس با تعریف یک کاراکتر و یک شمارنده کار خود را آغاز می کنیم.

سپس با خواندن کاراکترهای ورودی منتظر دریافت کاراکتر ‘*’ می­ مانیم(خط ۳ ). در ادامه در صورت دریافت کاراکتر مورد نظر تا انتهای رشته که همان کاراکتر ‘#’ است، کاراکتر های ورودی را می ­خوانیم.کاراکترهای خوانده شده را درون رشته به ترتیب کپی کرده و شمارنده را افزایش می ­دهیم. پس از اتمام رشته چون کاراکتر ‘#’ هم درون رشته اضافه شده است آن را حذف کرده و در انتهای رشته عبارت NULL را که به معنای انتهای رشته است را اضافه می­ کنیم(خط ۱۱). سپس رشته ­ی تولید شده را روی LCD چاپ می ­کنیم و نهایتا شمارنده را نیز صفر می­ کنیم تا برای دریافت رشته های بعدی منتظر باشیم. با استفاده از این تکنیک می­ توانید رشته هایی با طول های متفاوت که تنها در ابتدا و انتهای آنها کاراکترهای خاصی وجود دارد را ارسال کنید.

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

8 پاسخ

  1. محمد احسان حیدری می‌گه:

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

  2. مهدی می‌گه:

    ممنون از مطلب مختصر و مفیدتون

  3. محمد می‌گه:

    سلام
    کد آخری که ۱۷ سطر است…ادامه کد ۸سطری در میکرو دوم هست؟

  4. mahdi می‌گه:

    سلام و خسته نباشید خدمت شما بزرگواران
    ممنون از اموزش و زمانی که گذاشتید
    این اموزشتون کلی بدردم خورد بابت ارسال و دریافت دیتا با طولهای متفاوت
    اما مشکلی که هنوز دارم با اینتراپتهای ارسال و دریافته و کد هایی هم که کد جنریتور کد ویژن تولید میکنه برا اینتراپت برام قابل فهم نیست
    میتونید لطف کنید کد ارسال و دریافت دیتا رو با اینتراپت هم آموزش بدید به محوی که کثل همین آموزش بشه با طول رشته های متفاوت دیتا ارسال و دریافت کرد؟

    بازم ممنونم از زحماتتون

  5. رعنا یاوری می‌گه:

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

    • محمود حسن پور دهنوی محمود حسن پور دهنوی می‌گه:

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

پاسخ دهید

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

CLOSE
CLOSE