اطلاعیه

Collapse
No announcement yet.

مشکل USB VCOM"CDC" با تایمر

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

    مشکل USB VCOM"CDC" با تایمر

    سلام
    قسمت ارتباط USB برنامه بدونه مشکل کار میکنه ، اما وقتی رجیستر های تنظیم تایمر به برنامه اضافه میکنم Hyperterminal دیگه نمیتوه port دستگاه باز کنه!
    مشکل از کجاست؟ لطفا کمک کنین.

    کد:
    //Besm Allah
    #include "LPC17xx.h"
    #include "lpc17xx_gpio.h"
    #include "cmsis_os.h"
    #include "rl_usb.h"
    #include "Driver_USART.h"
    
    extern ARM_DRIVER_USART Driver_USART1;
    
    #define BUF_SZ 128
    // UART -> USB
    uint8_t uart2usb_buf[BUF_SZ];
    volatile uint32_t uart2usb_in;
    volatile uint32_t uart2usb_out;
    // USB -> UART
    uint8_t usb2uart_buf[BUF_SZ];
    volatile bool uart_send_busy;
         bool bridge_ready = false;
    volatile bool uart_setup[2] = {false, false};
    
    void USART1_Callback (uint32_t event) {
    
     if ( event & ARM_USART_EVENT_SEND_COMPLETE) {
      uart_send_busy = false;
     }
     if ( event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
      uart2usb_in += BUF_SZ;
      Driver_USART1.Receive(uart2usb_buf, BUF_SZ);
     }
    }
    
    //FunctionalState LEDStatus = ENABLE;
    
    
    void microinit(void);
    void Khamoosh(void);
    void Pulse(void);
    void EINT3_IRQHandler(void);
    void TIMER0_IRQHandler(void);
    void sRead(void);
    void sWrite(uint32_t wrcnt);
    void nemidunamUSB(void);
    
    
    void MicroInit(void){
    
    		USBD_Initialize  (0);        // USB Device 0 Initialization
    		USBD_Connect    (0);        // USB Device 0 Connect
    
    		//Wait until first USB Device is configured
    		while (USBD_Configured (0) == 0);
    
    		//GPIO_SetDir(2,(1<<0),1); //Dal
    		//GPIO_SetDir(2,(1<<1),1);	//Be
    		//GPIO_SetDir(2,(1<<2),1);	//He
    		//GPIO_SetDir(2,(1<<3),1);	//Jim
    
    		//GPIO_IntCmd(0,1<<3,1);	//Inthalsw rising edge init
    		//GPIO_IntCmd(0,1<<3,0);	//Inthalsw falling edge init
    		//NVIC_EnableIRQ(EINT3_IRQn);//enable Inthalsw 
      
    		//LPC_TIM0->TCR = 0x02;    // reset timer 
    		//LPC_TIM0->PR = 100;    
      //LPC_TIM0->MR0 = 240000;
      //LPC_TIM0->IR = 0xff;    // reset interrrupt
      //LPC_TIM0->MCR = 0x03; 
    		//NVIC_EnableIRQ(TIMER0_IRQn);
    		//LPC_TIM0->TCR = 0x01;    // start timer	
    	
    }
    void EINT3_IRQHandler(void)//Inthalsw
    {
    	if(GPIO_GetIntStatus(0, 3, 0)||GPIO_GetIntStatus(0, 3, 1))
    	{	
    /*	
    	if(LEDStatus){
    	LEDStatus = 0;
    	GPIO_ClearValue(2,(1<<1));//reset Be
    	}
    	else
    	{	
    	LEDStatus = 1;
    	GPIO_SetValue(2,(1<<1));//Set Be
     }	
    */	
          Freq = Frq;
          Frq = 0;
          Khamoosh();
          if(Shoro)
    							Takh = Ztakh;
    
    						GPIO_ClearInt(0,(1<<3));
    	}
    }
    void TIMER0_IRQHandler(void)
    {
      LPC_TIM0->IR = 0x01;    // reset all interrrupts 
    
         Pulser--;
         if(Pulser == 0)
    					 Khamoosh();
    
         Takh--;
         if(Takh == 0)
    					 Pulse();
    
         Frq++;
    }
    void nemidunamUSB(void){
    	 if (USBD_Configured (0)) {
       if (uart_setup[0]) {
        bridge_ready  = true;
        uart_setup[0] = false;
        uart_send_busy = false;
        uart2usb_in  = 0;
        uart2usb_out  = 0;
        Driver_USART1.Receive(uart2usb_buf, BUF_SZ);
    			}
    		}
    }			
    void sRead(void){
    	if (bridge_ready) {
    		if ((rdcnt = USBD_CDC_ACM_DataAvailable(0)) > 0) {
    			USBD_CDC_ACM_ReadData(0, eimbuf, rdcnt);
    		}
    	}
    }	
    void sWrite(uint32_t wrcnt){
    	USBD_CDC_ACM_WriteData (0,(const uint8_t*)&eimbuf,wrcnt);
    }
    void Pulse(void){
    	Pulser = Zpulse;
    	Halprob = GPIO_ReadValue(1);
    	Halprob = Halprob & 1;
    	Halprob = Halprob >> 0;
    	if(Halprob == 0){
    	GPIO_SetValue(2,(1<<0));//set Dal
    	GPIO_SetValue(2,(1<<3));//set Jim
    	GPIO_ClearValue(2,(1<<1));//reset Be
    	GPIO_ClearValue(2,(1<<2));//reset He
    	}
    	else
    	{	
    	GPIO_SetValue(2,(1<<1));//Set Be
    	GPIO_SetValue(2,(1<<2));//Set He
    	GPIO_ClearValue(2,(1<<0));//Reset Dal
    	GPIO_ClearValue(2,(1<<3));//Reset Jim
    }	
    }	
    void Khamoosh(void){
    	GPIO_ClearValue(2,(1<<0));//Dal
    	GPIO_ClearValue(2,(1<<1));//Be
    	GPIO_ClearValue(2,(1<<2));//He
    	GPIO_ClearValue(2,(1<<3));//Jim
    }	
    int main(void)
    {
    		MicroInit();
    		Khamoosh();
    		while(1){
    			nemidunamUSB();
    			sRead();
    			sWrite(rdcnt);
    			Pulse();
    		}
    	
     // return 0;
    }
    اگر مثلا این خط اضافه کنم دیگه پرت نمیشناسه:
    کد:
     LPC_TIM0->IR = 0xff;    // reset interrrupt

    #2
    پاسخ : مشکل USB VCOM"CDC" با تایمر

    سلام،
    دوتا چیز رو تست کنید :
    1
    دستور زیر رو در بعد از فعال سازی وقفه تایمر اضافه کنید:
    کد:
    NVIC_SetPriority(TIMER0_IRQn,9);
    2
    زمان روی دادن وقفه تایمر رو کمتر و بیشتر کنید!
    هر انسانی که احساس بی نیازی کند سرکش و طغیان گر می شود...

    دیدگاه


      #3
      پاسخ : مشکل USB VCOM"CDC" با تایمر

      نوشته اصلی توسط حمید لطفعلی زاده
      سلام،
      دوتا چیز رو تست کنید :
      1
      دستور زیر رو در بعد از فعال سازی وقفه تایمر اضافه کنید:
      کد:
      NVIC_SetPriority(TIMER0_IRQn,9);
      2
      زمان روی دادن وقفه تایمر رو کمتر و بیشتر کنید!
      تست کردم، حتی برای اینتراپت USB هم این دستور قرار دادم اما درست نشده :(
      بدجوری تو آمپاس گذاشتتم...

      دیدگاه


        #4
        پاسخ : مشکل USB VCOM"CDC" با تایمر

        اینم فایل پروژه با keil نوشتم و روی هدر برد lpc1768 کار میکنه. کمک کنین ممنون میشم.

        http://s3.picofile.com/file/82081636...Motor2.zip.htm

        دیدگاه


          #5
          پاسخ : مشکل USB VCOM"CDC" با تایمر

          کسی با تایمر و USB همزمان با هم کار کرده کمک کنه؟

          دیدگاه


            #6
            پاسخ : مشکل USB VCOM"CDC" با تایمر

            شما برنامه رو debug کنید ببینید برنامه کجا گیر می کنه و گیرش از کجا شروع می شه، بعد خبرش رو بدید.
            در نظر داشته باشید که اون اولویت ها برای وقوع وقفه هم همینطوری عشقی نباید بدید ، اولویت های USB باید بالاترین باشن و بعدی هم کمتر ، الویت برابر به 2 تا irq_handler مجزا نباید بدید.
            It is what it is
            آموزش های ویدئویی به سبک MBED
            پروژه EasyMCU :: تا ارائه چیزی نمانده!

            دیدگاه


              #7
              پاسخ : مشکل USB VCOM"CDC" با تایمر

              دیباگ که دوستمون گفتن کار درستیه انجام بدین،
              چیزه دیگه ای هم که می تونید تست کنید اینه که از یک تایمر دیگه استفاده کنید ببینید باز هم همین مشکل پا برجاست!
              هر انسانی که احساس بی نیازی کند سرکش و طغیان گر می شود...

              دیدگاه


                #8
                پاسخ : مشکل USB VCOM"CDC" با تایمر

                2 تا بیشتر اینتراپت ندارم ، به تایمر اولویت پایین دادم همین مشکل بازم بود، کلا قبل از اینا حتی اگر یک دستور نه کل مراحل تایمر ، یک دستور مثل LPC_TIM0->IR = 0xff به برنامه اضافه کنم این مشکل پیش میاد.
                برای دیباگ سخت افزاری هنوز امکانات ندارم و برای این پروژه هم خیلی عجله دارم :(
                با تایمرهای دیگه هم امتحان کردم همین مشکل هست .

                دیدگاه


                  #9
                  پاسخ : مشکل USB VCOM"CDC" با تایمر

                  بدون دیباگر واقعا نمی شه توابع مربوط به هسته میکرو رو ایجاد و توسعه داد.
                  دیباگر رو حتما تهیه کنید.

                  بالای تابع main این رو بنویسید.

                  [code=c]
                  void HardFault_Handler(void)
                  {
                  LPC_GPIO2->FIOSET = 1<<0;
                  while(1);
                  }

                  int main()
                  {
                  .
                  .
                  .
                  LPC_GPIO2->FIODIR = 1<<0;
                  .
                  .
                  .
                  while(1)
                  {
                  .
                  .
                  .
                  }
                  }
                  [/code]

                  با این کد می تونی چک کنی که خطای hard fault رخ داده یا نه !
                  اگر این خطا رخ بده پایه ی 0 از پورت 2 high می شه که اگر led بهش متصل باشه روشن می شه و اینجوری می تونی بفهمی خطای hard fault رخ داده یا نه ...

                  از اونجایی که دیباگر نداری ، بعد از این با led باید خطوط برنامه ات رو چک کنی ... ، کار سختیه ، اما شدنیه ...

                  موفق باشی.
                  It is what it is
                  آموزش های ویدئویی به سبک MBED
                  پروژه EasyMCU :: تا ارائه چیزی نمانده!

                  دیدگاه


                    #10
                    پاسخ : مشکل USB VCOM"CDC" با تایمر

                    سلام،
                    1- اولویت وقفه تایمر رو از پیش فرض تغییر ندهید !
                    2- در زمان شروع کار با usb وقفه رو غیر فعال کنید !

                    دیدگاه


                      #11
                      پاسخ : مشکل USB VCOM"CDC" با تایمر

                      نوشته اصلی توسط sharin
                      بدون دیباگر واقعا نمی شه توابع مربوط به هسته میکرو رو ایجاد و توسعه داد.
                      دیباگر رو حتما تهیه کنید.

                      بالای تابع main این رو بنویسید.

                      [code=c]
                      void HardFault_Handler(void)
                      {
                      LPC_GPIO2->FIOSET = 1<<0;
                      while(1);
                      }

                      int main()
                      {
                      .
                      .
                      .
                      LPC_GPIO2->FIODIR = 1<<0;
                      .
                      .
                      .
                      while(1)
                      {
                      .
                      .
                      .
                      }
                      }
                      [/code]

                      با این کد می تونی چک کنی که خطای hard fault رخ داده یا نه !
                      اگر این خطا رخ بده پایه ی 0 از پورت 2 high می شه که اگر led بهش متصل باشه روشن می شه و اینجوری می تونی بفهمی خطای hard fault رخ داده یا نه ...

                      از اونجایی که دیباگر نداری ، بعد از این با led باید خطوط برنامه ات رو چک کنی ... ، کار سختیه ، اما شدنیه ...

                      موفق باشی.
                      تست کردم HardFault اتفاق میفته! چیجوری پیدا کنم جاشو؟


                      سلام،
                      1- اولویت وقفه تایمر رو از پیش فرض تغییر ندهید !
                      2- در زمان شروع کار با usb وقفه رو غیر فعال کنید !
                      سلام.
                      من فقط توایع نصب USB اجرا میکنم بعد هر تابعی از توابع نتظیم تایمر اجرا کنم این مشکل پیش میاد به استفاده نمیرسه!

                      برای مثال MicroInit به این صورت بدونه مشکل کار میکنه:
                      کد:
                      void MicroInit(void){
                      		USBD_Initialize  (0);        // USB Device 0 Initialization
                      		USBD_Connect    (0);        // USB Device 0 Connect
                      		//Wait until first USB Device is configured
                      		while (USBD_Configured (0) == 0);
                      }
                      اما اگر این LPC_TIM0->IR = 0xff یا هر دستور مربوط به تنظیم هر کدوم از تایمرها اضافه کنم مشکل پیش میاد و Hyper دیگه پرت باز نمیکنه.

                      کد:
                      void MicroInit(void){
                      		USBD_Initialize  (0);        // USB Device 0 Initialization
                      		USBD_Connect    (0);        // USB Device 0 Connect
                      		//Wait until first USB Device is configured
                      		while (USBD_Configured (0) == 0);
                              LPC_TIM0->IR = 0xff;    // reset interrrupt
                      }

                      دیدگاه


                        #12
                        پاسخ : مشکل USB VCOM"CDC" با تایمر

                        مشکل دقیقا سر همین خط LPC_TIM0->IR = 0xff بوجود میاد.
                        LPC_GPIO2->FIOSET = 1<<0; به قبلش اضافه میکنم ست میشه بعدش ست نمیشه!

                        دیدگاه


                          #13
                          پاسخ : مشکل USB VCOM"CDC" با تایمر

                          شما باید به این شکل فلگ اینتراپت تایمر رو پاک کنید مثلا برای تایمر 1 اگر وقفه رو با MR0 ایجاد کنی، فلگش رو باید به شکل زیر در روال وقفه پاک کنی.
                          LPC_TIM1->IR = 0x1<<0;
                          می تونی برای باقیه فلگ ها دیتاشیت رو چک کنی، گر چه با شماره ی MRx یکی هستن. اما برای اطمینان چک کنید.
                          چیزی که شما نوشتی فلگ باقیه تایمر ها رو هم set می کنه و کلا سیستم وقفه رو دچار مشکل می کنه و از وقفه در نمی یاد و سیستم همونطور که حدث زدم hard fault error می دهه.

                          موفق باشی.
                          It is what it is
                          آموزش های ویدئویی به سبک MBED
                          پروژه EasyMCU :: تا ارائه چیزی نمانده!

                          دیدگاه


                            #14
                            پاسخ : مشکل USB VCOM"CDC" با تایمر

                            مثال زدم، جای اون اگر LPC_TIM0->PR = 0 باشه یا هر دستور دیگه ای برای تنظیم تایمر همین مشکل پیش میاد.

                            دیدگاه


                              #15
                              پاسخ : مشکل USB VCOM"CDC" با تایمر

                              جناب ، شما دستور پاک کردن فلگ وقفه رو باید در روال وقفه ی تایمر اضافه کنید نه جای دیگه.
                              الان کدتون رو هم یه نگاه سر سری انداختم ندیدم شما تایمر رو config کرده باشید، فقط روال وقفه نوشته بودید.
                              اون MicroInit تابع روتین وقفه تایمر نیست ، TIMER0_IRQHandler روال روتین وقفه هست و باید اون کد رو اینجا اضافه کنید.
                              قبلش هم تایمر رو کانفیگ کنید.

                              موفق باشید.
                              It is what it is
                              آموزش های ویدئویی به سبک MBED
                              پروژه EasyMCU :: تا ارائه چیزی نمانده!

                              دیدگاه

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