NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2258 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 20 از 23

موضوع: Usb در بیست دقیقه

  1. #1
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    Thumbs up Usb در بیست دقیقه

    سلام

    این آموزش راه اندازی پورت usb stm32 برای کسانی آماده شده که می خوان از USB به عنوان یک روش راحت و ارزان برای ارتباط با PC استفاده کنن ولی از وارد شدن بهش کمی واهمه دارن.
    و ای کسانی تنها دلیلتون برای استفاده از AVR صرفه اقتصادیه (با کسانی که دلایل دیگه ای دارن کار ندارم) در حالی که با 20-15 چوخ یه میکرو و یه مبدل USB به Com برای چنین پروژه هایی استفاده می کنید
    برید آرم کار کنید که با 8 چوخ , هزار جور کار میکنه براتون.(اینو گفتم که اعلام انزجاری کرده باشم وگرنه که لایبرری USB برا AVR داریم هلو )

    استفاده از USB این روز ها خیلی ساده شده هم به خاطر لایبراری هایی که برای اپلیکیشن ها ایجاد شده (که ما قراره با libusbdotnet کار کنیم) و هم بخاطر توابعی که کامپایلر های میکروکنترولر ها برای این کار در نظر گرفتن.

    آموزشی که تو این تاپیک قرار دادم مرحله به مرحله ساخت یک usb Device هست که با نرم افزاری در کامپیوتر قراره ارتباط بر قرار کنه و یه سری دیتا بینشون رد و بدل شه

    قراره با میکروکنترولر STM32F103RBT6 و کامپایلر MikroC ARM و نرم افزار ویندوز مون هم با #Visual Studio C نوشته بشه.

    خب از برنامه و شماتیک میکروکنترولر شروع می کنیم , در کامپایلر MikroC ARM برای ساخت یه USB Device مراحل زیر باید طی شه:

    اول از همه MikroC رو باز و یه پروژه ایجاد کنید و سپس از منوی Tools بر روی گزینه HID Terminal کلیک کرده و پس از باز شدن پنجره HID Terminal پارامتر های زیر را وارد کنید:



    VID و PID ترجیحا همین ها باشن که گذاشتم ولی صاحب اختیاری هر عدد 16 بیتی در مبنای هگز خواستی وارد کنی.
    Report Length هم طول بافر های ارسال و دریافت هست که اینام فعلا بذار همین 64 باشه دنبال دردسر که نمی گردی اگه دنبال دردسر بودی که میکرو سی کار نمی کردی.
    Bus Powered هم که از اسمش معلومه , حد اکثر جریانی رو که Device ت قرار از پورت بکشه وارد کن.
    Endpoints ها رو هم بذار همین 1 باشن.
    Vendor name و Product Name هم که نام های تولید کننده و نام محصول هستن هرچه می خواهد دل تنگت بذار.
    برای این پارامتر هایی که گفتم اگه خواستی بدونی چی هستن تو نت مطلب هست , اگرم نخواستی که نخواستی.
    بعد وارد کردن پارامتر ها روی دکمه Save descriptor کلیک کرده و فایل USBdsc رو در پوشه پروژه تون save کنید.
    بعد از ذخیره فایل در محل پروژه , در پنجره Project Manager روی پوشه پروژه راست کلیک کرده و از طریق گزینه Add File To Project فایل ذخیره شده (USBdsc.c) رو به source های پروژه اضافه کنید و سپس USBdsc.c رو باز کنید و تغییرات زیر رو اعمال کنید:



    بایت USB_TRANSFER_TYPE رو که مقدارش به طور پیش فرض 0x03 بوده رو طبق عکس به 0x02 تغییر بدید (نوع انتقال دیتا با این بایت تعیین میشه که مقدار 3 وقفه ای هست و مقدار 2 توده ای)
    USB_INTERRUPT رو هم چون فعلا نمی خوایم از وقفه usb استفاده کنیم طبق عکس به 0 تغییر بدید.
    تغییرات اعمال شده رو ذخیره کنید.

    بعد از این نوبت به برنامه خودمون می رسه که به این صورت نوشته میشه
    (یه برنامه سادس که بعد از دریافت دیتا از USB , همان دیتای دریافت شده را به Port ارسال می کنه و سپس اگر شرط برقرار بود LED رو روشن و اگر اون یکی شرط برقرار بود LED رو خاموش می کنه):

    کد:
    sbit NoErrorLED at GPIOD_ODR.B2;
    
    char readbuff[64];
    char writebuff[64];
    
    void main() {
    
      GPIO_Config(&GPIOD_BASE,
      _GPIO_PINMASK_2 ,
      _GPIO_CFG_DIGITAL_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);
    
      HID_Enable(&readbuff,&writebuff);
    
      while(1) {
    
        USB_Polling_Proc();
    
        if(HID_Read()){
    
          if(StrCmp(readbuff,"LED ON") == 0)
            NoErrorLED = 1;
          else if(StrCmp(readbuff,"LED OFF") == 0)
            NoErrorLED = 0;
    
          HID_Write(&readbuff,64);
    
        }
    
      }
    
    }
    این از برنامه میکرو فقط حواستون باشه که کانفیگ کلاک میکرو جوری باشه که به واحد USB فرکانس 48MHz اعمال شه.
    برنامه رو کامپایل و میکرو رو پروگرام کنید.

    شماتیک قسمتی که به USB مربوط میشه:



    حالا بریم سراغ برنامه ای که قراره با نرم افزار Visual Studio 2013 نوشته شه :

    اول از همه برنامه LibUsbDotNet_Setup.2.2.8 رو که پیوست شده دانلود و نصب کنید (آخرین ورژن کلاس LibUsbDotNet رو هم از این لینک می تونید دانلود کنید)

    حالا یه پروژه windows form application به زبان #C با ویژوال استودیو ایجاد کنید و در قسمت Solution Explorer بر روی References کلیک راست کرده و ...Add Reference رو بزنید
    و در پنجره باز شده از طریق Browse فایل LibUsbDotNet.dll رو که در محل نصب LibUsbDotNet_Setup.2.2.8 قرار داره رو وارد برنامه کرده و تیکش رو بزنید و به ریفرنس ها اضافش کنید...

    بعد از این کار نوبت به نوشتن برنامه #C مون می رسه که سعی کردم به ساده ترین صورت ممکن نوشته شه و نیاز به توضیح نداشته باشه:

    کد:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using LibUsbDotNet;
    using LibUsbDotNet.Main;
    
    namespace Windows_Form_USB_App
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                int bytesRead;
                int bytesWritten;
                byte[] readBuffer = new byte[64];
                byte[] WriteBuffer = new byte[64];
    
                UsbDeviceFinder DeviceFinder = new UsbDeviceFinder(0x16C0, 0x05DC);
                UsbDevice Device = UsbDevice.OpenUsbDevice(DeviceFinder);
    
                if (Device == null)
                {
                    button1.Text = "Device Not Found.";
                    return;
                }
    
                IUsbDevice wholeUsbDevice = Device as IUsbDevice;
                if (!ReferenceEquals(wholeUsbDevice, null))
                {
                    wholeUsbDevice.SetConfiguration(1);
                    wholeUsbDevice.ClaimInterface(0);
                }
    
                UsbEndpointWriter Writer = Device.OpenEndpointWriter(WriteEndpointID.Ep01);
                UsbEndpointReader Reader = Device.OpenEndpointReader(ReadEndpointID.Ep01);
    
                Writer.Write(Encoding.Default.GetBytes(textBox1.Text + "\0"), 100, out bytesWritten);
                Reader.Read(readBuffer, 100, out bytesRead);
    
                textBox2.Text = Encoding.Default.GetString(readBuffer);
    
                if (Device != null)
                    button1.Text = "Device Found.";
    
            }
    
        }
    
    }
    در برنامه نوشته شده اگر در Textbox1 عبارت LED ON نوشته شود و روی button1 کلیک شود LED روشن شده و اگر LED OFF نوشته و ارسال شود LED متصل به میکرو خاموش می شود
    textbox2 هم دیتای دریافتی توسط نرم افزار را که همان دیتای ارسالیست (چون میکرو همان دیتا را بعد از دریافت ارسال می کند) نمایش می دهد.

    فقط یه نکته بگم با توجه به VID و PID یی که تو نرم افزار USB HID Terminal برا میکرو انتخاب کردیم , تو برنامه #C مون هم همین دو عدد رو باید به DeviceFinder بدیم که به این صورت در برنامه نوشته شده:

    کد:
    UsbDeviceFinder DeviceFinder = new UsbDeviceFinder(0x16C0, 0x05DC);
    و آخرین مرحله اضافه کردن درایور Libusb0.sys به لیست درایور های Device می باشد به این صورت که بعد از اتصال پورت USB بورد تون به PC با استفاده از نرم افزار install-filter-win که در محل نصب libusbdotnet قرار دارد Device تون رو انتخاب و درایور رو نصب می کنید تمام شد حالا می متونید نرم افزار #C رو باز و امتحان کنید. (اگه Device رو به پورت دیگه ای زدید که قبلا برای اون پورت درایور Libusb0.sys رو نصب نکرده بودید باید دوباره این مرحله آخر رو انجام بدید)

    همه فایل ها (پروژه MikroC , فایل نصب کتابخونه libusbdotnet و پروژه #C) پیوست شدن

    در نهایت تشکر می کنم از جناب esisafa و hessam2013 بخاطر کمک ها شون.

    امیدوارم استفاده ببرید و کاربردی باشه براتون.
    تصاوير کوچک فايل پيوست تصاوير کوچک فايل پيوست برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Untitled-3.jpg
مشاهده: 797
حجم: 28.0 کیلو بایت   برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Untitled-2.jpg
مشاهده: 757
حجم: 148.4 کیلو بایت   برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Untitled-1.jpg
مشاهده: 776
حجم: 50.7 کیلو بایت  
    فايل هاي پيوست شده فايل هاي پيوست شده
    ویرایش توسط sajjad_AD : 21-12-2014 در ساعت 14:33


  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  3. #2
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    سلام اجرتون با امام حسین (ع).
    توضیحاتتون عالیه واقعا ممنونم .
    من اولین باره با mikroc کار میکنم .تو همون قسمت اول گیر کردم !
    تو VID و PID نمیتونم عدد هگز بنویسم (C,D)
    توضیح اینکه سربرگ teminal رو تو همین قسمت اصلا دست نزدم میکرو رو باید به usb وصل کنیم بعد اینکارا رو انجام بدیم ؟(موس م که به صورت usb تو قسمت terminal بخش usb devicesاسمش اومده بود!منم جداش کردم )

  4. #3
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    سلام

    تو VID و PID نمیتونم عدد هگز بنویسم (C,D)
    مگه میشه نتونید این حروف رو تایپ کنید؟! با حروف بزرگ تایپ کن حتما می شه اگه غیر از این باشه دیگه نمیدونم

    توضیح اینکه سربرگ teminal رو تو همین قسمت اصلا دست نزدم میکرو رو باید به usb وصل کنیم بعد اینکارا رو انجام بدیم ؟(موس م که به صورت usb تو قسمت terminal بخش usb devicesاسمش اومده بود!منم جداش کردم )
    نه نیاز به جدا کردن هیچ Device یی هست نه متصل کردن میکرو , اون قسمتی هم که موس تو لیست هست مربوط به HID Terminal میشه و برای ارسال و دریافت دیتا بین PC و Device به کار میره یه چیزی شبیه به Hyperterminal
    ویرایش توسط sajjad_AD : 30-10-2014 در ساعت 18:49

  5. کاربران : 2 تشکر کرده اند از شما sajjad_AD برای ارسال این پست سودمند:


  6. #4
    کاربر علاقه مند NoBoko آواتار ها
    تاریخ عضویت
    Oct 2014
    نوشته ها
    80
    تشکر
    46
    تشکر شده 73 بار در 45 پست

    پیش فرض

    با تشکر از شما ...این هم یک مثال که با برد دیسکاوری که از VCP استفاده می کنه
    و نیازی به رفرنس و dll نیست
    http://www.4shared.com/rar/mVi5hwNX/CoIDE_USB_CDC_Example.html

  7. کاربران : 3 تشکر کرده اند از شما NoBoko برای ارسال این پست سودمند:


  8. #5
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    اون مشکلم رو حل کردم یه مشکل دیگه دارم ممنون میشم راهنمایی کنید .
    برنامه رو که build میکنم ارر دارم مربوط به کرک میشه ؟(ببخشید من تابحال با mikroc کار نکردم)



    بله مربوط به کرک بود حل شد .

    من مشکل unknown device دارم چیکار کنم ؟
    و اینکه اگه بخوایم مقادیر adc و تایمر رو از میکرو بفرستیم چیکار باید بکنیم ؟
    ویرایش توسط paradox7 : 31-10-2014 در ساعت 22:42

  9. #6
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    من مشکل unknown device دارم چیکار کنم ؟
    شما احتمالا کلاک USB رو 48MHz تنظیم نکردی برای این کار وقتی پروژه mikroC ت رو باز کردی از منوی Project گزینه Edit Project رو بزن
    پنجره پیکربندی میکرو باز میشه که باید با توجه به کریستال خارجی که به میکروت وصله رجیستر ها رو تنظیم کنی
    با فرض اینکه کریستال متصل به میکرو 8MHz هست و کلاک cpu رو 72MHz بخوایم تنظیم کنیم طبق این عکس مقادیر رو بذار (همه مقادیر عینا مثل عکس باشن غیر از PLL که با توجه به کریستال مقدار دهی میشه) :

    نام: Untitled-4.jpg نمایش: 626 اندازه: 93.6 کیلو بایت


    ضریب pll بر اساس کریستال متصل به میکرو انتخاب شده , با توجه به اینکه می خوایم کلاک CPU مقدارش 72MHz باشه پس ضریب PLL رو 9 قرار می دیم (8MHz * 9 = 72MHz)
    و با توجه به اینکه کلاک USB بر اساس تنظیمات انجام شده , از خروجی PLL تقسیم بر 1.5 بدست میاد پس کلاک USB برابر میشه با 72MHz / 1.5 = 48MHz
    بعد از اینکه تنظیمات لازم رو انجام دادی OK کن و برنامه رو دوباره کامپایل و میکرو رو پروگرام کن

    این مشکل رو حل کن تا بریم سراغ ارسال مقادیر ADC یا مثلا Timer
    ویرایش توسط sajjad_AD : 02-11-2014 در ساعت 02:38

  10. کاربران : 2 تشکر کرده اند از شما sajjad_AD برای ارسال این پست سودمند:


  11. #7
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    سلام مجدد ممنون بایت راهنماییتون .
    شماتیکusb من به این صورته(از فروشگاه خریدم )

    میکرو به عنوان دیوایس شناخته میشه ولی مشکل اینجاست که pd.2 من به usb وصله! اولش که میکرو رو وصل میکنم LEDروشنه بعد در textعبارت LED OFF رو که مینویسم عکس العملی نشون نمیده ولی وقتی LED ON رو مینویسم LED من خاموش میشه و usb قطع میشه !
    برنامه رو تغییر دادم و هرجا GPIOD نوشته شده بود رو کردم GPIOA چون رو PA.2 یه LED دارم وقتی usb رو وصل میکنم انگار نه انگار !هیچ اتفاقی نمی افته یعنی usb شناخته نمیشه !

  12. #8
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    میکرو به عنوان دیوایس شناخته میشه ولی مشکل اینجاست که pd.2 من به usb وصله! اولش که میکرو رو وصل میکنم LEDروشنه بعد در textعبارت LED OFF رو که مینویسم عکس العملی نشون نمیده ولی وقتی LED ON رو مینویسم LED من خاموش میشه و usb قطع میشه !
    برنامه رو تغییر دادم و هرجا GPIOD نوشته شده بود رو کردم GPIOA چون رو PA.2 یه LED دارم وقتی usb رو وصل میکنم انگار نه انگار !هیچ اتفاقی نمی افته یعنی usb شناخته نمیشه !
    حدس میزنم شما تو کانفیگ پورت ها دچار اشتباه شدی , این برنامه رو امتحان کن ( هر دو pin رو باید خروجی می کردی و PD2 باید صفر باشه ) :

    کد:
    char readbuff[64];
    char writebuff[64];
    
    void main() {
    
      GPIO_Config(&GPIOA_BASE,
      _GPIO_PINMASK_2 ,
      _GPIO_CFG_DIGITAL_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);
    
      GPIO_Config(&GPIOD_BASE,
      _GPIO_PINMASK_2 ,
      _GPIO_CFG_DIGITAL_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);
      
      GPIOD_ODR.B2 = 0;
      
      HID_Enable(&readbuff,&writebuff);
    
      while(1) {
    
        USB_Polling_Proc();
    
        if(HID_Read()){
    
          if(StrCmp(readbuff,"LED ON") == 0)
            GPIOA_ODR.B2 = 1;
          else if(StrCmp(readbuff,"LED OFF") == 0)
            GPIOA_ODR.B2 = 0;
    
          HID_Write(&readbuff,64);
    
        }
    
      }
    
    }
    ویرایش توسط sajjad_AD : 09-11-2014 در ساعت 00:44

  13. کاربران : 2 تشکر کرده اند از شما sajjad_AD برای ارسال این پست سودمند:


  14. #9
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    خیلی خیلی ممنونم جواب داد

    حواسم نبود که D رو کانفیگ نکردم

    میشه زود بریم سر آموزش ADC و تایمر؟

  15. #10
    تازه وارد
    تاریخ عضویت
    Sep 2013
    نوشته ها
    2
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام آیا با این روش میشه به حداکثر سرعت 12mbit/s رسید؟ و اگه نه پس چه طوری میشه به این سرعت رسید؟

  16. #11
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    خیلی خیلی ممنونم جواب داد
    خوب خدارو شکر منم

    نقل قول نوشته اصلی توسط paradox7 نمایش پست ها
    میشه زود بریم سر آموزش ADC و تایمر؟
    نه متاسفانه نمیشه خارج از بحث تاپیکه امااااااااااااااااا برای ارسال دیتا از سمت میکرو به PC باید یه سر فصل دیگه به این تاپیک usb در بیست دقیقه اضافه کنم اونم رویداد usb هست :

    فرض کنید قرار نیست از PC یه دیتا به Device ارسال و بلافاصله دیتا هایی رو از میکرو دریافت کنید و فقط قراره میکرو مثلا هر ثانیه یه دیتا به PC ارسال کنه , برای این کار از رویداد دریافت usb استفاده می کنیم
    وقتی این کار رو کنیم برنامه #C یی که نوشتیم به محض دریافت اطلاعات از USB رویداد دریافت رو فراخوانی می کنه ( یه چیزی تو مایه های وقفه ) و کدی رو که ما تو اون رویداد نوشتیم اجرا می کنه
    خوب برنامه #C مون به این صورت نوشته میشه اینم تا تونستم سادش کردم : (برنامه بعد از دریافت اطلاعات از Device هرچی دریافت کرده رو در textbox1 نمایش میده)

    کد:
    using System;
    using System.Windows.Forms;
    using LibUsbDotNet;
    using LibUsbDotNet.Main;
    
    namespace Windows_Form_USB_App
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                byte[] readBuffer = new byte[64];
                byte[] WriteBuffer = new byte[64];
    
                UsbDeviceFinder DeviceFinder = new UsbDeviceFinder(0x16C0, 0x05DC);
                UsbDevice Device = UsbDevice.OpenUsbDevice(DeviceFinder);
    
                if (Device == null)
                {
                    button1.Text = "Device Not Found.";
                    return;
                }
    
                IUsbDevice wholeUsbDevice = Device as IUsbDevice;
                if (!ReferenceEquals(wholeUsbDevice, null))
                {
                    wholeUsbDevice.SetConfiguration(1);
                    wholeUsbDevice.ClaimInterface(0);
                }
    
                UsbEndpointWriter Writer = Device.OpenEndpointWriter(WriteEndpointID.Ep01);
                UsbEndpointReader Reader = Device.OpenEndpointReader(ReadEndpointID.Ep01,64);
    
                Reader.DataReceived += Reader_DataReceived;
                Reader.DataReceivedEnabled = true;
    
                if (Device != null)
                    button1.Text = "Device Found.";
    
            }
    
            private void Reader_DataReceived(object sender, EndpointDataEventArgs e)
            {
    
                this.Invoke((MethodInvoker)delegate()
                {
                    textBox1.Text = System.Text.Encoding.Default.GetString(e.Buffer);
                });
    
            }
    
        }
    
    }
    برنامه میکرو هم برای اینکه کار شما راه بیوفته برا ارسال مقدار ADC مثال زدم به این صورته که هر ثانیه یه بار مقدار کانال ADC0 رو می خونه و به usb ارسال می کنه :

    کد:
    char readbuff[64];
    char writebuff[64];
    
    void main() {
    
      ADC1_Init();
      ADC_Set_Input_Channel(_ADC_CHANNEL_0);
    
      HID_Enable(&readbuff,&writebuff);
    
      while(1) {
    
        USB_Polling_Proc();
    
        //if(HID_Read()){
        
        //}
    
        IntToStr(ADC1_Get_Sample(0),writebuff);
    
        HID_Write(&writebuff,64);
        
        Delay_ms(1000);
    
      }
    
    }
    همین طور که می بینید از چشمک زن دو لامپی هم ساده تره

    فایل های این فصل هم پیوست شدن

    موفق باشید
    فايل هاي پيوست شده فايل هاي پيوست شده
    ویرایش توسط sajjad_AD : 23-11-2014 در ساعت 00:57

  17. کاربران : 3 تشکر کرده اند از شما sajjad_AD برای ارسال این پست سودمند:


  18. #12
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    نقل قول نوشته اصلی توسط glassybox نمایش پست ها
    سلام آیا با این روش میشه به حداکثر سرعت 12mbit/s رسید؟ و اگه نه پس چه طوری میشه به این سرعت رسید؟
    سلام
    حداکثر سرعتی که من بدست اوردم 3Mbit/s بود! شاید باید میکروی با فرکانس بالاتری استفاده شه مثلا STM32F2 به بالا

  19. #13
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    سلام
    ممنونم خیلی خیلی ممنونم که سوالامون رو پاسخ میدین.
    خودتون مثال event رو تست کردین ؟من تست کردم ولی pc نمیشناسه usbرو .پورت Dرو نباید کانفیگ کنیم ؟میشه دو تا برنامه رو هم مخلوط کرد دیگه؟

  20. #14
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    خواهش می کنم وظیفمه

    خودتون مثال event رو تست کردین ؟من تست کردم ولی pc نمیشناسه usbرو .پورت dرو نباید کانفیگ کنیم ؟
    بله معلومه که تست کردم و کار می کنه , در مورد پورت d فکر نمی کردم دیگه نیاز به خاطر نشان کردن باشه بله باید به صورت خروجی کانفیگش می کردی و مقدار 0 بهش میدادی عین قبل
    علتش اینه که پول آپ usb ت به واسطه مداری که براش طراحی شده به صفر بودن pd2 وابستس

    میشه دو تا برنامه رو هم مخلوط کرد دیگه؟
    بله میشه
    ویرایش توسط sajjad_AD : 08-11-2014 در ساعت 23:58

  21. تشکرها از این نوشته :


  22. #15
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    مشکل نشناخته شدن حل شد ممنونم .
    مشکل جدید اینجاست که من اصلا ADC رو وصل نکردم ولی عدد نشون میده !مشکل کجا میتونه باشه؟یعنی اصلا با ADC کار نداره !سنسور به ADCوصل کردم عدد درستی نشون نمیده !
    امتحان کردم اگه PA.0 رو کانفیگ کنم جواب میده یا نه به این صورت کانفیگ کردم
    کد:
        GPIO_Config(&GPIOA_BASE,
      _GPIO_PINMASK_0 ,
      _GPIO_CFG_ANALOG_INPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);
    ولی جواب نداد.

    (توضیح اینکه از فتوسل که سنسور نوره استفاده میکنم و قبلا ازش جواب گرفتم .میکرو من همstm32f103rb هستش و به PA.0 وصل کردم )
    ویرایش توسط paradox7 : 09-11-2014 در ساعت 22:28

  23. #16
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    سلام خسته نباشید و خدا قوت .یه سوال دیگه میشه بپرسم ؟
    میشه این فایل c. که ساخته شده رو هدر کرد و تو keil ازش استفاده کرد؟اگه نمیشه چطور میشه این برنامه رو تو keil نوشت ؟

  24. #17
    کاربر علاقه مند NoBoko آواتار ها
    تاریخ عضویت
    Oct 2014
    نوشته ها
    80
    تشکر
    46
    تشکر شده 73 بار در 45 پست

    پیش فرض

    از دوستان اگر کسی کد ارسال داده ADC به کامپیوتر از طریق USB با برد دیسکاوری stm32f4 توسط نرم افزار keil با سرعت بالا و کلاس VCP می خواد، منو پخ کنه...یعنی ایملشو واسم پخ کنه.
    البته با اجازه صاحب تاپیک.

  25. کاربران : 2 تشکر کرده اند از شما NoBoko برای ارسال این پست سودمند:


  26. #18
    مدیر باز نشسته behnam6500 آواتار ها
    تاریخ عضویت
    Jan 2009
    نوشته ها
    801
    تشکر
    311
    تشکر شده 899 بار در 390 پست

    پیش فرض

    سلام استاتید...

    مثالی از نحوه راه اندازی usb device در keil ندارید برای همین میکرو f103rbt6؟

  27. #19
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    اگر سافت پک های middleware و cmsis و میکرو مورد نظر رو نصب کنید، با استفاده از داکیومنت usb میتونید پروژه ایجاد کنید. نحوه ی ایجاد پروژه بسیار راحته در keil5.
    در سافت پک میکرو مورد نظر حتما مثال usb وجود داره

  28. کاربران : 3 تشکر کرده اند از شما esisafa برای ارسال این پست سودمند:


  29. #20
    تازه وارد
    تاریخ عضویت
    May 2016
    نوشته ها
    4
    تشکر
    0
    تشکر شده 1 بار در 1 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sajjad_ad نمایش پست ها
    سلام

    این آموزش راه اندازی پورت usb stm32 برای کسانی آماده شده که می خوان از usb به عنوان یک روش راحت و ارزان برای ارتباط با pc استفاده کنن ولی از وارد شدن بهش کمی واهمه دارن.
    و ای کسانی تنها دلیلتون برای استفاده از avr صرفه اقتصادیه (با کسانی که دلایل دیگه ای دارن کار ندارم) در حالی که با 20-15 چوخ یه میکرو و یه مبدل usb به com برای چنین پروژه هایی استفاده می کنید
    برید آرم کار کنید که با 8 چوخ , هزار جور کار میکنه براتون.(اینو گفتم که اعلام انزجاری کرده باشم وگرنه که لایبرری usb برا avr داریم هلو )

    استفاده از usb این روز ها خیلی ساده شده هم به خاطر لایبراری هایی که برای اپلیکیشن ها ایجاد شده (که ما قراره با libusbdotnet کار کنیم) و هم بخاطر توابعی که کامپایلر های میکروکنترولر ها برای این کار در نظر گرفتن.

    آموزشی که تو این تاپیک قرار دادم مرحله به مرحله ساخت یک usb device هست که با نرم افزاری در کامپیوتر قراره ارتباط بر قرار کنه و یه سری دیتا بینشون رد و بدل شه

    قراره با میکروکنترولر stm32f103rbt6 و کامپایلر mikroc arm و نرم افزار ویندوز مون هم با #visual studio c نوشته بشه.

    خب از برنامه و شماتیک میکروکنترولر شروع می کنیم , در کامپایلر mikroc arm برای ساخت یه usb device مراحل زیر باید طی شه:

    اول از همه mikroc رو باز و یه پروژه ایجاد کنید و سپس از منوی tools بر روی گزینه hid terminal کلیک کرده و پس از باز شدن پنجره hid terminal پارامتر های زیر را وارد کنید:



    vid و pid ترجیحا همین ها باشن که گذاشتم ولی صاحب اختیاری هر عدد 16 بیتی در مبنای هگز خواستی وارد کنی.
    Report length هم طول بافر های ارسال و دریافت هست که اینام فعلا بذار همین 64 باشه دنبال دردسر که نمی گردی اگه دنبال دردسر بودی که میکرو سی کار نمی کردی.
    Bus powered هم که از اسمش معلومه , حد اکثر جریانی رو که device ت قرار از پورت بکشه وارد کن.
    Endpoints ها رو هم بذار همین 1 باشن.
    Vendor name و product name هم که نام های تولید کننده و نام محصول هستن هرچه می خواهد دل تنگت بذار.
    برای این پارامتر هایی که گفتم اگه خواستی بدونی چی هستن تو نت مطلب هست , اگرم نخواستی که نخواستی.
    بعد وارد کردن پارامتر ها روی دکمه save descriptor کلیک کرده و فایل usbdsc رو در پوشه پروژه تون save کنید.
    بعد از ذخیره فایل در محل پروژه , در پنجره project manager روی پوشه پروژه راست کلیک کرده و از طریق گزینه add file to project فایل ذخیره شده (usbdsc.c) رو به source های پروژه اضافه کنید و سپس usbdsc.c رو باز کنید و تغییرات زیر رو اعمال کنید:



    بایت usb_transfer_type رو که مقدارش به طور پیش فرض 0x03 بوده رو طبق عکس به 0x02 تغییر بدید (نوع انتقال دیتا با این بایت تعیین میشه که مقدار 3 وقفه ای هست و مقدار 2 توده ای)
    usb_interrupt رو هم چون فعلا نمی خوایم از وقفه usb استفاده کنیم طبق عکس به 0 تغییر بدید.
    تغییرات اعمال شده رو ذخیره کنید.

    بعد از این نوبت به برنامه خودمون می رسه که به این صورت نوشته میشه
    (یه برنامه سادس که بعد از دریافت دیتا از usb , همان دیتای دریافت شده را به port ارسال می کنه و سپس اگر شرط برقرار بود led رو روشن و اگر اون یکی شرط برقرار بود led رو خاموش می کنه):

    کد:
    sbit noerrorled at gpiod_odr.b2;
    
    char readbuff[64];
    char writebuff[64];
    
    void main() {
    
      gpio_config(&gpiod_base,
      _gpio_pinmask_2 ,
      _gpio_cfg_digital_output | _gpio_cfg_speed_max | _gpio_cfg_otype_pp);
    
      hid_enable(&readbuff,&writebuff);
    
      while(1) {
    
        usb_polling_proc();
    
        if(hid_read()){
    
          if(strcmp(readbuff,"led on") == 0)
            noerrorled = 1;
          else if(strcmp(readbuff,"led off") == 0)
            noerrorled = 0;
    
          hid_write(&readbuff,64);
    
        }
    
      }
    
    }
    این از برنامه میکرو فقط حواستون باشه که کانفیگ کلاک میکرو جوری باشه که به واحد usb فرکانس 48mhz اعمال شه.
    برنامه رو کامپایل و میکرو رو پروگرام کنید.

    شماتیک قسمتی که به usb مربوط میشه:



    حالا بریم سراغ برنامه ای که قراره با نرم افزار visual studio 2013 نوشته شه :

    اول از همه برنامه libusbdotnet_setup.2.2.8 رو که پیوست شده دانلود و نصب کنید (آخرین ورژن کلاس libusbdotnet رو هم از این لینک می تونید دانلود کنید)

    حالا یه پروژه windows form application به زبان #c با ویژوال استودیو ایجاد کنید و در قسمت solution explorer بر روی references کلیک راست کرده و ...add reference رو بزنید
    و در پنجره باز شده از طریق browse فایل libusbdotnet.dll رو که در محل نصب libusbdotnet_setup.2.2.8 قرار داره رو وارد برنامه کرده و تیکش رو بزنید و به ریفرنس ها اضافش کنید...

    بعد از این کار نوبت به نوشتن برنامه #c مون می رسه که سعی کردم به ساده ترین صورت ممکن نوشته شه و نیاز به توضیح نداشته باشه:

    کد:
    using system;
    using system.collections.generic;
    using system.componentmodel;
    using system.data;
    using system.drawing;
    using system.linq;
    using system.text;
    using system.windows.forms;
    using libusbdotnet;
    using libusbdotnet.main;
    
    namespace windows_form_usb_app
    {
        public partial class form1 : Form
        {
            public form1()
            {
                initializecomponent();
            }
    
            private void form1_load(object sender, eventargs e)
            {
    
            }
    
            private void button1_click(object sender, eventargs e)
            {
    
                int bytesread;
                int byteswritten;
                byte[] readbuffer = new byte[64];
                byte[] writebuffer = new byte[64];
    
                usbdevicefinder devicefinder = new usbdevicefinder(0x16c0, 0x05dc);
                usbdevice device = usbdevice.openusbdevice(devicefinder);
    
                if (device == null)
                {
                    button1.text = "device not found.";
                    return;
                }
    
                iusbdevice wholeusbdevice = device as iusbdevice;
                if (!referenceequals(wholeusbdevice, null))
                {
                    wholeusbdevice.setconfiguration(1);
                    wholeusbdevice.claiminterface(0);
                }
    
                usbendpointwriter writer = device.openendpointwriter(writeendpointid.ep01);
                usbendpointreader reader = device.openendpointreader(readendpointid.ep01);
    
                writer.write(encoding.default.getbytes(textbox1.text + "\0"), 100, out byteswritten);
                reader.read(readbuffer, 100, out bytesread);
    
                textbox2.text = encoding.default.getstring(readbuffer);
    
                if (device != null)
                    button1.text = "device found.";
    
            }
    
        }
    
    }
    در برنامه نوشته شده اگر در textbox1 عبارت led on نوشته شود و روی button1 کلیک شود led روشن شده و اگر led off نوشته و ارسال شود led متصل به میکرو خاموش می شود
    textbox2 هم دیتای دریافتی توسط نرم افزار را که همان دیتای ارسالیست (چون میکرو همان دیتا را بعد از دریافت ارسال می کند) نمایش می دهد.

    فقط یه نکته بگم با توجه به vid و pid یی که تو نرم افزار usb hid terminal برا میکرو انتخاب کردیم , تو برنامه #c مون هم همین دو عدد رو باید به devicefinder بدیم که به این صورت در برنامه نوشته شده:

    کد:
    usbdevicefinder devicefinder = new usbdevicefinder(0x16c0, 0x05dc);
    و آخرین مرحله اضافه کردن درایور libusb0.sys به لیست درایور های device می باشد به این صورت که بعد از اتصال پورت usb بورد تون به pc با استفاده از نرم افزار install-filter-win که در محل نصب libusbdotnet قرار دارد device تون رو انتخاب و درایور رو نصب می کنید تمام شد حالا می متونید نرم افزار #c رو باز و امتحان کنید. (اگه device رو به پورت دیگه ای زدید که قبلا برای اون پورت درایور libusb0.sys رو نصب نکرده بودید باید دوباره این مرحله آخر رو انجام بدید)

    همه فایل ها (پروژه mikroc , فایل نصب کتابخونه libusbdotnet و پروژه #c) پیوست شدن

    در نهایت تشکر می کنم از جناب esisafa و hessam2013 بخاطر کمک ها شون.

    امیدوارم استفاده ببرید و کاربردی باشه براتون.

    دوست عزیر hid نباید نیاز به هیچ گونه نصب درایور داشته باشه .... میشه مثال بزنین که نیاز به نصب درایور نداشته باشه ؟؟؟؟

صفحه 1 از 2 12 آخرینآخرین

موضوعات مشابه

  1. خطای در طراحی ریست چه تاثیری داره
    توسط gbg در انجمن AT91 series (ATMEL)
    پاسخ: 6
    آخرين نوشته: 02-09-2013, 20:46
  2. چرا Mega16A در لیست کدویژون نیست ?
    توسط beroz در انجمن AVR
    پاسخ: 2
    آخرين نوشته: 20-09-2012, 12:54
  3. مدار ریست
    توسط hamid6568 در انجمن AVR
    پاسخ: 4
    آخرين نوشته: 06-08-2012, 20:54
  4. رادار چیست و چگونه کار می کند؟
    توسط arsalan681 در انجمن مخابرات
    پاسخ: 0
    آخرين نوشته: 24-04-2010, 20:34
  5. FFT چیست و چه کاربردی در الکترونیک داره ؟
    توسط bluestar در انجمن کنترل هوشمند و plc
    پاسخ: 3
    آخرين نوشته: 01-08-2009, 09:13

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •