۳-۸ معرفی توابع مفید در CodeVision برای ارسال و دریافت اطلاعات
۲۸ بهمن ۱۳۹۷۵-۸ ارتباط میکروکنترلرهای AVR با کامپیوتر
۲۸ بهمن ۱۳۹۷برای این کار ابتدا مداری همانند شکل ۵ را در محیط Proteus ببندید. همانطور که در شکل میبینید ارتباط سریال دو میکروکنترلر از طریق پایههای TX و RX صورت میگیرد.
این پایهها در این دو میکروکنترلر باید به صورت ضربدری به هم متصل شوند، به این معنا که پایهی RX در یک میکرو باید به پایهی TX در دیگر میکروکنترلر وصل شود و همچنین پایهی TX در میکروی اول باید به پایهی RX در میکروی دوم متصل شود. علت این امر هم این است که اطلاعات ارسالی از یک میکرو از درگاه ارسال (TX) باید وارد درگاه دریافت در دیگر میکرو (RX) شود و بالعکس.
در اینجا میخواهیم میکروکنترلر اول یک کاراکتر را برای میکروی دوم ارسال کند و میکروی دوم این کاراکتر را بر روی LCD چاپ کند.
در میکروکنترلر اول پس از انتخاب فرکانس میکرو برابر با 1MHz و همچنین انتخاب این میکرو به عنوان فرستنده و گیرنده و Baud Rate برابر با ۴۸۰۰ کد نویسی را شروع می کنیم:
while(1) { printf("S"); }
با استفاده از این قطعه کد کاراکتر ‘S’ را از طریق ارتباط سریال ارسال کرده ایم.
حال باید در میکروکنترلر دوم این کاراکتر را دریافت و آن را روی LCD چاپ کنیم.
while(1) { lcd_putchar(getchar()); delay_ms(200); lcd_clear(); }
دقت کنید که تنظیمات این میکرو دقیقا مشابه میکروی اول است.
همانطور که میبینید با دریافت کاراکتر ارسالی توسط دستور ()getchar و دادن خروجی این تابع به تابع چاپ کنندهی یک کاراکتر روی LCD توانسته ایم این کاراکتر را برای زمان محدود بر روی LCD همانند شکل ۶ چاپ کنیم.
حال میخواهیم رشتههایی با طول متفاوت را از یک میکرو ارسال کرده و در میکروی دیگر آن را بخوانیم. برای این کار یک روش حرفهای و مطمئن قرار دادن یک آغاز و یک پایان برای رشتههای ارسالی است. علت استفاده از این امر کاهش خطای خواندن از درگاه سریال و حصول اطمینان از درست خواندن رشتهی ارسالی است.
درست خواندن یک رشته به این معنا است ما آن رشتهی دریافتی را به درستی از ابتدا خوانده و در آخر آن رشته کار خواندن را تمام کنیم. برای این منظور در میکروی اول رشته را به صورت زیر ارسال میکنیم:
while(1) { printf("*Hi, Usart World#"); delay_ms(500); }
همانطور که میبینید در ابتدای رشته کاراکتر ‘*’ و انتهای رشته کاراکتر ‘#’ را قرار دادهایم. علت این امر آن است که در گیرنده بتوانیم ابتدا و انتهای رشته را تشخیص دهیم و تمام کاراکترهای بعد از ابتدا تا انتها به عنوان کاراکترهای اصلی در نظر بگیریم.
پس از ارسال رشته یک تاخیر را در نظر گرفتهایم تا اطلاعات به درستی روی باس سریال تثبیت شوند. البته لزومی به استفاده از این نوع تاخیر در ارتباط سریال با کامپیوتر نیست.
در میکروکنترلر دوم نحوهی دریافت و خواندن رشته به سبک زیر است:
#include <mega16.h> #include <alcd.h> #include <stdio.h> #include <delay.h> char str[20]; char ch; int i = 0;
ابتدا با اضافه کردن یک رشته به طول مشخص (در اینجا 20) سپس با تعریف یک کاراکتر و یک شمارنده کار خود را آغاز میکنیم.
while(1) { ch = getchar(); if(ch == '*') { while(ch != '#') { ch = getchar(); str[i++] = ch; } str[--i] = NULL; lcd_puts(str); delay_ms(400); lcd_clear(); i = 0; } }
سپس با خواندن کاراکترهای ورودی منتظر دریافت کاراکتر ‘*’ میمانیم (خط 3 ). در ادامه در صورت دریافت کاراکتر مورد نظر تا انتهای رشته که همان کاراکتر ‘#’ است، کاراکترهای ورودی را میخوانیم. کاراکترهای خوانده شده را درون رشته به ترتیب کپی کرده و شمارنده را افزایش میدهیم.
پس از اتمام رشته چون کاراکتر ‘#’ هم درون رشته اضافه شده است آن را حذف کرده و در انتهای رشته عبارت NULL را که به معنای انتهای رشته است را اضافه میکنیم (خط 11).
سپس رشتهی تولید شده را روی LCD چاپ میکنیم و نهایتاً شمارنده را نیز صفر میکنیم تا برای دریافت رشتههای بعدی منتظر باشیم. با استفاده از این تکنیک میتوانید رشتههایی با طولهای متفاوت که تنها در ابتدا و انتهای آنها کاراکترهای خاصی وجود دارد را ارسال کنید.
22 Comments
سلام
خسته نباشید
من این کار رو انجام دادم ولی متاسفانه جواب نداد.
سلام.
کد باید جواب بده. احتمالا توی نحوه اتصال میکروها به هم درست وصل نکردین
ممنون از مطلب مختصر و مفیدتون
سلام
کد آخری که ۱۷ سطر است…ادامه کد ۸سطری در میکرو دوم هست؟
سلام. بله کد ۱۷ سطری ادامه کد ۸ سطری در میکروی دومه
سلام و خسته نباشید خدمت شما بزرگواران
ممنون از اموزش و زمانی که گذاشتید
این اموزشتون کلی بدردم خورد بابت ارسال و دریافت دیتا با طولهای متفاوت
اما مشکلی که هنوز دارم با اینتراپتهای ارسال و دریافته و کد هایی هم که کد جنریتور کد ویژن تولید میکنه برا اینتراپت برام قابل فهم نیست
میتونید لطف کنید کد ارسال و دریافت دیتا رو با اینتراپت هم آموزش بدید به محوی که کثل همین آموزش بشه با طول رشته های متفاوت دیتا ارسال و دریافت کرد؟
بازم ممنونم از زحماتتون
سلام
اگر که بخواهیم بیشتر از دو میکرو را بهم متصل کنیم باز هم امکان استفاده از این پروتکل هست؟
در واقع میخواهم یک میکرو به عنوان فرستنده و سه میکرو گیرنده باشند .
سلام
بله در پروتکل UART شما میتونید تعداد زیادی میکرو رو با هم شبکه کنید. فقط بایستی به هر میکرو یه آدرس اختصاص بدید تا هر میکرو عملیات مربوط به خودش رو انجام بده.
با تشکر
تیم فنی مهندسی ربات سازان
سلام.دستور printf در میکروی فرستنده ، اشتباهه.فرمتش غلطه
ممنون از دقتتون
باسلام، پایه های
VSS , VDD, VEE
ال سی دی به کجا باید وصل شود؟
با سلام.
پایه VDD به ولتاژ مثبت ۵ ولت، پایه VSS به زمین، پایه VEE واسه تنظیم شدت نور ای سی دی هست که میتونین با استفاده از یک مقاومت متغییر بین پایه VEE و زمین شدت نور رو تنظیم کنین.
سلام امکانش هست کد بسکام رو بزارین ممنون
سلام من تازه کار هستم میشه با همین روش رادیو کنترل ساخت
سلام وقت شما بخیر چطور ممکنه یکسری از کدها را به میکرو بدهیم و یکسری کد دیگر که مشابه با آن نیست را دریافت کنیم و در نرم افزار h-term مشاهده کنیم به عنوان مثال میخواهیم این کد را بفرستیم (۶۸ ۶۸ ۰۱ ۰۱ ۰۰ ۰۴ ۱۶ ۱۶) و این کد را (۶۸ ۶۸ ۰۱ ۰۱ ۱۱ ۱۶ ۱۶ ۱۶) دریافت کنیم؟ ممنون موفق و پیروز باشید.
با سلام ممنون استفاده كردم
سلام من میخوام داده های صفر تا ۹ رو بفرستم منتهی میخوام که این داده ها بصورت موج مربعی باشند و اونور با میکرو بگیرم با یوزارت امکان پذیر است؟
سلام
بله دقیقا پروتکل USART داره در عمل اطلاعات رو به صورت موج مربعی ارسال میکنه.
سلام
ممنون بابت کد خوبتون. به راحتی جواب داد.
فقط یه مشکلی دارم.
من ۲ تا مقادیر دیگ دارم.
دما – رطوبت – ارتفاع
هرکدوم توی یک خط ارسال میشن و مشکلی بابت ارسال نیست و هر کدوم هم کد خودشونو اول و انتهای خط خودشون دارن.
من فقط قادر به دریافت یکیشون هستم.
چطور میتونم هر کدوم رو جدا جدا دریافت کنم و توی یه متغیر ذخیره کنم؟
سلام و خسته نباشید
چطور میشود به میکروکنترل اول یک دستور و به میکروکنترلر دوم دستور دیگر داد
مثلا PORTA.0 از میکروکنترلر اول فعال و PORTA.0 از میکروکنترلر دوم همزمان غیره فعال باشد
ممنونم
با سلام
بسیار عالی بود خیلی خلاصه و مفید بدون مطالب اضافی به امید موفقیتهای بیشتر.
سلام ایا میشه با رزبری پای ۵ هم همچین کاری کرد