امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
کار با V-USB
نویسنده پیام
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #1
Cool  کار با V-USB
می دونین توی اینترنت پر شده که برای ارتباط با USB بی واسطه از این کتابخونه استفاده بشه ولی خوب جایی نگفته خوب حالا چی کارش کنیم ، چه جوری راش بندازیم ، درایور براش بسازیم و اینا ... پس دادا بهزاد اینجا میاد و در یک حرکت انقلابی اینا رو آموزش میده
نکته: شاید توی سایت های خارجی هم دیده باشید ولی در ورژن های جدید کامپایلر GCC و AVRSTUDIO تغییراتی ایجاد شده که ملت رو سردر گم کرده و مانع از کامپایل شدن این کتاب خونه میشه! و امروز کل وقتم سر همین بود که این مشکلات رو برطرف کنم پس اگر امتحان دارید فردا حتما این مطلب رو بخونیدBiggrin
مواد لازم :
1- AVRSTUDIO یا هر کامپایلر AVR-GCC
2- CODE::BLOCKS یا هر کامپایلر C دیگه ای مانند dev-c++
3- پروگرامر
4- یه بردی که بشه روش پروژه رو پیاده کرد
5- کتابخانه V-USB
6- کتابخانه LIBUSB-WIN32
این کتابخانه رو نمیتوان در پروتئوس شبیه سازی کرد!
حتما باید بسازیدش.
اینا رو که دانلود کردید
یکی از عکس های داخل پوشه "vusb-20121206\circuits" رو بسازید
و تا صبح غاز بچرونید تا ادامه رو بگم
قسمت های 5 و 6 رو از ضمینه هم میتونید بگیرید


فایل‌(های) پیوست شده
.rar   Files.rar (اندازه: 1.27 MB / تعداد دفعات دریافت: 546)

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
(آخرین ویرایش در این ارسال: ۱۲-دى-۱۳۹۱, ۰۸:۴۳:۵۹، توسط behzady.)
۱۲-دى-۱۳۹۱, ۰۱:۳۹:۵۸
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sharin, salehjg, delazad, babyy, aKaReZa75, رسول, WhiteNoise, asd123zxc, nasras2010, a.mehran, 09156042917, Danielwept, Stevenfak
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #2
RE: کار با V-USB
خوب
اول توی AVRSTUDIO یه پروژه باز کنید
از داخل پوشه "vusb-20121206\usbdrv" فایل های متنی (.TXT) رو حذف کنید و سپس همه ی فایل هارو داخل پوشه پروژه کپی کنید.
بعد از منوی سمت راست AVRSTUDIO زیر سلوشن روی پروژه راست کلیک کنید(ایکون نارنجی رنگ) و در ADD گزینه ی EXISTING item رو انتخاب کنید و در پوشه ای که کپی کرده اید تمامی اون فایل هارو انتخاب کنید.
در سمت راست فایل های اضافه شده رو مشاهده می کنید روی "usbconfig-prototype.h" کلیک کرده و به "usbconfig.h"
تغییر نام بدید و روی اون کلیک کنید تا باز شود دنبال این قسمت بگردید
کد:
#define USB_CFG_IOPORTNAME D
#define USB_CFG_DMINUS_BIT 4
#define USB_CFG_DPLUS_BIT 2
#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
خوب مشخه دیگه D- یو اس بی به پین 4 و D+ به پین 2 وصل شده شما میتونید D- رو به دلخواه عوض کنید ولی D+ باید به INT0 وصل باشه
اون آخری هم سرعت USB رو مشخص میکنه زیرش نوشته چه سرعت هایی در دست رس هستند و شما کلاک میکرو رو باید طبق اون ها تنظیم کنید و البته بعدش خودتون تقسیم رو انجام بدید و مقدارش رو بزارید.
من به این تغییرش دادم
کد:
#define USB_CFG_IOPORTNAME D
#define USB_CFG_DMINUS_BIT 3
#define USB_CFG_DPLUS_BIT 2
#define USB_CFG_CLOCK_KHZ 12000
همون طور که مشخصه من کلاک میکرو رو 12MHz فرض کردم
خوب پایین بیاید تا به این قسمت ها برسید
کد:
#define USB_CFG_IS_SELF_POWERED 0
#define USB_CFG_MAX_BUS_POWER 100
خوب اگه برد شما تغذیه جدا داره اولی رو یک کنید وگرنه در قسمت دوم میزان جریانی که می کشه رو بنویسید (سعی کنید درست بنویسید)
خوب منم به اون تغییری نمی دم و میرم قسمت بعد
کد:
#define USB_CFG_DEVICE_ID 0xdc, 0x05 /* = 0x05dc = 1500
#define USB_CFG_DEVICE_VERSION 0x00, 0x01
#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't'
#define USB_CFG_VENDOR_NAME_LEN 8
#define USB_CFG_DEVICE_NAME 'T', 'e', 'm', 'p', 'l', 'a', 't', 'e'
#define USB_CFG_DEVICE_NAME_LEN 8#define USB_CFG_DEVICE_NAME_LEN 10
دو قسمت اول رو به هرچی که دلتون خواست نمی تونید تغییر بدید پولیه!
ولی ما از همون ها استفاده می کنیم البته توی "USB-IDs-for-free.txt" که توی قسمت قبل پاک کردیم میتونید از مجانی هاش استفاده کنیم
دو قسمت بعدی نام دستگاه و نام فروشنده هست به هرچی خواستید تغییر بدید فقط به شکل وارد کردنشون توجه کنید وبعد در قسمت های پایینش طولش رو تغییر بدید
در زیر اینها شما می تونید سریال نامبر هم به دستگاه بدید که فعلا توی قسمت توضیحات هست و این یعنی از سریال نامبر استفاده نمیشه منم استفاده نمی کنم چون بعد توی ادرس دهیش یه ذره کارمون زیاد میشه
خوب میریم سراغ برنامه اصلی این برنامه ی زیر رو من از یه سایت های آموزشی کپی کردم
کد:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

#include "usbdrv.h"

#define F_CPU 12000000L
#include <util/delay.h>

USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) {
return 0; // do nothing for now
}

int main() {
uchar i;

wdt_enable(WDTO_1S); // enable 1s watchdog timer

usbInit();

usbDeviceDisconnect(); // enforce re-enumeration
for(i = 0; i<250; i++) { // wait 500 ms
wdt_reset(); // keep the watchdog happy
_delay_ms(2);
}
usbDeviceConnect();

sei(); // Enable interrupts after re-enumeration

while(1) {
wdt_reset(); // keep the watchdog happy
usbPoll();
}

return 0;
}
حالا لازمه تغییراتی رو که باید بدید رو بگم تا با AVRSTUDIO سازگار بشه
همچنین اصلا چی کار میکنه
کد بالا رو به این تغییر بدید
کد:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#define F_CPU 12000000L
#include <util/delay.h>
#include "usbdrv.h"
extern unsigned char usbFunctionSetup(unsigned char data[8]) {
return 0; // do nothing for now
}

int main() {
unsigned char i;

wdt_enable(WDTO_1S); // enable 1s watchdog timer

usbInit();

usbDeviceDisconnect(); // enforce re-enumeration
for(i = 0; i<250; i++) { // wait 500 ms
wdt_reset(); // keep the watchdog happy
_delay_ms(2);
}
usbDeviceConnect();

sei(); // Enable interrupts after re-enumeration

while(1) {
wdt_reset(); // keep the watchdog happy
usbPoll();
}

return 0;
}
در کل میگم چه تغییراتی دادم
هر وقت خواستید برنامه ای بنویسید فقط توی برنامه خودتون جای "USB_PUBLIC" ها "extern" بزارید
همچنین جای "uchar" عبارت "unsigned char" رو بزارید
و به همین ترتیب
کد:
schar signed char
هیچ وقت هم فایل هارو فقط include نکنین بعدش همون طوری که گفتم به پروژه هم اضافشون هم بکنید
حالا توضیح
اولکه تابع "usbFunctionSetup()" درخواست های USB رو بررسی میکنه که ما فعلا کاری نداشتیم و سریع بازگشت رو زدیم
بعد هم تایمر واچداگ رو برای 1 ثانیه تنظیم کردیم
همون طوری که میدونین چون این کتابخانه نرم افزاری هست و سخت افزاری نیست ممکنه باگ داشته باشه همچنین وقتی ما برای کامپیوتر برنامه میریزیم یا ممکنه وست انتقال قطع بشه و ... این باعث میشه میکروگیر کنه اینو میزاریم که میکرو رو ریست کنه
اینمم "usbInit()" که مشخصه!
این "usbDeviceDisconnect()" باعث قطع ارتباط اجباری میشه
این "usbDeviceConnect()" مارو وصل میکنه توجه داشته باشید که حداقل 100ms صبر کنید بعد وصل بشید
بعد هم که وقفه رو فعال میکنیم (پس از هر بار قطع شدن وقفه خودش قطع میشه ما باید دوباره وصلش کنیم)
بعد هم که تا همیشه تایمر رو ریست میکنه و ارتباط با usb رو حفظ میکنه حالا اینو کامپایل بکنید و روی avr بریزید و بعد که وصل کردید به کامپیوتر باید صدای وصل شدن usb رو بشنوید و مطابق انتظار ارور پیدا نشدن درایور مورد نیاز.
تا بریم مرحله بعد ....
(این داستان ادامه دارد ...

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
(آخرین ویرایش در این ارسال: ۱۲-دى-۱۳۹۱, ۰۹:۲۶:۳۳، توسط behzady.)
۱۲-دى-۱۳۹۱, ۰۹:۲۴:۵۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : omid_phoenix, sharin, salehjg, delazad, babyy, رسول, WhiteNoise, nasras2010, alimogmov, 09156042917, Danielwept, lillieei3
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #3
RE: کار با V-USB
خوب دیروز قرار بود ادامه رو بزاریم اینترنت قطع بود
انشا الله که با صدای اتصال حال کردید Biggrin
برای درایور پس از باز کردن LIBUSB-WIN32 به این ادرس برید "libusb-win32-bin-1.2.6.0\bin" و "inf-wizard.exe" را اجرا کنید گزینه ای که مربوط به دستگاه شما هست رو انتخاب کنید و تا تهش بعدی رو بزنید Biggrin
درایور شما آماده است یا اونو در اخرین صفحه برنامه نصب کنید(گزینه داره) یا اونجایی که زدید فایل ها نصب بشن فایل نصب رو اجرا کنید یا دیوایس منیجر.
حالا این بار که دستگاه رو وصل کنید (در ددن) درایور دستگاه شما نصب گردید Biggrin
-
حالا قبل از شروع برنامه نویسی ویندوز دوباره به برنامه میکرو میریم تا حداقل یه LED رو برامون خاموش روشن بکنه Biggrin
تابعی که مربوط به مدیریت درخواست ها بود رو اینگونه تغییر بدید
کد:
extern unsigned char usbFunctionSetup(unsigned char data[8]) {

usbRequest_t *rq = (void *)data; // cast data to correct type

switch(rq->bRequest) { // custom command is in the bRequest field

case 1:

LED1(1);

return 0;

case 0:

LED1(0);

return 0;
}

return 0;
}
جای LED1 پورت های مورد نظر رو بنویسید فقط از قبل خروجی باشن ها!
نکته (کسی اگه میدونه "rq->bRequest" چه کاری میکنه به ما هم بگه از این جهت که توی اکثر برنامه ها بود و ما هم جواب گرفتیم استفاده میکنیم ولی نفهمیدم چه کاری میکنه!Biggrin)
خوب برنامه رو پروگرام بکنید و بریم برای ویندوز

برای برنامه ویندوز با فقط به دو فایل نیاز داریم
در این پوشه "\libusb-win32-bin-1.2.6.0\include" فایل "lusb0_usb.h" رو به "usb.h" تفغییر نام بدید و در محل برنامه ی ویندوز ببرید
در "libusb-win32-bin-1.2.6.0\lib\dynamic" هم فایل "libusb_dyn.c" رو به "libusb.c" تغییر نام بدید و به همون جا بروید
حال یه پروژه توی CODE::BLOCKS ایجاد کنید و اون فایل ها هم همونجا باشه
دو باره این کد رو کپی پیست کردم و تغییرات رو توش دادم از همون سایت قبلی
کد:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* this is libusb, see http://libusb.sourceforge.net/ */
#include "usb.h"

// Same as in main.c
#define USB_LED_OFF 0
#define USB_LED_ON 1

/* Used to get descriptor strings for device identification */
static int usbGetDescriptorString(usb_dev_handle *dev, int index, int langid,
char *buf, int buflen) {
char buffer[256];
int rval, i;


// make standard request GET_DESCRIPTOR, type string and given index
// (e.g. dev->iProduct)

rval = usb_control_msg(dev,
USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid,
buffer, sizeof(buffer), 1000);

if(rval < 0) // error


return rval;


// rval should be bytes read, but buffer[0] contains the actual response size

if((unsigned char)buffer[0] < rval)


rval = (unsigned char)buffer[0]; // string is shorter than bytes read



if(buffer[1] != USB_DT_STRING) // second byte is the data type


return 0; // invalid return type




// we're dealing with UTF-16LE here so actual chars is half of rval,

// and index 0 doesn't count

rval /= 2;



/* lossy conversion to ISO Latin1 */

for(i = 1; i < rval && i < buflen; i++) {


if(buffer[2 * i + 1] == 0)



buf[i-1] = buffer[2 * i];


else



buf[i-1] = '?'; /* outside of ISO Latin1 range */

}

buf[i-1] = 0;



return i-1;
}

static usb_dev_handle * usbOpenDevice(int vendor, char *vendorName,
int product, char *productName) {

struct usb_bus *bus;

struct usb_device *dev;

char devVendor[256], devProduct[256];


usb_dev_handle * handle = NULL;



usb_init();

usb_find_busses();

usb_find_devices();



for(bus=usb_get_busses(); bus; bus=bus->next) {


for(dev=bus->devices; dev; dev=dev->next) {






if(dev->descriptor.idVendor != vendor ||
dev->descriptor.idProduct != product)
continue;

/* we need to open the device in order to query strings */
if(!(handle = usb_open(dev))) {
fprintf(stderr, "Warning: cannot open USB device: %s\n",
usb_strerror());
continue;
}

/* get vendor name */
if(usbGetDescriptorString(handle, dev->descriptor.iManufacturer, 0x0409, devVendor, sizeof(devVendor)) < 0) {
fprintf(stderr,
"Warning: cannot query manufacturer for device: %s\n",
usb_strerror());
usb_close(handle);
continue;
}

/* get product name */
if(usbGetDescriptorString(handle, dev->descriptor.iProduct,
0x0409, devProduct, sizeof(devVendor)) < 0) {
fprintf(stderr,
"Warning: cannot query product for device: %s\n",
usb_strerror());
usb_close(handle);
continue;
}

if(strcmp(devVendor, vendorName) == 0 &&
strcmp(devProduct, productName) == 0)
return handle;
else
usb_close(handle);


}

}



return NULL;
}

int main(int argc, char **argv) {

usb_dev_handle *handle = NULL;
int nBytes = 0;
char buffer[256];


if(argc < 2) {


printf("Usage:\n");


printf("usbtext.exe on\n");


printf("usbtext.exe off\n");


exit(1);

}



handle = usbOpenDevice(0x16C0, "نام سازنده اینجا", 0x05DC, "نام دستگاه اینجا");



if(handle == NULL) {


fprintf(stderr, "Could not find USB device!\n");


exit(1);

}


if(strcmp(argv[1], "on") == 0) {


nBytes = usb_control_msg(handle,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,



USB_LED_ON, 0, 0, (char *)buffer, sizeof(buffer), 5000);

} else if(strcmp(argv[1], "off") == 0) {


nBytes = usb_control_msg(handle,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,



USB_LED_OFF, 0, 0, (char *)buffer, sizeof(buffer), 5000);

}



if(nBytes < 0)


fprintf(stderr, "USB error: %s\n", usb_strerror());




usb_close(handle);



return 0;
}
توضیحات رو توی یه پست جدید میدم زیاد میشهBiggrin
فقط در قسمت نام دستگاه و نام سازنده رو به دستگاه خودتون تغییر بدید اگه ID ها رو هم تغییر دادید باید اونجا تغییرات رو اعمال کنید.
فعلا اینو کامپایل کنید
توی CMD این برنامه رو با پارامتر های "on" و "off" فراخوانی کنید تا نتیجه رو ببینید و ذوق مرگ بشید Biggrin

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
(آخرین ویرایش در این ارسال: ۱۴-دى-۱۳۹۱, ۰۸:۳۷:۴۷، توسط behzady.)
۱۴-دى-۱۳۹۱, ۰۸:۳۶:۵۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sharin, salehjg, delazad, babyy, رسول, WhiteNoise, nasras2010, 09156042917, vahiddigi
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #4
RE: کار با V-USB
خوب برای توضیحات
(برای اطلاعات کامل به این لینک که توضیحات کامل کتابخانه ی LIBUSB-WIN32 هست بروید)
اما توضیحات غیر کامل Biggrin
ما برای انتقال اطلاعات از تابع "usb_control_msg" استفاده میکنیم که این تابع به ترتیب به این بلاک ها نیاز دارد
"usb_dev_handle *dev"
"int requesttype"
"int request"
"int value"
"int index"
"char *bytes"
" int size"
"int timeout"
و خروجی تابع تعداد بایت نوشته شده یا خوانده شده است اگر مقدار منفی باز گرداند نشانه ی خطایی می باشد
اول نیاز است که ما مانند پورت سریال دسگاه خود را به اصطلاح باز کنیم و همانطوری که دیدیم برای انتقال داده نیاز به handle دستگاه خود داریم برای همین از تابع زیر استفاده میکنیم که به دنبال دستگاهی با مشخصات داده شده بگردد
کد:
static usb_dev_handle * usbOpenDevice(int vendor, char *vendorName,
int product, char *productName) {
struct usb_bus *bus;
struct usb_device *dev;
char devVendor[256], devProduct[256];

usb_dev_handle * handle = NULL;

usb_init();
usb_find_busses();
usb_find_devices();

for(bus=usb_get_busses(); bus; bus=bus->next) {
for(dev=bus->devices; dev; dev=dev->next) {
if(dev->descriptor.idVendor != vendor ||
dev->descriptor.idProduct != product)
continue;

/* we need to open the device in order to query strings */
if(!(handle = usb_open(dev))) {
fprintf(stderr, "Warning: cannot open USB device: %sn",
usb_strerror());
continue;
}

/* get vendor name */
if(usbGetDescriptorString(handle, dev->descriptor.iManufacturer,
0x0409, devVendor, sizeof(devVendor)) < 0) {
fprintf(stderr,
"Warning: cannot query manufacturer for device: %sn",
usb_strerror());
usb_close(handle);
continue;
}

/* get product name */
if(usbGetDescriptorString(handle, dev->descriptor.iProduct,
0x0409, devProduct, sizeof(devVendor)) < 0) {
fprintf(stderr,
"Warning: cannot query product for device: %sn",
usb_strerror());
usb_close(handle);
continue;
}

if(strcmp(devVendor, vendorName) == 0 &&
strcmp(devProduct, productName) == 0)
return handle;
else
usb_close(handle);
}
}

return NULL;
}
اما این یکی اطلاعات دستگاهی که دارای handle داده شده است را بر میگرداند (در تابع قبلی از این تابع استفاده کردیم تا به دنبال دستگاه خود بگردیم
کد:
/* Used to get descriptor strings for device identification */
static int usbGetDescriptorString(usb_dev_handle *dev, int index, int langid,
char *buf, int buflen) {
char buffer[256];
int rval, i;

// make standard request GET_DESCRIPTOR, type string and given index
// (e.g. dev->iProduct)
rval = usb_control_msg(dev,
USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid,
buffer, sizeof(buffer), 1000);

if(rval < 0) // error
return rval;

// rval should be bytes read, but buffer[0] contains the actual response size
if((unsigned char)buffer[0] < rval)
rval = (unsigned char)buffer[0]; // string is shorter than bytes read

if(buffer[1] != USB_DT_STRING) // second byte is the data type
return 0; // invalid return type

// we're dealing with UTF-16LE here so actual chars is half of rval,
// and index 0 doesn't count
rval /= 2;

/* lossy conversion to ISO Latin1 */
for(i = 1; i < rval && i < buflen; i++) {
if(buffer[2 * i + 1] == 0)
buf[i-1] = buffer[2 * i];
else
buf[i-1] = '?'; /* outside of ISO Latin1 range */
}
buf[i-1] = 0;

return i-1;
}
روش کار این دو تابع به این صورت است که کلا handle های تمامی دستگاه ها را پیدا می کند و به ترتیب خصوصیاتشان را می خواند تا دستگاهی که خصوصیات یکسانی با درخواست ما دارند را پیدا کند و سپس هندل انرا برای ما باز گرداند
این دو رو به برنامه اضافه می کنیم
توضیح : این دو دستور درون کتابخانه های V-USB وجود دارند و از آنجا استخراج شده اند درصورت تمایل به این آدرس بروید "vusb-20121206\libs-host" و دو فایل "opendevice.h" و "opendevice.c" درون پوشه برنامه خود کپی کنید و به برنامه اضافه کنید البته نام آن ها همان توابع ما نیستند
اما در برنامه در تابع main
قسمت اول که ما بررسی می کنیم اگر داده های وارده درست نباشند توضیحات را نمایش دهد
اما بعد از آن با هندل دسگاهمان را پیدا می کنیم بعد بررسی می کنیم ورودی ما on بوده است یا off
و با استفاده از تابع "usb_control_msg" داده خود را انتقال میدهیم
اولین ورودی که هندل برنامه ی ما است و دومی نوع در خواست است و بعدی درخواست ما و سه تای بعدی مربوط به داده ی ما می باشد و اخری مدت زمانی که منتظر می مانیم
توجه کنید که اکنون درواقع ما داده ای انتقال نمی دهیم و از دستگاه درخواستی داریم برای همین متغییر های اخری صفر هستند و دو تای آخری متغییر های داده ی ما هستند که اندازه و تعدادشان فرستاده میشه ولی در دستگاه ما فقط برنامه ای برای مدیریت درخواست ها نویشه ایم
در اخر هم اگر تعداد داده برگشت داده نشده نشانه از خطا است
پایان برنامه نیز دستگاه خود را به اصطلاح می بندیم.
ادامه دارد ...
انتقال داده به دستگاه و بلعکس ...

یه یه یک هفته ای ادامه نمی دم امتحانام پشت سر هم هست ادامه برای هفته آینده

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
(آخرین ویرایش در این ارسال: ۱۶-دى-۱۳۹۱, ۰۱:۱۴:۱۷، توسط behzady.)
۱۴-دى-۱۳۹۱, ۱۷:۲۴:۳۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sharin, salehjg, delazad, babyy, رسول, WhiteNoise, nasras2010, 09156042917, TrevorCica, vahiddigi
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #5
RE: کار با V-USB
خوب اینم آخرین قسمت ارسال و در یافت داده
دیگه بقیه رو هم مثل HID و انتقال تعداد زیاد تری از داده و اینا اگه استقبال شد میزارم
اول از همه ارسال داده از دستگاه به رایانه
1- "usbFunctionRead" رو خودتون بنویسید (اگه حالشو دارید!)
2- متغیری به نام "usbMsgPtr" هست که میتونید ادرس اسرم رو بهش بدید تا داده رو بفرسته
ماهم که معلومه روش دوم رو انتخاب می کنیمBiggrin
به برنامه ی میکرو اینارو اضافه می کنیم
کد:
#define USB_DATA_OUT 2
static unsigned char replyBuf[16] = "Hello,IRANLED!";
حالا به برنامه ی خودمون در تابع "usbFunctionSetup()" این حالت رو هم اضافه می کنیم
کد:
case USB_DATA_OUT: // send data to PC
        usbMsgPtr = &replyBuf;
        return sizeof(replyBuf);
حالا توی برنامه ی رایانه اون جایی که بررسی می کردیم on با off گرفتیم این کد رو اضافه میکنیم تا یه حالت دیگه رو هم بررسی بکنه
کد:
} else if(strcmp(argv[1], "out") == 0) {
        nBytes = usb_control_msg(handle,
            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
            USB_DATA_OUT, 0, 0, (char *)buffer, sizeof(buffer), 5000);
        printf("Got %d bytes: %sn", nBytes, buffer);
    }
فقط حواستون باشه اگه داده زیاد می فرستید یا میگیرید یه جوری حساب کنید SRAM پر نشه
-------
حالا دریافت داده از رایانه
یکی از راحت ترین کار ها استفاده از دو متغییر "wValue" و "wIndex" هست البته یه محدودیتی داره اونم اینه که فقط 4 بایت رو میشه هم زمان انتقال داد!
حالا بریم و توی هر دوتابرنامه اینو اضافه کنید
کد:
#define USB_DATA_WRITE 3
و توس برنامه ی میکرو این حالت رو دوباره به همون تابع قبلی اضافه می کنیم
کد:
case USB_DATA_WRITE: // modify reply buffer
        replyBuf[7] = rq->wValue.bytes[0];
        replyBuf[8] = rq->wValue.bytes[1];
        replyBuf[9] = rq->wIndex.bytes[0];
        replyBuf[10] = rq->wIndex.bytes[1];
        return 0;
توجه کنید اینا انیون هستن اگه خواستید با ".word" کل 16 بیت رو هم بخونید
توی قسمت رایانه هم این کد رو دوباره به ادامه ی قسمت قبل اضافه کنید
کد:
} else if(strcmp(argv[1], "write") == 0) {
        nBytes = usb_control_msg(handle,
            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
            USB_DATA_WRITE, 'I' + ('R' << 8), 'A' + ('N' << 8),
            (char *)buffer, sizeof(buffer), 5000);
    }
توجه کنید دیگه یه جوری که میدونین داده یه دریافت شده رو نمایش بدید ولی یادتون باشه چون توی همون متغییر قبلی مینویسیم اگه دوباره از میکرو داده بخونید یه متن جدید نمایش داده میشه که این قبلی وسط هست پس اگه خواستید میتونید بعد از نمایش دوباره متغییر رو به متن قبلی برگردونید
-----
اما اگه خواستیم داده ی بیشتری انتقال بدیم
اینو به برنامه کامپیوتر اضافه کنید
کد:
#define USB_DATA_IN 4
دوباره این رو هم به بقیه برنامه اضافه کنید تا دوباره یه حالت دیگه رو هم بررسی بکنه
کد:
} else if(strcmp(argv[1], "in") == 0 && argc > 2) {
        nBytes = usb_control_msg(handle,
            USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
            USB_DATA_IN, 0, 0, argv[2], strlen(argv[2])+1, 5000);
    }
حالا وقتی شما توی CMD برنامه رو ران بکنی با in بعدش هم باید متنی که میخوای رو بنویسی
یادتون باشه که حداکثر 16 بایت رو میتونید انتقال بدید
اما توی میکرو اینا رو اضافه کنید
کد:
#define USB_DATA_IN 4
static unsigned char dataReceived = 0, dataLength = 0; // for USB_DATA_IN
و دو باره به اون جایی که حالت ها رو بررسی میکرد این رو هم اضافه می کنیم
کد:
case USB_DATA_IN: // receive data from PC
        dataLength = (uchar)rq->wLength.word;
        dataReceived = 0;
                
        if(dataLength > sizeof(replyBuf)) // limit to buffer size
            dataLength = sizeof(replyBuf);
                        
        return USB_NO_MSG; // usbFunctionWrite will be called now
حالا همون طوری که نوشتم یه تابعی به نام "usbFunctionWrite " اجرا میشه تا داده رو بخونه
پس تابع رو اینطوری تعریف میکنیم
کد:
extern unsigned char usbFunctionWrite(unsigned *data, unsigned len) {
    unsigned i;
                        
    for(i = 0; dataReceived < dataLength && i < len; i++, dataReceived++)
        replyBuf[dataReceived] = data[i];
                
    return (dataReceived == dataLength); // 1 if we received it all, 0 if not
}
توی فایل "usbconfig.h" هم به دنبال متن زیر برید و تغییرش بدید
کد:
#define USB_CFG_IMPLEMENT_FN_WRITE      1
این به برنامه میگه یه همچین تابعی برای خوندن اضافه کردیم
به سلامتی کار ما تموم شد اگه خیلی توضیح ندادم منا رو بر این گذاشتم که دیگه مقدمات رو میدونید و با دیدن کد ها خیلی چیز هارو می فهمید وگرنه خیلی پست هام طولانی میشد ولی به هرحال مشکلی بود بگید تا توضیح بدم

اینی که کسی بین پست های من چیزی نگفته یا اینه که ملت برد رو نساختن یا موضوع جالب نبوده ولی به هر حال قدردانی میکنم که جلوی خودتون رو گرفتید تا آموزش پشت سر هم باشه و کامل باشه.
از توجه شما سپاس گزاریم [تصویر:  471616_s050.gif] (اینم شکلک های جدیدBiggrin)
یا حق ...

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
(آخرین ویرایش در این ارسال: ۱۹-دى-۱۳۹۱, ۱۴:۰۷:۲۷، توسط behzady.)
۱۸-دى-۱۳۹۱, ۱۲:۵۹:۳۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sharin, MPC, salehjg, babyy, رسول, WhiteNoise, nasras2010, sorodi, 09156042917, Russellel, Williamnada, vahiddigi
afshinmar آفلاین
تازه وارد

ارسال‌ها: 3
موضوع‌ها: 0
تاریخ عضویت: اسفند ۱۳۹۱

تشکرها : 1
( 4 تشکر در 1 ارسال )
ارسال: #6
RE: کار با V-USB
بهزاد جان بسیار ممنونم از زحماتت بسیار عالی بود یه خواهشی ازت داشتم من همه این کار هارو کردم فقط نمی دونم چطوری باید از طریق یه اپلیکیشن بتونم رو EEPROM میکرو بخونم و بنویسم.
مثلا می خوام یه برنامه توی دلفی بنویسم و با همین مداری که گذاشتین و درایورش هم HID است EEPROM رو بخونم و بنویسم ودیتا بفرستم.
مهندس من از شما سپاس گذارم
۲۰-اسفند-۱۳۹۱, ۱۶:۵۹:۴۵
ارسال‌ها
پاسخ
تشکر شده توسط : 09156042917, Edwardnum
behzady آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,169
موضوع‌ها: 57
تاریخ عضویت: آبان ۱۳۹۰

تشکرها : 4094
( 6339 تشکر در 2085 ارسال )
ارسال: #7
RE: کار با V-USB
(۲۰-اسفند-۱۳۹۱, ۱۶:۵۹:۴۵)afshinmar نوشته است: بهزاد جان بسیار ممنونم از زحماتت بسیار عالی بود یه خواهشی ازت داشتم من همه این کار هارو کردم فقط نمی دونم چطوری باید از طریق یه اپلیکیشن بتونم رو EEPROM میکرو بخونم و بنویسم.
مثلا می خوام یه برنامه توی دلفی بنویسم و با همین مداری که گذاشتین و درایورش هم HID است EEPROM رو بخونم و بنویسم ودیتا بفرستم.
مهندس من از شما سپاس گذارم
شما یک بایت رو اختصاص بده به خواندن یا نوشتن
چند بایت هم برای آدرس حافظه بسته به نیاز
یک بایت هم برای نوشتن داده
اینا رو به صورت آرایه تعریف کن
اون طرف توی میکرو اگه دستور نوشتن بود اون عنصر ارایه رو توی ادرس خواسته شده بنویس
اگه خواندن بود دوباره اونو بخون و مقدار بایت اخری رو تغییر بده و دوباره بفرست
اگه کار با EEPROM رو بلد نیستی برو به اینجا

به همه عشق بورز، به معدودی اعتماد کن و در حق کسی بدی نکن.
ویلیام شکسپیر

نباید ایمان به انسانیت را از دست دهید. انسانیت یک اقیانوس است؛ اگر قطرات اندکی از اقیانوس کثیف است، اقیانوس کثیف نمی‌شود.
مهاتما گاندی

يَا أَيُّهَا الَّذِينَ آمَنُواْ اسْتَعِينُواْ بِالصَّبْرِ وَالصَّلاَةِ إِنَّ اللّهَ مَعَ الصَّابِرِينَ
۲۰-اسفند-۱۳۹۱, ۱۷:۳۷:۰۸
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy, WhiteNoise, afshinmar, 09156042917, vahiddigi
asd123zxc آفلاین
تازه وارد

ارسال‌ها: 1
موضوع‌ها: 0
تاریخ عضویت: آذر ۱۳۸۹

تشکرها : 1
( 5 تشکر در 1 ارسال )
ارسال: #8
RE: کار با V-USB
سلام behzady . همین الان می خواستم یه آموزش واسه کار کردن با vusb در AtmelStudio6 بذارم که دیدیم شما نوشتینش و خیلی هم خوب نوشتی.
بعد از این که با قابلیت های VUSB آشنا شدیم باید بدونیم که خود USB چطور کار می کنه و در واقع پروتکل ارتباطیش چیه
یه سایت خیلی خوب و ساده برای یادگیری usb رو براتون میذارم که خودم خیلی ازش استفاده کردم:
http://www.usbmadesimple.co.uk/index.html
۱۱-فروردین-۱۳۹۲, ۰۲:۴۲:۴۹
ارسال‌ها
پاسخ
تشکر شده توسط : behzady, nasras2010, 09156042917, ninamw16, Patrickea
sorodi آفلاین
تازه وارد

ارسال‌ها: 2
موضوع‌ها: 0
تاریخ عضویت: تير ۱۳۹۳

تشکرها : 1
( 11 تشکر در 2 ارسال )
ارسال: #9
درایور ویندوز 7
اول تشکر کنم که زحمت کشیدید بطور کامل این پروژه را توضیح دادید و من حتم دارم پروژه اجرایی خواهد بود و من اشکالی در کارم هست اینکه هرکاری می کنم تمی تونم درایور دستگاه را روی ویندوز 7 32 یا 64 بیتی نصب کنم و همواره بصورت unknown device در divice manager ظاهر می شود خیلی موارد را هنگام پروگرام کردن رعایت کردم مانند فیوز بیت ها کریستال خارجی و قرار دادن یکه کریستال خارجی روی پروگرامر progisp اما نمیشه که نمیشه ولتاژ گیری 3.6 روی زنر که به d- وصل خلاصه همین جا درجا می زنم اگر راهی برای اینکه مدار چک شود وجوددارد خوشحال می شوم راهنمایی شوم و اگر نحوه پروگرام مشکلی وجود دارد آیا می توان از کریستال داخلی با فرکانس 16Mhz برای اینکار بهره برد؟
۲۱-شهریور-۱۳۹۳, ۱۷:۳۳:۰۱
ارسال‌ها
پاسخ
تشکر شده توسط : a.mehran, 09156042917, AlonzoSr, Hubertrem
sorodi آفلاین
تازه وارد

ارسال‌ها: 2
موضوع‌ها: 0
تاریخ عضویت: تير ۱۳۹۳

تشکرها : 1
( 11 تشکر در 2 ارسال )
ارسال: #10
RE: کار با V-USB
تشکر مجدد می کنم از نویسنده مطلب و بگم بیشتر از یکماه بود که موفق به شناساندن دستگاه به ویندوز نشده بودم و مشکل را حل کردم و وظیفه خودم دونستم که اینرا بگم شاید دوستان دیگه با این مشکل مواجه شوند اینکه من ارتباط D- را به پایه 14 PB0 ICP و D+ را همزمان به پایه 15 PB01 OC1A و پایه 4 PD2 INT0 وصل نمودم و مشکل حل شد
۲۸-آبان-۱۳۹۳, ۱۴:۱۶:۴۵
ارسال‌ها
پاسخ
تشکر شده توسط : a.mehran, didar1386, 09156042917, Russellel, Williamnada, Edwardnum, Danielwept
MILAD KH آفلاین
تازه وارد

ارسال‌ها: 1
موضوع‌ها: 0
تاریخ عضویت: اردیبهشت ۱۳۹۱

تشکرها : 0
( 3 تشکر در 1 ارسال )
ارسال: #11
RE: کار با V-USB
سلام.آقا بهزاد سوالی داشتم از خدمت شما:
من برنامه اصلی که برای آی سی نوشته اید رو با کدبلاکز آوردم بالا ولی ارور پیدا نکردن کامپایلر رو میده؟
اصلا اون برنامه اصلی رو باید با این نرم افزار کامپایل کنم یا با نرم افزار کدویژن هم میشه؟
چطور برنامه رو بریزم توی میکرو؟ پروگرمر stk 200/300 هم دارم.

لطفا به ایمیل بنده جواب رو بدید : khodabandehmilad1370@gmail.com
یا که اگر زحمتی نیست بیاید توی واتس اپ 9186317614
تشکر
(آخرین ویرایش در این ارسال: ۱۶-بهمن-۱۳۹۳, ۱۹:۰۴:۰۳، توسط MILAD KH.)
۱۶-بهمن-۱۳۹۳, ۱۷:۳۶:۵۳
ارسال‌ها
پاسخ
تشکر شده توسط : patricelg18, Russellel, Hubertrem


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS