مبدل USB به سریال

شنبه 29 شهرویور 1393  •  دسته بندی: پروژه های آماده با میکروکنترلر AVR  •  بازدیدها: 6658  •  برچسب ها: | |

هدف پروژه: آشنایی با پورت uart میکرو و ارتباط میکرو با کامپیوتر از طریق usb. روند برنامه به این صورت است که اطلاعاتی را از میکرو با ترمینال نامینیک رد و بدل می کنیم. (نحوه کار با ترمینال نامینیک در سایت مشروح است)

سخت افزار استفاده شده: در این مقاله از برد آموزشی avr نامینیک مبتنی بر تراشه ATMEGA32 استفاده شده است. در روی برد یک آی سی به نام PL2303 وجود دارد که اطلاعات را به صورت سریال از پورت uart میکرو دریافت کرده و به پورت usb می فرستد یا برعکس. وظیفه این آی سی تبدیل سریال به پروتکل usb است. این آی سی در مد cdc با usb ارتباط برقرار می کند. به این معنی که با اتصال کابل usb به کامپیوتر، وسیله شما به صورت یک پورت COM (پورت های سریال یا ارتباط RS232) شناخته می شود و نهایت سرعت آن همان نهایت پورت سریال میکرو است. در ارتباط به روش cdc از usb فقط به عنوان واسط استفاده می شود و تمامی برنامه های ویندوز دستگاه شما را با پورت سریال می بینند نه usb. با این روش دیگر نیازی به کانکتور فیزیکی پورت سریال ( که هم قدیمی شده است و هم در لپ تاپ ها دیگر و جود ندارد) نیست.

کتابخانه های مورد نیاز: در این مثال، کتابخانه خود میکرو و کتابخانه ورودی خروجی ها برای ارتباط با ترمینال استفاده شده است. که در خط 9 و 12 مشاهده می کنید.

تشریح کد: پورت usart میکرو سه پین روی پایه های میکرو دارد. دو سیم برای ارسال و دریافت اطلاعات (در حالت uart یا ارتباط آسنکرون. پین های 0 و 1 پورت d) در حالت سنکرون هم یک پایه کلاک هم اضافه می شود (پین 0 پورت b). معمولا ارتباط آسنکرون این واحد از طرفداران بیشتری برخوردار است. زیرا بسیار ساده بوده، تقریبا هیچ پروتکلی ندارد و با دو سیم ناقابل می توان ارتباط همزمان خواندن و نوشتن داشت. مشکلات آن هم سرعت پایین، نویز پذیری بالا در محیط های صنعتی و پروتکل ساده که برای کار های پیچیده دردسر ساز است. (پروتکل این ارتباط هم مزیتش بود هم عیبش!) پروتکل این ارتباط بدین شرح است:

هر کدام از دو خط در نبود اطلاعات 1 منطقی هستند. در ساده ترین حالت دو طرف از قبل ارتباط با هم توافق کرده اند سرعت هر بیت چقدر باشد. تعداد بیت در هر ارسال یا دریافت چقدر باشد و بیت توازن که برای تشخیص خطا به کار می رود چگونه ساخته شود. از آن جایی که ارتباط آسنکرون است و کلاکی نداریم، گیرنده نمی داند اطلاعات کی می آید. فرستنده اطلاعات برای فرستادن دیتا ابتدا باس را به مدت یک بیت توافقی (البته در توافق اولیه می تواند 1.5 یا 2 بیت هم باشد) صفر می کند. از روی این کار گیرنده متوجه می شود که بیت های بعدی اطلاعات است و به اندازه توافق شده در فاصله های معین بیت ها را از باس بر می دارد. فرستنده بیت آخر (یا 2 یبت آخر) را حتما باید 1 کند که به بیت stop معروف است. اگر فرستنده و گیرنده با هم قرار داشتند در هر بار ارسال اطلاعات 8 بیت منتقل شود (با بیت توازن) و گیرنده بیت نهم را صفر ببیند خطا بوده اطلاعات نامعتبر می شود. خوشبختانه واحد usart میکرو خودش این کار ها را انجام می دهد و شما فقط باید خصوصیات هر فریم را مشخص کنید و بعد از آن وضعیت موفقیت آمیز بودن ارسال یا دریافت را از واحد usart بخوانید. توابعی هم هستند که در کارهای پیچیده، ما را از کار کردن مستقیم با رجیستر های واحد usart رهایی می بخشند. قطعا مطالعه دیتاشیت میکرو ابهامات شما را برطرف می کند. (شاید هم زیاد کند!)

در خطوط 23 تا 27 واحد uart به صورت فریم های 8 بیتی با یک بیت پایان و بدون بیت توازن تعریف شده است و سرعت انتقال اطلاعات 9600 بیت در ثانیه.

در خط 31 آدرس سایت نامینیک در ترمینال نمایش داده می شود. خطوط 32 تا 43 باعث می شود که تا  کلید e صفحه کلید فشرده نشده، همواره عددی بین 0 تا 9 از کاربر می خواهد و با توجه به عدد داده شده رمز موفقیتی را برای او تولید می کند!!؟ بعد از اینکه کاربر کلید e را فشرد، برنامه با نمایش پیغامی (خط 45) خاتمه می یابد.

 

#include <mega32.h>
 
// Standard Input/Output functions
#include <stdio.h>

void main(void)
{
unsigned char a=0, *b, c[11]="0123456789";
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

while (1)
      {
          printf("WWW.NAMINIC.COMnr");
          while(a!='e')
          {
              printf("nrpress any number or 'e' for exit:");
              gets(&a,1);
              if(a>='0' && a<= '9')
              {
                  b=&c[(a-48)];
                  printf("nryour serial is:%s",b);
              } 
              printf("nr");
              
          }//end of while(a!='e').
          
          printf("nrthe program is ended.");
          while(1);
      }
}

دانلود سورس کد

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

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

 

این مطلب را به اشتراک بگذارید:

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