اطلاعیه

Collapse
No announcement yet.

کار با پورت USB میکرو های سری AT90USB

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #61
    پاسخ : کار با پورت USB میکرو های سری AT90USB

    نوشته اصلی توسط mojtaba_led
    خوب این داره میگه که متغیر key تعریف نشده، مسالتون، شما کل اون کد اولی رو به با این دومی جایگزین کردی؟ اگه میتونی کلا برنامه ات رو بزار تا من هم کامپایل کنم.

    والا من تاحالا با اینا کار نکردم ولی احتمالا یکسری کامند باشه که بشه براشون ارسال کرد تا مثلا این دیبانس رو تنظیم کرد باید بسرچی، اگه سوال داشتی برو تو گروه lufa اونجا بپرس زودتر به جواب میرسی:
    http://groups.google.com/group/lufa-support

    در مورد چراغ ها هم بله میشه روشن خاموششون کرد یکسری کامند هست که با فرستادن اونا میتونی باهشون هر کدوم از چراغ ها را خواستی خاموش و روشن کنی یه راهنمایی میکنم ببین خودت میتونی راهش بندازی یا نه، باید از تابع HID_Host_SendReportByID استفاده کنی، برو توی اون آموزش تحت وب lufa اینو سرچ کن ببین میتونی عملکردش رو متوجه بشی، بعد باهاش میتونی چراغ ها رو خاموش و روشن کنی.
    کد:
    #include "profix.h"
    /** Main program entry point. This routine configures the hardware required by the application, then
     * enters a loop to run the application tasks in sequence.
     */
    
    
    int main(void)
    {
    	SetupHardware();
    
    	puts_P(PSTR(ESC_FG_CYAN "Keyboard Host Demo running.\r\n" ESC_FG_WHITE));
    
    	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
    	GlobalInterruptEnable();
    
    	for (;;)
    	{
    		KeyboardHost_Task();
    
    		HID_Host_USBTask(&Keyboard_HID_Interface);
    		USB_USBTask();
    	}
    }
    
    /** Configures the board hardware and chip peripherals for the demo's functionality. */
    void SetupHardware(void)
    {
    #if (ARCH == ARCH_AVR8)
    	/* Disable watchdog if enabled by bootloader/fuses */
    	MCUSR &= ~(1 << WDRF);
    	wdt_disable();
    
    	/* Disable clock division */
    	clock_prescale_set(clock_div_1);
    #endif
    
    	/* Hardware Initialization */
    	Serial_Init(9600, false);
    	LEDs_Init();
    	USB_Init();
    
    	/* Create a stdio stream for the serial port for stdin and stdout */
    	Serial_CreateStream(NULL);
    }
    
    /** Task to manage an enumerated USB keyboard once connected, to display key state
     * data as it is received.
     */
    void KeyboardHost_Task(void)
    {
    	uint8_t Key;
    	if (USB_HostState != HOST_STATE_Configured)
    	 return;
    	if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
    	{
    		USB_KeyboardReport_Data_t KeyboardReport;
    		HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
    		LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
    		Key = KeyboardReport.KeyCode[0];
    		if (Key)
    		{
    			if	(key >= HID_KEYBOARD_SC_KEYPAD_1_AND_END &&
    				 key <= HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP)
    			{
    				if	  (key == HID_KEYBOARD_SC_KEYPAD_1_AND_END)putchar('1');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW)putchar('2');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN)putchar('3');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW)putchar('4');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_5)putchar('5');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW)putchar('6');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_7_AND_HOME)putchar('7');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW)putchar('8');
    				else if(key == HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP)putchar('9');
    			}
    			else if(key == HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT)putchar('0');
    			else if(key == HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE)putchar('.');
    			else if(key == HID_KEYBOARD_SC_KEYPAD_SLASH)putchar('/');
    			else if(key == HID_KEYBOARD_SC_KEYPAD_ASTERISK)putchar('*');
    			else if(key == HID_KEYBOARD_SC_KEYPAD_MINUS)putchar('-');
    			else if(key == HID_KEYBOARD_SC_KEYPAD_PLUS)putchar('+');
    			else if(key == HID_KEYBOARD_SC_KEYPAD_ENTER)putchar('E');
    			else if(key == HID_KEYBOARD_SC_BACKSPACE)putchar('B');
    			else if(key == HID_KEYBOARD_SC_NUM_LOCK)putchar('N');
    			putchar(0x0A);
    			putchar(0x0D);
    		}
    	}
    }
    این هم کل برنامم
    فایلهای دیگه رو دستکاری نکردم همونا هستند
    ولی من تعداد شرط ها رو کمتر کردم دیدم اون خطا رفت
    یا همون قسمتی که دستور شرطی رو گذاشتم اگر حذفش کنم خطا دیگه نمیده :angry:
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      #62
      پاسخ : کار با پورت USB میکرو های سری AT90USB

      اخبی، موقع کد نوشتن عجله نکن!!!

      key رو Key تعریف کردی! بعد امدی key استفاده کردی!

      دیدگاه


        #63
        پاسخ : کار با پورت USB میکرو های سری AT90USB

        LUFA رو میتونید راحت به اتمل استدیو 6.1 و 6.2 اضافه کنید
        https://gallery.atmel.com/Products/Details/d1057c19-3815-487e-baa7-0001985c6901
        گام به گام هم گفته چیکار کنید
        کتابخونه به اتمل اضافه میشه و پروژه آماده متناسب با کاری که میخوایم رو خودش ایجاد میکنه
        حتی هلپش به هلپ اتمل استدیو اضافه میشه
        نــــ_ـــمـــ_ــــیــــ_ـــدونـــــ_ــم.....

        دیدگاه


          #64
          پاسخ : کار با پورت USB میکرو های سری AT90USB

          سلام دوست خوبم
          خوب هستید؟
          نماز روزه هاتون قبول باشه ...

          آقا مجتبی یه مشکل برام پیش اومده ... به خدا دارم دیوونه میشم ... :angry: :angry: :angry: :angry::
          چه کیبرد رو به مدار وصل کنم یا نکنم باز هم مینیویسه Device Attached و هر یک ثانیه یک بار تکرار میشه ...
          نمیدونم چه مرگش شده ...
          قبلا هم کار میکرد ... ولی الان خیلی بهم گیر داده ...
          نظرتون چیه ؟؟؟
          مشکل از کجا میتونه باشه ...؟؟؟
          UVCC رو که قطع میکنم دیگه کار نمیکنه ... ولی تا این پایه رو به VCC وصلش میکنم مینیویسه Device Attached و همینطور تکرار میشه ...
          ولتاژ VBUS هم اندازه گرفتم 3.3 ولت هست
          به نظرتون مشکل نرم افزاریه ؟؟؟

          راستی
          میتونه مشکل از اینجا باشه که اگر نوک هویه رو روی پایه ها زیاد نگه داشته باشم اینجوری شده باشه ؟؟؟
          یا اینکه با بلوور (هویه بادی) زیاد روش نگه داشته باشم اینجوری شده باشه ؟؟؟
          دمای بلوور هم روی 500 درجه تنظیم کرده بودم ...
          پیشاپیش از کمکتون ممنون ...
          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
          معرفی نرم افزار Codewizard PWM
          با من بیشتر آشنا شوید

          دیدگاه


            #65
            پاسخ : کار با پورت USB میکرو های سری AT90USB

            سلام
            ممنون. همچنین. والا چی بگم ولی احتمالا همون مشکل سخت افزاری باشه. پایه های دیتا اتصالی ندارن احیانا؟ در مورد هیتر نمیدونم من از هویه برای لحیم کاری استفاده میکنم. ولی مثلا برای در اوردن قطعه هم بیشتر از 400 استفاده نکردم. ولی خوب قطعات الکترونیکی یه حد دمایی هم برای لحیم کاری دارن که تو دیتا شیت قید میشه. البته من زیاد تو کار لحیم کاری و اینا نیستم از این چیزا زیاد سر در نمیارم.

            دیدگاه


              #66
              پاسخ : کار با پورت USB میکرو های سری AT90USB

              نوشته اصلی توسط مجتبی-
              سلام
              ممنون. همچنین. والا چی بگم ولی احتمالا همون مشکل سخت افزاری باشه. پایه های دیتا اتصالی ندارن احیانا؟ در مورد هیتر نمیدونم من از هویه برای لحیم کاری استفاده میکنم. ولی مثلا برای در اوردن قطعه هم بیشتر از 400 استفاده نکردم. ولی خوب قطعات الکترونیکی یه حد دمایی هم برای لحیم کاری دارن که تو دیتا شیت قید میشه. البته من زیاد تو کار لحیم کاری و اینا نیستم از این چیزا زیاد سر در نمیارم.
              هیچ امیدی نداشتم که پاسخ من رو بدید :biggrin: چون از 2 تیر تا الان تو انجمن نیومده بودید ... :redface:
              به هر صورت ممنون

              خیر ... همه سالم هستند ...
              لحیم کاری مشکلی نداره ...
              فقط من توی PCB کردن یادم رفته بود که VBUS و AVCC رو به VCC وصل کنم ... دوتا سیم نازک از روی پایه های آی سی وصل کردم به VCC ...
              من حدس میزنم واسه روغن لحیمی باشه که زیر آی سی مونده وشاید هم زیر پایه هاش ...
              البته من همه رو با اسپری خشک ناهید پاک کردم ... ولی زیر میکرو مطمئن هستم که روغن لحیم زیاد باشه ...

              چند تا سوال
              1-اگر با مولتی متر روی حالت دیودی وصلش کنم به دو پایه دیتا USB مشکلی برای میکرو به وجود نمیاد ؟؟
              2-ولتاژ هر دو پایه دیتا USB مقدار 3.3ولت رو نشون میده ... این دوپایه باید ولتاژشون اینقدر باشه ؟؟
              3- کجای دیتاشیت نوشته که چقدر باید دما بدیم به آی سی ؟؟ پیدا نکردم ...
              [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
              معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
              معرفی نرم افزار Codewizard PWM
              با من بیشتر آشنا شوید

              دیدگاه


                #67
                پاسخ : کار با پورت USB میکرو های سری AT90USB

                خوب دیگه شما مشمول امدادهای غیبی شدید!!! روغن لحیم بعید نیست برای من که خیلی اتفاق افتاده. سوال اول رو متوجه نشدم. پایه های دیتا که فکر کنم سطح ولتاژشون با توجه به ولتاژ باس که 5 هست باید 5 ولت باشه و البته فکر نمکنم بشه که با ولت متر دید چون با فرکانس زیادی داره سطح ولتاژ تغییر میکنه بین 0 و 5 باید از اسکوپ استفاده کرد. سوال سوم هم همون Storage temperature هست جناب "mohsen++" تو یکی از تاپیک ها اینو رو به من گفتن منم از اونجا تو ذهنم مونده. به نظر من هم از روغن لحیم باشه یه بار قشنگ میکرو رو بکنید بعد بورد رو با الکل بشورید بعد بدون روغن لحیم اش کنید.

                دیدگاه


                  #68
                  پاسخ : کار با پورت USB میکرو های سری AT90USB

                  نوشته اصلی توسط مجتبی-
                  خوب دیگه شما مشمول امدادهای غیبی شدید!!!
                  واقعا ... :nice:

                  نوشته اصلی توسط مجتبی-
                  سوال اول رو متوجه نشدم.
                  شما گفتید
                  نوشته اصلی توسط مجتبی-
                  پایه های دیتا اتصالی ندارن احیانا؟
                  میخوام بدونم که چون مولتی متر با باتری 9ولت کار میکنه و اگر این رو به پایه های دیتا بزنم که ببینم به هم وصل هستند یا نه میکرو نمی سوزه ؟؟
                  میترسم بسوزه ...

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

                  درسته ؟؟؟

                  نوشته اصلی توسط مجتبی-
                  پایه های دیتا که فکر کنم سطح ولتاژشون با توجه به ولتاژ باس که 5 هست باید 5 ولت باشه و البته فکر نمکنم بشه که با ولت متر دید چون با فرکانس زیادی داره سطح ولتاژ تغییر میکنه بین 0 و 5 باید از اسکوپ استفاده کرد.
                  موقعی که هاست آزاد هست که ولتاژش تغییر نمیکنه ... درسته ؟؟ من ولتاژ 3.3 را موقعی که هاست بدون دستگاه هست اندازه گرفتم ...
                  [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                  معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                  معرفی نرم افزار Codewizard PWM
                  با من بیشتر آشنا شوید

                  دیدگاه


                    #69
                    پاسخ : کار با پورت USB میکرو های سری AT90USB

                    در مورد مولتی متر بعید میدونم البته من مدار داخل مولتی متر رو نمیدونم چطوریه ولی اگر ولتاژ زیادی تو این حالت میوفتاد سرش باید led رو که بهش وصل میکنیم بسوزونه اما این اتفاق نمی افته و چون برای تست اتصال کوتاه هست بنابراین جریانش حتما کنترل شده است. در مورد ولتاژ پین های داده بله حق باشماست. در مورد آخر هم نمیدونم من اطلاعی در مورد نحوه عملکرد لایه فیزیکال usb ندارم نمیدونم چجوریه شاید حق با شما باشه برای اطلاعات بیشتر usb specification رو مطالعه کنید. در کل شرمنده من اطلاعاتم در مورد usb محدود به سطوح بالای برنامه نویسی با همین lufa میشه و البته دست و پا شکسته.

                    دیدگاه


                      #70
                      پاسخ : کار با پورت USB میکرو های سری AT90USB

                      نوشته اصلی توسط مجتبی-
                      در مورد مولتی متر بعید میدونم البته من مدار داخل مولتی متر رو نمیدونم چطوریه ولی اگر ولتاژ زیادی تو این حالت میوفتاد سرش باید led رو که بهش وصل میکنیم بسوزونه اما این اتفاق نمی افته و چون برای تست اتصال کوتاه هست بنابراین جریانش حتما کنترل شده است. در مورد ولتاژ پین های داده بله حق باشماست. در مورد آخر هم نمیدونم من اطلاعی در مورد نحوه عملکرد لایه فیزیکال usb ندارم نمیدونم چجوریه شاید حق با شما باشه برای اطلاعات بیشتر usb specification رو مطالعه کنید. در کل شرمنده من اطلاعاتم در مورد usb محدود به سطوح بالای برنامه نویسی با همین lufa میشه و البته دست و پا شکسته.
                      تا همینجاش هم خیلی بهم کمک کردید
                      و من خیلی شرمندتون هستیم ...
                      خدا خیرتون بده ...
                      انشالا که عوضش هم ببینید ...
                      الان با مولتی متر تست کردم دیدم یه مقاومتی رو نشون میده که این نشون میده به هم وصل نیستند ...
                      راستی
                      چند سوال تخصصی
                      به نظر شما بهتر این نیست که VBUS رو به VCAP وصل کنیم ؟؟(البته میدونم که طبق دیتاشیت و حرفهای شما باید به VCC متصل بشه)
                      موقعی که میکرو رو برای USB تنظیم میکنم میکرو یه کوچولو گرم میشه ... واسه شما هم همینطوری بود ؟؟فکر کنم واسه رگولاتور داخلی باشه
                      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                      معرفی نرم افزار Codewizard PWM
                      با من بیشتر آشنا شوید

                      دیدگاه


                        #71
                        پاسخ : کار با پورت USB میکرو های سری AT90USB

                        خواهش میکنم. یعنی چی بهتر نیست ملاکتون برای بهتر بودن چیه؟ من اون نحوه اتصالات تغذیه رو از تو دیتاشیت استخراج کردم و شخصا هیچ نظری در این رابطه ندارم. اما یه موردی رو جناب حیدری اون اوایل تاپیک هم بهش اشاره کردند که "یه تجربه هم کردم گفتم بگم دور همیم. رگولاتور داخلی این آی سی ها خوب کار نمیکنه و اگه دستگاه چند ساعت به کامپیوتر وصل باشه هنگ میکنه و باید کابلش رو بکشی و دوباره بزنی. اگه از رگولاتور خارجی استفاده کنید این مشکل حل میشه. میتونید از یک مقاومت و زنر 3.3 ولت هم استفاده کنید که ارزونتر بشه." شاید مشکل شما هم همین رگولاتور داخلی باشه شاید گرم شدن هم به خاطر همین رگولاتوره و همینطور اون pll که روشن میشه باشه(برای خودم رو یادم نیست که گرم میشد یا نه). اگه میتونید یه تست بکنید. رگولاتور داخلی رو غیر فعال کنید و از یه رگولاتور خارجی استفاده کنید فقط یه سری تنظیمات هم تو برنامه هست که باید اعمال بشه برای غیر فعال کردن رگولاتور داخلی که فکر کنم تو این ورژن جدیده lufa با قدیمیه فرق میکنه.

                        دیدگاه


                          #72
                          پاسخ : کار با پورت USB میکرو های سری AT90USB

                          سلام آقا مجتبی . خوب هستید ؟

                          بازم مزاحم همیشگی :redface:

                          آقا رفتم از پایا یه میکرو خریدم و با احتیاط کامل با دسمال خیس گذاشتم روی میکرو و با هویه بلوور که میشه دمای اون رو تنظیم کرد لحیمش کردم ... و مدار کار کرد ... فکر کنم اون میکروهای قبلی که قبلا با بلوور چند بار برداشتم و چسبونده بودم خراب شده بودند

                          دوستان از من میشنوید ، اگر این میکروی AT90USB1287-AU رو خریداری کردید و پشت اون نوشته شده بود PHILIPINES (داخل یکی از دایره های تو رفته زیر میکروکنترلر )خیلی با احتیاط با یک دسمال خیس روی میکرو قرار بدهید و پایه های اون رو لحیم کنید ... خیلی حواستون باشه چون این میکروها خیلی گران و حساس هستند ...
                          چندتا نکته دیگه :
                          برخلاف چیزی که دوستان فکرش رو میکنند پایه AVCC برای تغذیه کردن پورت F و ADC به کار برده میشود (طبق این جمله دیتاشیت)
                          کد:
                          AVCC is the supply voltage pin for Port F and the A/D Converter. 
                          It should be externally connected to VCC, even if the ADC is not used.
                          If the ADC is used, it should be connected to VCC through a low-pass filter.
                          میگه پایه AVCC برای تغذیه کردن ADC و PORTF است .
                          حتی اگر از ADC هم نخواستید استفاده کنید حتما این پایه رو به VCC متصل کنید!
                          اگر از ADC استفاده میکنید ، این پایه را با فیلتر پایین گذر به VCC وصل کنید .

                          یه چیز جالب

                          _ چرا توی توضیحات پایه AVCC دیتاشیت گفته نشده که PLL از AVCC تغذیه میشه ... :angry: :angry: :angry: :angry:
                          _ مقاومتهای 22 اهم سری با پایه های داده USB فراموش نشود
                          =======================================

                          بریم سر اصل مطلب:
                          همونطور که میدونید زمانی که با کیپد کار میکنیم ، این امکان وجود داره که یک برنامه ای بنویسیم که تا زمانی که دستمان را از روی کلید برنداشتیم برنامه توی یک حلقه بچرخد ...
                          حالا من میخواستم برای کیبرد USB هم همینکار رو بکنم ...
                          مشکل اینجاست که زمانی که از کیبرد داده میگیریم بافر داخلی کیبرد خالی شده و اگر برای بار دوم بدون تاخیر از آن بخوانیم عددی به ما برمیگرداند ، معنای آن را میدهد که کلیدی فشرده نشده ...
                          من توقعی که دارم این هست که نمیخوام دقیقا مثل کیپد بشه ولی حداقل بتونم سرعت اسکن کردن کیبرد USB رو بیشتر کنم ...
                          سرعت اسکن کردن کیبرد خیلی کم هست و غیر قابل تحمل ... (چیزی حدود 480 تا 490 میلی ثانیه )
                          به نظر شما میشه سرعت اسکن کردن اون رو زیاد کرد ؟؟ (مطمئنا" میشه چون توی ویندوز این تنظیمات وجود داره)
                          خیلی گشتم ولی نفهمیدم که کجاش رو باید تغییر بدم که سرعت اسکن کردن رو بیشتر کنم ...
                          متاسفانه من انگلیسیم خیلی ضعیفه ... وگرنه مزاحمتون نمیشدم ...
                          پیشاپیش از اینکه راهنماییم میکنید سپاسگذارم ...
                          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                          معرفی نرم افزار Codewizard PWM
                          با من بیشتر آشنا شوید

                          دیدگاه


                            #73
                            چگونه زمان تاخیر اسکن صفحه کلید را کنترل کنیم ؟؟ (خیلی مهم)

                            نوشته اصلی توسط سامان اسدی
                            بریم سر اصل مطلب:
                            همونطور که میدونید زمانی که با کیپد کار میکنیم ، این امکان وجود داره که یک برنامه ای بنویسیم که تا زمانی که دستمان را از روی کلید برنداشتیم برنامه توی یک حلقه بچرخد ...
                            حالا من میخواستم برای کیبرد USB هم همینکار رو بکنم ...
                            مشکل اینجاست که زمانی که از کیبرد داده میگیریم بافر داخلی کیبرد خالی شده و اگر برای بار دوم بدون تاخیر از آن بخوانیم عددی به ما برمیگرداند ، معنای آن را میدهد که کلیدی فشرده نشده ...
                            من توقعی که دارم این هست که نمیخوام دقیقا مثل کیپد بشه ولی حداقل بتونم سرعت اسکن کردن کیبرد USB رو بیشتر کنم ...
                            سرعت اسکن کردن کیبرد خیلی کم هست و غیر قابل تحمل ... (چیزی حدود 480 تا 490 میلی ثانیه )
                            به نظر شما میشه سرعت اسکن کردن اون رو زیاد کرد ؟؟ (مطمئنا" میشه چون توی ویندوز این تنظیمات وجود داره)
                            خیلی گشتم ولی نفهمیدم که کجاش رو باید تغییر بدم که سرعت اسکن کردن رو بیشتر کنم ...
                            متاسفانه من انگلیسیم خیلی ضعیفه ... وگرنه مزاحمتون نمیشدم ...
                            پیشاپیش از اینکه راهنماییم میکنید سپاسگذارم ...
                            با اجازه آقا مجتبی

                            درود بر ایرانیان ...
                            امیدوارم که همگی خوب و سرحال باشند ....
                            آقا من رفتم دنبالش و فهمیدم قضیه چیه ...
                            زمان اسکن کردن صفحه کلید را از آقای Dean Camera پرسیدم (البته خودم نه پسر عموم چون انگلیسیم ضعیفه) و پاسخم را دادند ...
                            توی برنامه ایشون یک سری تغییراتی هم دادم و اینجا می گذارم تا بقیه استفاده کنند ...
                            این برنامه آقای Camera است :
                            کد:
                            int main(void)
                            {
                            	SetupHardware();
                            
                            	puts_P(PSTR(ESC_FG_CYAN "Keyboard Host Demo running.\r\n" ESC_FG_WHITE));
                            
                            	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
                            	GlobalInterruptEnable();
                            
                            	for (;;)
                            	{
                            		KeyboardHost_Task();
                            
                            		HID_Host_USBTask(&Keyboard_HID_Interface);
                            		USB_USBTask();
                            	}
                            }
                            
                            /** Task to manage an enumerated USB keyboard once connected, to display key state
                             * data as it is received.
                             */
                            void KeyboardHost_Task(void)
                            {
                            	if (USB_HostState != HOST_STATE_Configured)
                            	 return;
                            
                            	if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
                            	{
                            		USB_KeyboardReport_Data_t KeyboardReport;
                            		HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
                            
                            		LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
                            
                            		uint8_t KeyCode = KeyboardReport.KeyCode[0];
                            
                            		if (KeyCode)
                            		{
                            			char PressedKey = 0;
                            
                            			LEDs_ToggleLEDs(LEDS_LED2);
                            
                            			/* Retrieve pressed key character if alphanumeric */
                            			if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
                            			{
                            				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
                            			}
                            			else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
                            			     (KeyCode < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
                            			{
                            				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
                            			}
                            			else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
                            			{
                            				PressedKey = '0';
                            			}
                            			else if (KeyCode == HID_KEYBOARD_SC_SPACE)
                            			{
                            				PressedKey = ' ';
                            			}
                            			else if (KeyCode == HID_KEYBOARD_SC_ENTER)
                            			{
                            				PressedKey = '\n';
                            			}
                            			if (PressedKey)
                            			 putchar(PressedKey);
                            		}
                            	}
                            }
                            اگر زیر برنامه KeyboardHost_Task را نگاه کنید میبینید که اولین دستور این تابع این است :
                            کد:
                            	if (USB_HostState != HOST_STATE_Configured)
                            	 return;
                            و این قسمت حلقه اصلی برنامه رو نگاه کنید ...
                            کد:
                            	for (;;)
                            	{
                            		KeyboardHost_Task();
                            
                            		HID_Host_USBTask(&Keyboard_HID_Interface);
                            		USB_USBTask();
                            	}
                            همانطور که مشاهده میکنید توی برنامه اصلی این تابع به صورت بینهایت صدا زده میشود ... و از طرفی هم آن دستور قبل هم باعث میشود تا زمانی که کیبرد پیکربندی نشده آغاز به فعالیت نمیکند ...
                            این کار آنقدر انجام میشود تا کیبرد پیکربندی شود ...
                            و زمانی که پیکربندی شد از این شرط رد میشود و به پایین می آید ...
                            کد:
                            	if (USB_HostState != HOST_STATE_Configured)
                            	 return;
                            حالا کیبرد آماده است برای اسکن کردن صفحه کلید و دادن اطلاعات ...
                            من این برنامه رو تغییر دادم و زیاد باهاش حال نکردم ...
                            چون من با سریال و LED کار نمیکنم ، دستوراتشون رو پاک کردم و به جای اون خروجی تابع گذاشتم که برنامه همگانی باشه ...
                            کد:
                            uint8_t KeyboardHost_Task(void)
                            {
                            	if (USB_HostState != HOST_STATE_Configured) return 0;
                            	if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
                            	{
                            		USB_KeyboardReport_Data_t KeyboardReport;
                            		HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
                            		uint8_t KeyCode = KeyboardReport.KeyCode[0];
                            		if (KeyCode)
                            		{
                            			char PressedKey = 0;
                            			
                            			/* Retrieve pressed key character if alphanumeric */
                            			if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
                            			{
                            				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
                            			}
                            			else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
                            			(KeyCode < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
                            			{
                            				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
                            			}
                            			else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
                            			{
                            				PressedKey = '0';
                            			}
                            			else if (KeyCode == HID_KEYBOARD_SC_SPACE)
                            			{
                            				PressedKey = ' ';
                            			}
                            			else if (KeyCode == HID_KEYBOARD_SC_ENTER)
                            			{
                            				PressedKey = '\n';
                            			}
                            			return PressedKey
                            		}
                            	}
                            	return 1;
                            }
                            اینطوری تعریف کردم که اگر پیکربندی نشد خروجی صفر و اگر کلیدی زده شد وارد (if(KeyCode بشود و اگر کلیدی زده نشود خروجی تابع برابر یک شود ...
                            این زیر برنامه احتیاج به یک زیر برنامه دارد که از روی کیبرد بخوانیم (همان سه خطی که در حلقه اصلی برنامه است)
                            کد:
                            uint8_t key(void)
                            {
                            	uint8_t a = KeyboardHost_Task();
                            	HID_Host_USBTask(&Keyboard_HID_Interface);
                            	USB_USBTask();
                            	return a;
                            }
                            این تابع کاری ندارد که کیبرد پیکربندی شده یا خیر فقط همان سه تابعی که توی حلقه اصلی برنامه آقای Camera است ، فراخوانی میشود ...
                            فقط یک تفاوت خاصی دارد که آن هم چون تابع KeyboardHost_Task را با خروجی تعریف کردیم پس خروجی این برایمان مهم است ...
                            یادآوری : همانطور که قبلا گفته شد اگر پیکربندی نشود خروجی 0 و اگر کلیدی فشار داده نشود خروجی 1 و اگر کلیدی زده شود برابر با آن کارکتر میشود .
                            خوب ...
                            الان یک زیر برنامه میخوایم که پیکربندی کنه و زمانی که کارش تمام شد از تابع خارج بشه ... البته میتوانید یک حلقه شرطی ساده هم بگذارید ولی برای درک بهتر درون تابع قرار میدهیم ...
                            کد:
                            void Config_keyboard(void)
                            {
                            	while(key() == 0);
                            }
                            بعد از اینکه تمامی رجیسترها تنظیم شدند باید این تابع به کار گرفته شود تا کیبرد پیکربندی شود ... از این پس کیبرد برای اسکن کردن و پاسخگویی آماده است که اینکار توسط تابع key انجام می پذیرد .


                            خوب .....
                            رسیدیم به مغز مشکل ...
                            زمانی که اسکن کردن کیبرد دارای تاخیر باشد اطلاعاتی که دریافت می کنیم به صورت زیر است .
                            اسکن (---- تاخیر ----) اسکن (---- تاخیر ----) اسکن (---- تاخیر ----)
                            حالا اگر کلیدی را بگیریم (مثلا کلید A ) با توابعی که من نوشتم اینگونه میشود ...
                            A 11111111111111 A 11111111111111 A 11111111111111 A
                            همانطور که میبینید تنها یکبار داده کلید فشرده شده را ارسال می کند و سپس تعدادی یک (که تعداد یکها مشخص نیست) به اندازه تاخیری که دارد تکرار می شود ...
                            نکته : تاخیر اسکن کردن صفحه کلید به صورت پیشفرض برای هر کیبردی فرق دارد ...
                            این تاخیر ممکن است شما را در برنامه نویسی با چالشی جدی روبرو کند !!!
                            شما می توانید پس از پیکربندی کیبرد ، تابع زیر را بکار ببرید :
                            کد:
                            HID_Host_SetIdlePeriod(&Keyboard_HID_Interface,delay_ms);
                            ورودی دوم تاخیر اسکن کیبرد بر حسب میلی ثانیه است که به گفته آقای Camera باید ضریبی از 4 باشد ...


                            [s]این ورودی اگر صفر گذاشته شود کیبرد بدون تاخیر اسکن می کند ...[/s] (دوستان عذرخواهی میکنم این جمله غلط است و این را اصلاح میکنم)
                            این ورودی اگر صفر گذاشته شود تنها یک بار داده ارسال خواهد شد ... دقیقا مثل شکل زیر ...
                            ___________AAAAAAAAAAAAAAAAAAAAAAAA___________ ( __ یعنی هیچ کلیدی فشرده نشده و AAA یعنی کلید A را نگه داشتن)
                            111111111111A111111111111111111111111111111111111

                            بعد از این تابع شما میتوانید با تاخیر مورد نظر از صفحه کلید داده بخوانید ...

                            منبع

                            امیدوارم که سرتان را درد نیاورده باشم :redface:
                            ببخشید دوستان که طولانی شد ...
                            به بزرگی خودتون ببخشید ...

                            موفق و پیروز باشید
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه


                              #74
                              پاسخ : کار با پورت USB میکرو های سری AT90USB

                              سلام
                              جناب آقا مجتبی
                              من توی میکروهای USB مبتدی هستم و می خواستم یک برد برای میکروی AT90USB1287 بسازم . چه نقشه ای را پیشنهاد می کنید ؟
                              ضمنا خدمتتون بگم که من می خوام روی یک پروژه کار کنم که : اطلاعات ارسالی از PC را روی یک حافظه جانبی متصل به میکرو ذخیره کنم . سرعت انتقال اطلاعات هم تا حدود 1 مگابایت خواهد بود

                              متشکرم

                              دیدگاه


                                #75
                                پاسخ : کار با پورت USB میکرو های سری AT90USB

                                سلام
                                برای اتصال تغذیه به پست 10. تغذیه AT90USB مراجعه کنید. برای اتصال کانکتور USB هم پین های دیتا کانکتور رو با مقاومت 22 اهم به پینهای دیتای پورت USB متصل کنید. یه شماتیک هم تو پست ( AT90USBKEY_MRB ( AT90USB1287 گزاشتم. در مورد کاری که میخواهید بکنید باید تو کلاس mass storage به صورت دیوایس کار کنید. در رابطه با نرخ چیزی نمیتونم بگم.

                                دیدگاه

                                لطفا صبر کنید...
                                X