پاسخ : obdev USB ** آموزش اتصال avr به پورت usb بدون آی سی واسط
فصل سوم : ساختار درایور OBdev USB
قسمت اول
خوب تو این فصل به سخت افزاری که گفتم احتیاج دارید، پس اگه تا الان نساختید عجله کنید.
اول این درایور رو دانلود کنید و توی یه پوشه unzip کنیدش.
چند تا پوشه می بینید :
circuits : چند مثال از سیم کشی و نحوه گرفتن تغذیه از خط usb برای Avr هستش.
examples : یه سری مثال نیمه سنگینه که بعدا بررسی می کنیمشون
و ...
اما پوشه ای که باهاش کار داریم :
usbdrv : شامل آنچه که باهاش کار داریم :agree: فایل های این پوشه رو باید خوب خوب بشناسید.
اول باید بگم که من تمام برنامه هام رو تو محیط Avr studio می نویسم و همونطور که خیلی ها نمیدونن از ورژن AVR Studio 4.13 به بعد این نزم افزار قابلیت تطبیق با WinAvr رو پیدا کرد و اگه این دو رو روی یه سیستم نصب کنید اتوماتیک WinAVR توی AvrStudio اضافه میشه و شما دیگه دغدغه ساخت makeFile و نبود شبیه ساز و ... رو ندارید.
حالا یه پروژه میسازیم و کار رو شروع می کنیم. (توضیح فایل های اون پوشه بماند بعدا) :

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

و بعد از اون پنجره AVR Gcc رو از مسیر View/Avr Gcc فعال می کنیم. توی این پنجره فایل ها دسته بندی شده هستند.
ابتدا از پوشه usbdrv در محل ایجاد پروژه کپی کنید و بعد مطابق شکل زیر فایل های درایور obdev را به پروژه اضافه کنید :


و بعدش هم باید به project\Configuration option بروید و دو تا کار بکنید. اول اینکه مقدار frequency رو برابر 12000000 قرار بدید و دوم اینکه پوشه usbdrv که کپیش کردید کنار پروژه رو به include directorys اضافه کنید.

حالا راجع به فایل usbconfig.h یه توضیحی بدم. این فایل در ابتدا وجود نداره و شما باید فایل usbconfig-prototype.h را تغییر نام بدید و به usbconfig.h تبدیل کنید.
محتویات فایل ها :
usbconfig.h : این فایل 99% چیزی هستش که باید از OBdev USB بدانید. پیکربندی سخت افزاری و device id و vendor id و manfacture name و خیلی دیگه از تنظیمات مربوط به obdev usb توی این فایل هستش. با بقیه فایل ها تقریبا کاری نداریم پس بریم سراغ این فایل :
پیکربندی سخت افزاری :
در قسمت Hardware Config در فایل usb config.h بروید. این قسمت شامل :
الف ) USB_CFG_IOPORTNAME که نام پورتی که پایه های -D و +D را نشان می دهد. از آنجا که در مدار مورد نظر ما (USB ASP) این پایه ها به پورت B وصل شده اند این آیتم را با B مقدار دهی می کنیم.
ب ) USB_CFG_DMINUS_BIT شماره بیتی از پورت مذکور که پایه -D به آن وصل شده. که باز هم در مدار مذکور می شود 0 . همچنین این پایه حتما باید دارای مقاومت Pullup حدود 1.5 کیلو باشد.
ج ) USB_CFG_DPLUS_BIT شماره بیتی از پورت مذکور که پایه +D به آن وصل شده. که باز هم در مدار مذکور می شود 1 . همچنین این پایه حتما باید پایه int0 نیز باشد یا به این پایه int0 نیز وصل باشد ، که در مدار ما راه دوم را انتخاب کرده، به همین دلیل پایه PD2 به PB1 وصل شده.
د ) USB_CFG_CLOCK_KHZ : بی خیالش

حالا اولین تست رو میگیریم. به فایل اصلی برنامه main.c یا هر چی که اسمش رو گذاشتید برگردید و برنامه زیر رو توش بریزید :
حالا ببینیم این برنامه چیه. اول اینکه این برنامه هیچ کاری انجام نمیده و تنها خودش رو به ویندوز معرفی می کنه و پنجره found new hardware میاد و ... اما :
در ابتدا باید تابع usbFunctionSetup رو معرفی کنم(تو فایل usbdrv.h کامل کامل توضیح داده) . هموت طوری که گفتیم اندپوینت شماره صفر همیشه باید وجود داشته باشه و از نوع کنترلی باشه. این تابع برای همین منظوره. به این ترتیب که obdev usb سعی می کنه تمام درخواست هایی که از جانب میزبان در مرحله setup فرستاده میشه رو خودش جواب بده. اما اگه خودش نتونست و از این بایت ها سر در نیاورد (تمام خواسته های استاندارد رو ساپورت می کنه و خواسته های من در آوردی رو سر در نمیاره) این تابع رو صدا می کنه و هشت بایتی رو که تو مرحله setup توسط کامپیوتر فرستاده شده رو به این تابع ارسال می کنه. شما موظفید که در این تابع این هشت بایت رو تجزیه کنید و :
الف ) اگر این خواسته نیاز به جواب داشت (یعنی بیتی که جهت انتقال مرحله بعد رو اعلام می کنه 1 بود و لازم بود تو مرحله تبادل داده اطلاعاتی به کامپیوتر ارسال بشه) دو راه برای پاسخ دادن بهش وجود داره:
1 : پوینتر usbMsgPtr رو به آرایه ای که جواب توی اون وجود داره ست کنیم و اندازه این آرایه رو برگردونیم
2: مقدار تعریف شده (define# شده) USB_NO_MSG رو بر گردونیم. در این صورت درایور برای مرحله تبادل داده تابع usbFunctionRead رو صدا می زنه. این تابع هم رفتار خاصی داره.
ب ) اگر خواسته نیاز به داده داشت ( یعنی مرحله دیتا نیز اطلاعاتی از کامپیوتر ارسال می شد) باید مقدار USB_NO_MSG را return کنید تا درایور برای مرحله داده تابع usbFunctionWrite را صدا کند. توضیخات مربوز به این تابع بماند.
توجه کنید که وجود دو تابع usbFunctionWrite و usbFunctionRead اختیاری است و شما می توانید مانند برنامه مثال من ، با return کردن 0 تمام این قضایا را ignor کنید. توجه کنید که خواسته هایی که obdev نمی تواند پاسخ دهد خواسته هایی هستند که برنامه ای که ما در کامپیوتر نوشتیم ارسال می کند. مثلا برای دماسنج می توانیم خواسته من در آوردی get_temprature را ارسال کنیم که ساختار زیر را برای آن در نظر گرفته ام :
خوب برای امروز بسته. شما توی همون فایل usbconfig.h باز بگردید و بیشتر آشنا بشید. vendor id و device id و ... دیگه چیزی نمونده. جلسه بعدی راجه به دو تابع usbFunctionWrite و usbFunctionRead بیشتر توضیح میدم و بعدش ان شاءالله اولین برنامه رو هم تو کامپیوتر و هم توی میکرو می نویسیم. توجه کنید که برنامه توی کامپیوتر رو با #C مینویسم. اگه از دوستان کسی بتونه برنامه رو با vb , VC++,C++ , delphi و ... بنویسه اعلام آمادگی کنه.
فصل سوم : ساختار درایور OBdev USB
قسمت اول
خوب تو این فصل به سخت افزاری که گفتم احتیاج دارید، پس اگه تا الان نساختید عجله کنید.
اول این درایور رو دانلود کنید و توی یه پوشه unzip کنیدش.
چند تا پوشه می بینید :
circuits : چند مثال از سیم کشی و نحوه گرفتن تغذیه از خط usb برای Avr هستش.
examples : یه سری مثال نیمه سنگینه که بعدا بررسی می کنیمشون
و ...
اما پوشه ای که باهاش کار داریم :
usbdrv : شامل آنچه که باهاش کار داریم :agree: فایل های این پوشه رو باید خوب خوب بشناسید.
اول باید بگم که من تمام برنامه هام رو تو محیط Avr studio می نویسم و همونطور که خیلی ها نمیدونن از ورژن AVR Studio 4.13 به بعد این نزم افزار قابلیت تطبیق با WinAvr رو پیدا کرد و اگه این دو رو روی یه سیستم نصب کنید اتوماتیک WinAVR توی AvrStudio اضافه میشه و شما دیگه دغدغه ساخت makeFile و نبود شبیه ساز و ... رو ندارید.
حالا یه پروژه میسازیم و کار رو شروع می کنیم. (توضیح فایل های اون پوشه بماند بعدا) :

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

و بعد از اون پنجره AVR Gcc رو از مسیر View/Avr Gcc فعال می کنیم. توی این پنجره فایل ها دسته بندی شده هستند.
ابتدا از پوشه usbdrv در محل ایجاد پروژه کپی کنید و بعد مطابق شکل زیر فایل های درایور obdev را به پروژه اضافه کنید :


و بعدش هم باید به project\Configuration option بروید و دو تا کار بکنید. اول اینکه مقدار frequency رو برابر 12000000 قرار بدید و دوم اینکه پوشه usbdrv که کپیش کردید کنار پروژه رو به include directorys اضافه کنید.

حالا راجع به فایل usbconfig.h یه توضیحی بدم. این فایل در ابتدا وجود نداره و شما باید فایل usbconfig-prototype.h را تغییر نام بدید و به usbconfig.h تبدیل کنید.
محتویات فایل ها :
usbconfig.h : این فایل 99% چیزی هستش که باید از OBdev USB بدانید. پیکربندی سخت افزاری و device id و vendor id و manfacture name و خیلی دیگه از تنظیمات مربوط به obdev usb توی این فایل هستش. با بقیه فایل ها تقریبا کاری نداریم پس بریم سراغ این فایل :
پیکربندی سخت افزاری :
در قسمت Hardware Config در فایل usb config.h بروید. این قسمت شامل :
الف ) USB_CFG_IOPORTNAME که نام پورتی که پایه های -D و +D را نشان می دهد. از آنجا که در مدار مورد نظر ما (USB ASP) این پایه ها به پورت B وصل شده اند این آیتم را با B مقدار دهی می کنیم.
ب ) USB_CFG_DMINUS_BIT شماره بیتی از پورت مذکور که پایه -D به آن وصل شده. که باز هم در مدار مذکور می شود 0 . همچنین این پایه حتما باید دارای مقاومت Pullup حدود 1.5 کیلو باشد.
ج ) USB_CFG_DPLUS_BIT شماره بیتی از پورت مذکور که پایه +D به آن وصل شده. که باز هم در مدار مذکور می شود 1 . همچنین این پایه حتما باید پایه int0 نیز باشد یا به این پایه int0 نیز وصل باشد ، که در مدار ما راه دوم را انتخاب کرده، به همین دلیل پایه PD2 به PB1 وصل شده.
د ) USB_CFG_CLOCK_KHZ : بی خیالش


حالا اولین تست رو میگیریم. به فایل اصلی برنامه main.c یا هر چی که اسمش رو گذاشتید برگردید و برنامه زیر رو توش بریزید :
کد:
#include "usbdrv.h" #include <avr/interrupt.h> uchar usbFunctionSetup(uchar data[8]) { return 0; } int main() { usbInit(); sei(); //enable all interrupts for(;;) { usbPoll(); } }
حالا ببینیم این برنامه چیه. اول اینکه این برنامه هیچ کاری انجام نمیده و تنها خودش رو به ویندوز معرفی می کنه و پنجره found new hardware میاد و ... اما :
در ابتدا باید تابع usbFunctionSetup رو معرفی کنم(تو فایل usbdrv.h کامل کامل توضیح داده) . هموت طوری که گفتیم اندپوینت شماره صفر همیشه باید وجود داشته باشه و از نوع کنترلی باشه. این تابع برای همین منظوره. به این ترتیب که obdev usb سعی می کنه تمام درخواست هایی که از جانب میزبان در مرحله setup فرستاده میشه رو خودش جواب بده. اما اگه خودش نتونست و از این بایت ها سر در نیاورد (تمام خواسته های استاندارد رو ساپورت می کنه و خواسته های من در آوردی رو سر در نمیاره) این تابع رو صدا می کنه و هشت بایتی رو که تو مرحله setup توسط کامپیوتر فرستاده شده رو به این تابع ارسال می کنه. شما موظفید که در این تابع این هشت بایت رو تجزیه کنید و :
الف ) اگر این خواسته نیاز به جواب داشت (یعنی بیتی که جهت انتقال مرحله بعد رو اعلام می کنه 1 بود و لازم بود تو مرحله تبادل داده اطلاعاتی به کامپیوتر ارسال بشه) دو راه برای پاسخ دادن بهش وجود داره:
1 : پوینتر usbMsgPtr رو به آرایه ای که جواب توی اون وجود داره ست کنیم و اندازه این آرایه رو برگردونیم
کد:
char arr[8]; uchar usbFunctionSetup(uchar data[8]) { usbMsgPtr = arr; return 5; }
2: مقدار تعریف شده (define# شده) USB_NO_MSG رو بر گردونیم. در این صورت درایور برای مرحله تبادل داده تابع usbFunctionRead رو صدا می زنه. این تابع هم رفتار خاصی داره.
ب ) اگر خواسته نیاز به داده داشت ( یعنی مرحله دیتا نیز اطلاعاتی از کامپیوتر ارسال می شد) باید مقدار USB_NO_MSG را return کنید تا درایور برای مرحله داده تابع usbFunctionWrite را صدا کند. توضیخات مربوز به این تابع بماند.
توجه کنید که وجود دو تابع usbFunctionWrite و usbFunctionRead اختیاری است و شما می توانید مانند برنامه مثال من ، با return کردن 0 تمام این قضایا را ignor کنید. توجه کنید که خواسته هایی که obdev نمی تواند پاسخ دهد خواسته هایی هستند که برنامه ای که ما در کامپیوتر نوشتیم ارسال می کند. مثلا برای دماسنج می توانیم خواسته من در آوردی get_temprature را ارسال کنیم که ساختار زیر را برای آن در نظر گرفته ام :
کد:
bmRequestType = 0xc0 //dev->host,vendor,device bRequest = 0xaa //man dar avardi Wvalu = ...//no important for man daravardi WIndex = ...//no important for man daravardi WLenght = ...//no important for man daravardi
خوب برای امروز بسته. شما توی همون فایل usbconfig.h باز بگردید و بیشتر آشنا بشید. vendor id و device id و ... دیگه چیزی نمونده. جلسه بعدی راجه به دو تابع usbFunctionWrite و usbFunctionRead بیشتر توضیح میدم و بعدش ان شاءالله اولین برنامه رو هم تو کامپیوتر و هم توی میکرو می نویسیم. توجه کنید که برنامه توی کامپیوتر رو با #C مینویسم. اگه از دوستان کسی بتونه برنامه رو با vb , VC++,C++ , delphi و ... بنویسه اعلام آمادگی کنه.
دیدگاه