این مقاله در مورد نحوه برقراری ارتباط بین AVR و PC به روشی ساده اما کاملاً جامع صحبت خواهد کرد. این ساده است زیرا من از یک رابط نسبتاً "کلاسیک" برای برقراری ارتباط بین AVR و PC استفاده می کنم، رابط RS232 از طریق پورت های COM. جامع است زیرا من شما را از طریق انتقال بین AVR و PC، نحوه نوشتن رابط برنامه RS232 بر روی کامپیوتر و AVR راهنمایی خواهم کرد. به طور خاص این مقاله شامل:
1. نمای کلی پورت COM
پورت COM یا پورت سریال یک پورت ارتباطی است که بخشی از شکل "پیری" رایانه شخصی است، هم دسکتاپ و هم لپ تاپ. امروزه با ظهور و "گسترش" استاندارد USB، پورت COM (و پورت LPT یا پورت موازی) در حال از بین رفتن است.
ارتباط پورت COM ارتباط سریال RS232 است. این استاندارد در مقایسه با USB بسیار کند است. با این حال، با روباتیک یا کنترل، COM-RS232 به دلیل سادگی و همچنین به دلیل ... این کاهش سرعت بسیار محبوب است. پورت های COM در رایانه های موجود (در صورت وجود) عمدتاً 9 پین مرد هستند. با این حال، جایی یک پورت COM 25 پین وجود دارد که تقریباً همان پورت LPT است، اما یک پورت نر است، در حالی که پورت LPT ماده است.
نیاز به درک نکات اصلی در مورد مودم های تهی و پین اوت RS232.
شکل 1 دو نوع پورت COM را نشان می دهد و جدول 1 عملکرد پورت ها را خلاصه می کند.
بیشتر مورد توجه در پین های پورت COM، 3 پین 0 ولت SG (زمین سیگنال)، پین های فرستنده داده TxD و پین های دریافت داده RxD است. اینها سه پین اصلی برای ارتباط RS232 و سازگار با UART در AVR هستند. در صورتی که کاربر اطلاعاتی در مورد سازمان ثبت رایانه شخصی داشته باشد، میتوان از پینهای باقیمانده نیز استفاده کرد. با این حال، در بیشتر موارد، تنها از سه پین استفاده می شود.
همانطور که در AVR5-UART بیان شد، استانداردهای RS232 و UART عموماً از نظر انتقال، نرخ باود یکسان هستند، اما از نظر ولتاژ و قطبیت متفاوت هستند. به مثال مقایسه در شکل 2 مراجعه کنید.
در استاندارد UART (در AVR)، سطح 1 مربوط به ولتاژ بالا (5V، TTL) است در حالی که برای RS232 سطح 1 مربوط به ولتاژ پایین (ولتاژ منفی، شاید 12-V) است. واضح است که نیاز به یک "مبدل" بین این دو وجود دارد.
خوشبختانه نیازی نیست خودمان این پل را طراحی کنیم زیرا آی سی های اختصاصی وجود دارد. MAX232 یکی از پر استفاده ترین آی سی های سوئیچ UART-RS232 است. البته، شما می توانید یک مدار ساده فقط با چند جزء مانند خازن، مقاومت، دیود و ترانزیستور ایجاد کنید اما پایداری آن تضمین نمی شود.
شکل 3 نحوه استفاده از آی سی Max232 را برای اتصال بین UART در AVR و پورت COM PC نشان می دهد.
مدار فوق فقط اثر تغییر سطح ولتاژ بین RS232 و UART را دارد. این حالت ارتباط این استانداردها را تغییر نمی دهد و بنابراین برنامه نویسی در رایانه شخصی و AVR جایگزین نیست، تغییر کنید. در واقع Max232 دارای دو ترانسوم است.
در شکل 3، ما فقط از فرستنده گیرنده 1 استفاده می کنیم. پین TxD (پین 3) پورت COM متصل به R1IN (دریافت 1 ورودی) Max232 مطابق با خروجی R1OUT (دریافت) 1 است) باید به گیرنده RX متصل شود. AVR برای T1IN و T1OUT هم همینطور. مقدار خازن های 10uF نسبتا استاندارد است، اما زمانی که خازن را با 1uF جایگزین می کنید، مدار فعال باقی می ماند اما فاصله انتقال (کانکتور کابین) کوتاه تر خواهد بود (اگر زیاد طولانی باشد خطای ارتباطی ایجاد می کند). مقاومت های شکل 3 فقط برای محافظت از پورت های COM و IC ها کار می کنند، بنابراین ممکن است نیازی به استفاده از این مقاومت ها بدون تأثیر بر عملکرد مدار نباشد. Vcc و GND منابع مدارهای AVR هستند.
2. پورت COM مجازی برای شبیه سازی ایجاد کنید
برای برقراری ارتباط بین AVR و رایانه شخصی از طریق پورت COM، بدیهی است که به یک پورت COM نیاز دارید، علاوه بر این باید یک مدار AVR ایجاد کنید و Max232 را بریج کنید. متأسفانه همه رایانه ها این پورت را ندارند. اگر فقط می خواهید یاد بگیرید که چگونه با AVR-PC ارتباط برقرار کنید یا فقط می خواهید یک الگوریتم خاص را آزمایش کنید، شاید شبیه سازی راه حل ترجیح داده شود. به منظور شبیه سازی ارتباطات RS232، Proteus دوباره برای شبیه سازی انتقال داده ها با پورت های COM مفید است.
بنابراین مشکل این است که چگونه می توان پورت های COM مجازی را روی کامپیوتر ایجاد کرد و آنها را به یکدیگر متصل کرد تا شبیه سازی های ارتباطی انجام شود. به دلیل ماهیت پورت COM فقط یک بار "باز" (باز) است، به این معنی که این دو نرم افزار نمی توانند یک پورت را باز کنند.
ایده ما ایجاد دو پورت COM مجازی است که با هم "تقاطع" شده اند (مانند COM2 و COM3). در خروجی پروتئوس UART به COM2 متصل است. در نرم افزار PC (مثلا HyperTerminal) به COM3 متصل می شویم. به این ترتیب ما توانستیم بین AVR (مدل پروتئوس) و کامپیوتر (نرم افزار HyperTerminal) ارتباط برقرار کنیم.
نرم افزارهای خوبی وجود دارد که می تواند پورت های COM مجازی و اتصالات مجازی بین آنها را دقیقاً مطابق خواسته ما ایجاد کند. در این بخش به معرفی نرم افزار Electronic Team (Virtual Serial Port Driver) می پردازم.
درایو پورت سریال مجازی (VSPD) پورت های سریال مجازی را شبیه سازی می کند و آنها را به صورت جفت از طریق کابل مودم تهی مجازی متصل می کند. برنامه های موجود در هر دو انتهای جفت قادر به تبادل داده ها به گونه ای خواهند بود که هر آنچه در پورت اول نوشته شده است در پورت دوم و به عقب ظاهر شود.
رابط VSPD همانطور که در شکل 4 نشان داده شده است
در تب "Manager ports" نرم افزار به طور خودکار پیشنهاد می کند که می توان چند پورت COM مجازی ایجاد کرد، می توانید دوباره آنها را انتخاب کنید و روی "Add pair" کلیک کنید تا این دو پورت COM ایجاد شود. پورت COM مجازی ایجاد شده توسط VSPD در "لیست دستگاه" ویندوز ظاهر می شود و هنگامی که کاربر نرم افزار VSPD را خاموش می کند از بین نمی رود. مدیریت دستگاه ویندوز را اجرا کنید. در بخش Ports (COM & LPT) پورت های COM مجازی ایجاد شده را مشاهده خواهید کرد (به مثال در شکل 5 مراجعه کنید).
3. از کتابخانه صادرات استاندارد stdio.h در WinAVR استفاده کنید
هر کسی که تا به حال زبان برنامه نویسی C را یاد گرفته باشد، اولین برنامه "سلام جهان" خود را فراموش نخواهد کرد:
این برنامه به سادگی کار تایپ "hello, world" را روی صفحه انجام می دهد. چاپ نامه توسط دستور "printf" در خط 3 انجام می شود. دستور printf در کتابخانه stdio به نام کتابخانه ورودی / خروجی استاندارد است. دستور printf در stdio فقط برای چاپ روی صفحه نیست، بلکه می تواند در هر دستگاه خروجی چاپ کند، حتی یک فایل را روی هارد کامپیوتر چاپ کند.
برای AVR، اگر از کامپایلر استفاده میکنید وقتی printf را فراخوانی میکنید، رشته در ماژول UART چاپ میشود (خروجی میشود) (البته ابتدا باید رجیسترهای UART را نصب کنید تا UART فعال شود).
خود CodevisionAVR UART را به عنوان دستگاه ورودی/خروجی پیشفرض برای دستورات موجود در کتابخانه stdio (printf، scanf ...) میداند. با این حال، با WinAVR (avr-gcc) همه چیز متفاوت است. برای استفاده از ورودی و خروجی استاندارد باید یک دستگاه ورودی و یک تابع ورودی "پایه" را اعلام کنیم. تابع اصلی تابعی است که توسط کاربر تعریف شده است و وظیفه آن صادر کردن (یا وارد کردن) یک کاراکتر به یک دستگاه ورودی است.
به عنوان مثال، در ارتباط AVR5 - UART یک تابع "uart_char_tx" کاراکترهای خروجی به UART را به صورت زیر تعریف می کنیم:
یا در TextLCD به تابع "putChar_LCD" نگاه می کنیم تا یک کاراکتر را به ال سی دی به صورت زیر تولید کنیم:
هر دو "uart_char_tx" و "putChar_LCD" به عنوان مثال بالا می توانند به عنوان یک تابع واردات "پایه" برای توابعی مانند printf ... در کتابخانه های استاندارد صادرات sdtio استفاده شوند. با فرض استفاده از تابع "uart_char_tx"، هنگام فراخوانی تابع printf، رشته به UART صادر می شود.
در مقابل، اگر تابع "putChar_LCD" به عنوان تابع پایه استفاده شود، تابع stdio printf رشته داده را به LCD خروجی می دهد. با استفاده از این روش، مترجم avr-gcc به ما امکان دسترسی انعطافپذیرتر به کتابخانه stdio را میدهد، میتوانید از توابع stdio برای صادرات/وارد کردن دادهها به هر دستگاهی مانند ترمینال UART، TextLCD، LCD گرافیکی یا حتی SD، کارت MMC استفاده کنید. شما تابع ورودی "پایه" را تعریف می کنید.
برای نشان دادن نحوه استفاده از توابع در کتابخانه stdio، نمونه ای از خروجی داده ها به TextLCD و uart با استفاده از printf stdio را نشان می دهم. شبیه سازی مدار برای این مثال در شکل 6 در زیر نشان داده شده است.
تمام داده های نمایش داده شده بر روی LCD و ترمینال uart در شکل 6 از طریق توابع printf و fprintf انجام می شود. همچنین در این مثال کاربر می تواند یک کاراکتر از صفحه کلید و کد اسکی وارد کند. کلید روی ترمینال چاپ می شود. کد نشان داده شده در List1.
برای استفاده از توابع در کتابخانه خروجی استاندارد، باید فایل هدر کتابخانه را مانند خط 4 "#include" اضافه کنیم.
توجه داشته باشید که هنگام استفاده از avr-gcc، توابع مربوط به avr -libc در زیر شاخه "/ avr /" دایرکتوری include قرار دارند.
به عنوان مثال، هدر io.h یا interrupt.h حاوی توابع ویژه ای برای avr است، هنگام پیوست کردن این فایل ها چیزی مانند: "#include" را مشخص می کنیم ... با این حال، زبان استاندارد C (مانند stdio.h، math.h) ، ...) مستقیماً در دایرکتوری include قرار دارد، هنگام پیوست کردن این فایل ها باید مستقیماً مانند خط کد 4 نوشته شوند. همچنین به دلیل اینکه در این مثال از LCD استفاده شده است، باید کتابخانه myLCD.h را مانند خط 5 کپی و اضافه کنید ( بررسی TextLCD).
همانطور که در بالا توضیح داده شد، برای استفاده از توابع در stdio به توابع اولیه ورودی/خروجی نیاز داریم. خطوط از 7 تا 11 توابع خروجی uart با نام "uart_char_tx" هستند که به عنوان تابع پایه برای توابع خروجی stdio استفاده خواهند شد. تابع "uart_char_tx" در درس UART مورد بحث قرار گرفت، جایی که یک تغییر کوچک در 8 خط "if (chr == '\ n') uart_char_tx ('\ r')" ایجاد شد، این خط به این معنی است که وقتی کاربر می خواهد کاراکتر "\ n" را خروجی کند، تابع "uart_char_tx" کاراکتر "\r" را خروجی می دهد.
بنابراین اگر در انتهای جمله با یک '\ n' (با کد ASCII 10، به نام Line Feed - LF) در انتهای جمله برخورد کردید، ترکیبی از '\ r' + '\ n' (کد '\ r' = 13 نامیده می شود. Carriage Return - CR) به جریان ارسال خواهد شد. برای درک بهتر این موضوع، با Carriage Return Line Feed (CRLF) در ویندوز بیشتر آشنا خواهید شد.
دو خط کد 13 و 14 هنگام استفاده از کتابخانه stdio بسیار مهم هستند. منظور از این دو خط ایجاد دو فایل مجازی (همچنین به عنوان جریان) برای صادرات داده است. ما خط 14 را بررسی می کنیم: یک جریان برای UART ایجاد کنید.
static FILE uartstd = FDEV_SETUP_STREAM (uart_char_tx، NULL، _FDEV_SETUP_WRITE)؛
ما یک متغیر به نام uartstd (با نام کاربری self-named) ایجاد می کنیم که از نوع FILE (نوع دستگاه مجازی) است، سپس از ماکرو "FDEV_SETUP_STREAM" برای مقداردهی اولیه و تنظیم پارامترها برای uartstd استفاده می کنیم. این ماکرو عملکرد باز کردن fdevopen و اختصاص "ابزار" برای وارد کردن به دستگاه را دارد.
#define FDEV_SETUP_STREAM (قرار دادن، دریافت، rwflag)
پارامتر پیوست شده "FDEV_SETUP_STREAM" شامل یک تابع اصلی به نام "put"، یک تابع اصلی به نام "get" و یک پرچم است که عملکرد خروجی یا ورودی دستگاه در حال باز شدن را نشان می دهد. به طور خاص، در خط 13، متغیر uartstd یک "دستگاه مجازی" است که برای خروجی داده ها استفاده می شود (به دلیل پارامتر _FDEV_SETUP_WRITE).
ابزار خروجی uartstd تابع "uart_char_tx" است که در بالا ایجاد کردیم. هیچ تابعی برای دریافت داده از uartstd (پارامتر get = NULL) وجود ندارد. شما می توانید این را تصور کنید: متغیر uartstd یک ورق کاغذ است، تابع "uart_char_tx" یک "مهر" است که امکان چاپ یک کاراکتر را بر روی یک صفحه کاغذ uartstd می دهد. "uart_char_tx" را به usrtstd اختصاص می دهیم، سپس تمام چاپ روی کاغذ uartstd توسط "uart_char_tx" انجام می شود. بنابراین تابع "uart_char_tx" تابع پایه نامیده می شود.
به طور مشابه، در خط 13 یک "کاغذ" دیگر به نام lcdstd ایجاد می کنیم و تابع اصلی آن از تابع "putChar_LCD" خارج می شود که قبلاً در کتابخانه myLCD.h تعریف شده است.
خطوط موجود در برنامه اصلی از خطوط 17 تا 25 UART و TextLCD را شروع می کنند، می توانید برای درک بیشتر مقالات مرتبط را مرور کنید. پس از راه اندازی، UART و LCD برای صادرات داده آماده هستند. اکنون می توانیم از توابع موجود در کتابخانه stdio مانند printf یا sprint ... برای صادرات داده ها استفاده کنیم. شکل 6 را خواهید دید زیرا من از آن برای مقایسه با خطوط کد زیر استفاده خواهم کرد. خط 27 "printf ("در lan 1")، هدف چاپ رشته" در lan 1" روی LCD با استفاده از تابع printf است. اما همانطور که در شکل 6 نشان داده شده است، شما این رشته را مشاهده نمی کنید.
اکنون به خط 28 "fprintf (& lcdstd, www.eltima.com")" نگاه کنید و دوباره به شکل 6 نگاه کنید، این بار رشته "www.eltima.com" را روی LCD ظاهر کرده اید، با fprintf موفق شده است. عملکرد. تابع fprintf تابعی است که داده ها را به یک دستگاه مجازی خروجی می دهد، که در آن پارامتر اول تابع به دستگاه اشاره می کند و پارامتر دوم رشته داده برای چاپ است. در این مورد، ما از fprintf برای صادرات رشته «www.eltima.com» به ماشین مجازی lcdstd استفاده کردیم و موفق شدیم. در مورد تابع printf در خط 27 چطور؟ بیایید به خطوط 30 تا 32 نگاه کنیم. خط 30 ما یک بار دیگر از تابع printf "printf (" In lan 3 ")" برای چاپ "lan 3" روی LCD استفاده می کنیم اما هنوز موفق نبوده است (ال سی دی را در شکل 6 ببینید). . در خط 31 ما "stdout = & lcdstd" را اختصاص می دهیم که در آن stdout یک متغیر (در واقع یک جریان یا دستگاه مجازی) از زبان C است که دستگاه پیش فرض را برای ورود داده ها تعریف می کند. هنگام اختصاص دادن stdout به lcdstd به عنوان خط 31، اعلام می کنیم که LCD دستگاه ورودی پیش فرض است. بنابراین، در خط 32 ما printf را "printf (" Lan 4:% i ", x)" می نامیم، موفق بودیم.
این بار، روی LCD نگاه کنید، خط "Lan Lan 4: 8205" ظاهر می شود. در اینجا 8205 مقدار متغیر x در عبارت خط 32 است. به طور خلاصه، تابع fprintf اجازه چاپ مستقیم به یک دستگاه مجازی مشخص را می دهد در حالی که با استفاده از تابع printf باید دستگاه ورودی Precedes را برای متغیر stdout اختصاص دهیم. به کد خطوط 34 تا 37 و سه خط اول در ترمینال در شکل 6 نگاه کنید، که احتمالاً خودتان می دانید.
در نهایت، سرور وقفه داده UART در خطوط کد 41 تا 44 قرار دارد. در این مثال، ما به سادگی خط "Ma ASCII:" را با مقدار دریافتی از "UART موجود در ثبات UDR موجود است: "fprintf (& uartstd اجرا می کنیم. "Ma ASCII:% i \ n "، UDR)".
برای درک کامل کتابخانه stdio در WinAVR، باید مستندات "avr-libc Manual"، بخش امکانات استاندارد IO را بخوانید.
4. برنامه نویسی با پورت COM با استفاده از Visual Basic و Visual C ++
در بسیاری از موارد، نیازمندیهای ارتباطی به پیچیدگی بالاتری مانند ذخیرهسازی داده یا نمودارهای متغیر نیاز دارند، بنابراین کاربران باید برنامههای خود را خودشان بنویسند. این آموزش به شما نشان می دهد که چگونه برنامه هایی را روی رایانه بنویسید تا داده ها را از پورت COM در Visual Basic و Visual C ++ 6.0 ارسال و دریافت کنید. توجه داشته باشید، هدف این مقاله بر روی AVR است، بنابراین برنامه ای که در ویندوز نوشته شده است، یک راه ساده برای درک اصل برای شما ارائه کردم. برای توسعه برنامه های پیچیده تر، خوانندگان باید خود را با دانش برنامه نویسی ویندوز مجهز کنند. در تمام آموزشهای زیر فرض میکنم کمترین خوانندگان میدانند چگونه یک پروژه را در Visual Basic یا / و Visual C ++ ایجاد کنند.
1. یک برنامه پورت COM با استفاده از ویژوال بیسیک 6.0 بنویسید
از زمان نسخه های بعدی ویندوز 2000، ارتباط با پورت های کامپیوتر سنتی، مانند پورت های LPT، در ویندوز نسبتا دشوار بود. با این حال، با پورت های COM، خوشبختانه مایکروسافت ابزاری (در واقع یک کنترل) به نام "کنترل ارتباطات مایکروسافت" یا به اختصار MSComm ارائه می دهد. MSComm در نرم افزارهای محبوب برنامه نویسی MS مانند Visual Basic یا Visual C ++ به عنوان یک "کنترل" ظاهر شده است. به عنوان یک "کنترل کننده" طراحی شده برای پورت های COM، MSComm شامل تمام ابزارهای مورد نیاز برای برقراری ارتباط با این پورت است، وظیفه برنامه نویس صرفاً اعلام و استفاده است. برای نشان دادن نحوه استفاده از MSComm در ویژوال بیسیک، دستورالعمل های زیر را دنبال کنید.
اVisual Basic 6 را اجرا کنید، به منوی "File / New Project" بروید و یک "Standard EXE" ایجاد کنید. شما یک پروژه با نام "Project1" را با یک کادر محاوره ای پس زمینه به نام Form1 خواهید دید. شما می توانید هر پروژه و فرم اصلی را نام ببرید. از نوار ابزار Toolbox، روی کنترل "textbox" کلیک کنید و دو جعبه متن اصلی به نامهای txtOuput و txtInput را رسم کنید (نام جعبههای متن را در پنجره Properties در سمت راست پایین سمت راست تغییر دهید). با txtOutput، پارامتر Multiple را روی True و ScrollBars را روی "3 - هر دو"
سپس کنترل MSComm را در فرم اصلی قرار دهید. به طور پیش فرض، کنترل MSComm در جعبه ابزار ویژوال بیسیک موجود نیست، قبل از استفاده باید آن را به جعبه ابزار اضافه کنیم. برای افزودن MSComm به جعبه ابزار، منوی "Project / Components" را انتخاب کنید. یک کادر محاوره ای به نام Components را خواهید دید. همانطور که در تصویر نشان داده شده است "Microsoft Comm Control 6.0" را پیدا کرده و روی آن کلیک کنید و روی OK کلیک کنید. اکنون، در جعبه ابزار VB، نماد MSComm ظاهر می شود. روی این آیکون کلیک کنید و یک شی MSComm روی فرم اصلی بکشید. نام پیش فرض این شی MSComm1 است.
یک کد بنویسید:
هدف از این مثال به شرح زیر است: داده های دریافت شده از پورت COM در جعبه متن txtOutput نمایش داده می شود و زمانی که کاربر تایپ 1 کاراکتر در کاراکتر txtInput روی پورت COM منتقل می شود.