اطلاعیه

Collapse
No announcement yet.

خارج شدن از وقفه پورت سریال

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

    خارج شدن از وقفه پورت سریال

    سلام به همگی
    من پورت یرسال راه اندازی کردم، وقتی وقفه اتفاق میافته و برنامه های تحت وقفه اجرا میشه دیگه از وقفه خارج نمیشه و به Main برنمیگرده که مابقی برنامه اجرا بشه
    لطفا راهنمایی کنید که کجای کار اشکال داره

    کد:
    #include <lpc17xx.h> 
    #include <stdio.h>
    #include "lpc17xx_pinsel.h"
    #include "lpc17xx_gpio.h"
    #include "lpc17xx_uart.h"
    #include "lpc17xx_pwm.h"
    #include "lpc17xx_clkpwr.h"
    #include "debug_frmwrk.h"
    
    int u0 = 0;
    uint8_t input0;
    
    
    void Delay (uint32_t Time)
    {
      uint32_t i;
      
      i = 0;
      while (Time--) {
        for (i = 0; i < 5000; i++);
      }
    }
    
    void UART2_IRQHandler(void)
    {
    	input0 = UART_ReceiveByte(LPC_UART2);
    	GPIO_SetValue(2,0x00001000);
    	Delay (2000);
    	GPIO_ClearValue( 2,0x00018000 );
    	u0=1;
    }
    
    int main(void)
    {
    	unsigned char u0;
    	
    	PINSEL_CFG_Type PinCfg2;
    //*********************************************************UART2 Configuration structure variable
    	UART_CFG_Type UARTConfigStruct2;						
    //*********************************************************UART2 FIFO configuration Structure variable
    	UART_FIFO_CFG_Type UARTFIFOConfigStruct2;
    //*********************************************************Initialize UART2 Pin Connect : P0.10 , P0.11 ( pins 48 & 49 Of Micro )
    	PinCfg2.Funcnum = 1; 
    	PinCfg2.OpenDrain = 0;
    	PinCfg2.Pinmode = 0;
    	PinCfg2.Pinnum = 10;
    	PinCfg2.Portnum = 0;
    	PINSEL_ConfigPin(&PinCfg2);
    	PinCfg2.Pinnum = 11;
    	PINSEL_ConfigPin(&PinCfg2);
    	
    	UARTConfigStruct2.Baud_rate = 38400;
    	UARTConfigStruct2.Databits = UART_DATABIT_8;
    	UARTConfigStruct2.Parity = UART_PARITY_NONE;
    	UARTConfigStruct2.Stopbits = UART_STOPBIT_1;
    
    	CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, ENABLE);
    //*********************************************************Initialize UART2 peripheral with given to corresponding parameter
    	UART_Init(LPC_UART2,&UARTConfigStruct2);
    	UART_FIFOConfigStructInit(&UARTFIFOConfigStruct2);
    //*********************************************************Initialize FIFO for UART2 peripheral
    	UART_FIFOConfig(LPC_UART2, &UARTFIFOConfigStruct2);
    	UART_IntConfig(LPC_UART2, UART_INTCFG_RBR, ENABLE);
    //*********************************************************Enable Interrupt for UART2 channel
    	NVIC_EnableIRQ(UART2_IRQn);
    //*********************************************************Enable UART2 Transmit
    	UART_TxCmd(LPC_UART2, ENABLE);
    
    //*********************************************************
    	GPIO_SetDir(2 ,0x00001800 ,1 );
    
    	UARTPuts_(LPC_UART2, "In the name of God");
    
    	while (UART_CheckBusy(LPC_UART2));
    	UARTPuts_(LPC_UART2, "Enter a char:");
    
    		while (1)
    		{
    			if (u0==1)
    			{
    				GPIO_SetValue( 2,0x00000800 );
    				Delay (5000);
    				FIO_ClearValue( 2,0x00018000 );
    				u0 = 0;
    			}
      }
    }
    پناه بر تو که بی واژه مرا می شنوی

    #2
    پاسخ : خارج شدن از وقفه پورت سریال

    سلام، دوست عزیز کد تست شده LPC1788 رو برات گذاشتم. خودت بررسی کن !


    کد:
    void UART0_IRQHandler(void) {
    	
    	ch = UART_ReceiveByte(UART_0);
    	if (ch == 0x0D){
    	  u0 = 1;
    		 str1[i]= 0;
    	}
    	else{
    	 str1[i]= ch;
    		UARTPuts(UART_0, "\n\r your char is : ");
    		UART_SendByte(UART_0, ch);
    	 i++;
    	}
    }
    
    int main()
    {
    UART_CFG_Type x;	
    	
    Delay_init();
    
    PINSEL_ConfigPin(0,2,1); // set P0.2 As UART0-TX
    PINSEL_ConfigPin(0,3,1);	// set P0.3 As UART0-RX
    
    UART_ConfigStructInit(&x); //Getting Default UART config.
    
    UART_Init(UART_0,&x); //initialize UART_0
    
    UART_TxCmd(UART_0,ENABLE); //Enbale transmission on UART TxD pin
    /* UART INTERRUPT */
    UART_IntConfig(UART_0, UART_INTCFG_RBR, ENABLE);
    NVIC_EnableIRQ(UART0_IRQn);
    
    while(1);
    return 0;
    }

    دیدگاه


      #3
      پاسخ : خارج شدن از وقفه پورت سریال

      نوشته اصلی توسط م.پورجبار
      سلام، دوست عزیز کد تست شده LPC1788 رو برات گذاشتم. خودت بررسی کن !


      کد:
      void UART0_IRQHandler(void) {
      	
      	ch = UART_ReceiveByte(UART_0);
      	if (ch == 0x0D){
      	  u0 = 1;
      		 str1[i]= 0;
      	}
      	else{
      	 str1[i]= ch;
      		UARTPuts(UART_0, "\n\r your char is : ");
      		UART_SendByte(UART_0, ch);
      	 i++;
      	}
      }
      
      int main()
      {
      UART_CFG_Type x;	
      	
      Delay_init();
      
      PINSEL_ConfigPin(0,2,1); // set P0.2 As UART0-TX
      PINSEL_ConfigPin(0,3,1);	// set P0.3 As UART0-RX
      
      UART_ConfigStructInit(&x); //Getting Default UART config.
      
      UART_Init(UART_0,&x); //initialize UART_0
      
      UART_TxCmd(UART_0,ENABLE); //Enbale transmission on UART TxD pin
      /* UART INTERRUPT */
      UART_IntConfig(UART_0, UART_INTCFG_RBR, ENABLE);
      NVIC_EnableIRQ(UART0_IRQn);
      
      while(1);
      return 0;
      }
      ممنون از راهنمایی
      من خودم کدی که نوشتم با چند سمپل مختلف مقایسه کردم و به نظر من مشکلی نداره ولی...
      من همه مدل برنامه دیباگ کردم، قطعا و یقیناً مشکل اصلی من این هست که وقتی برنامه وارد وقفه میشه و عملیات های خواسته انجام میده، توی مرحله آخر که باید مقدار u0 از صفر به یک تغییر بده این اتفاق نمیافته و به همین دلیل هم برنامه از وقفه خارج نمیشه!!!
      لطفا تو این زمینه راهنمایی کنید
      پناه بر تو که بی واژه مرا می شنوی

      دیدگاه


        #4
        پاسخ : خارج شدن از وقفه پورت سریال

        سلام.

        شما باید flag مربوط به وقفه ی سریال رو در روتین وقفه مجدد بخوانید تا پاک بشه.
        iir = LPC_UARTx->IIR;

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

        دیدگاه


          #5
          پاسخ : خارج شدن از وقفه پورت سریال

          نوشته اصلی توسط sharin
          سلام.

          شما باید flag مربوط به وقفه ی سریال رو در روتین وقفه مجدد بخوانید تا پاک بشه.
          iir = LPC_UARTx->IIR;

          به جای x نام پورت مورد استفاده رو بنویسید.
          بله، این کار را هم انجام دادم ولی جواب نداد
          پناه بر تو که بی واژه مرا می شنوی

          دیدگاه


            #6
            پاسخ : خارج شدن از وقفه پورت سریال

            من پیشنهاد میدم همت کنید و با پورت های دیگه uart هم تست کنید !

            دیدگاه


              #7
              پاسخ : خارج شدن از وقفه پورت سریال

              نوشته اصلی توسط م.پورجبار
              من پیشنهاد میدم همت کنید و با پورت های دیگه uart هم تست کنید !
              ممنون از پیشنهادتون
              از پورت های دیگه هم استفاده کردم ولی مشکل حل نشد ( یعنی مشکل از پورت نبود )
              برای اینکه دوستان دیگه ای که احیانا بعدا به این پست سر میزنن یه چیزی دستگیرشون بشه، کد اصلاح شده و بودن اشکال اینجا قرار میدم
              که البته باید از دوستم آقای "لطفعلی زاده" تشکر کنم بابت راهنمایی
              پناه بر تو که بی واژه مرا می شنوی

              دیدگاه


                #8
                پاسخ : خارج شدن از وقفه پورت سریال

                کد اصلاح شد
                البته این کد برای تست نوشته شده، به محض دریافت از پورت سریال؛ وقفه سریال فعال میشه و دو تا LED روشن میشه و بعد از خروج از وقفه دوباره LED ها خاموش میشن
                کد:
                #include <lpc17xx.h> 
                #include "stdio.h"
                #include "lpc17xx_pinsel.h"
                #include "lpc17xx_gpio.h"
                #include "lpc17xx_uart.h"
                #include "lpc17xx_clkpwr.h"
                #include "debug_frmwrk.h"
                
                int u0 = 0;
                uint8_t input0;
                
                
                void Delay (uint32_t Time)
                {
                  uint32_t i;
                  
                  i = 0;
                  while (Time--) {
                    for (i = 0; i < 5000; i++);
                  }
                }
                
                void UART2_IRQHandler(void)
                {
                		t=UARTGetChar(LPC_UART2);
                		GPIO_SetValue(2,0x00001000);
                		Delay (1000);
                		GPIO_SetValue(2,0x00000800);
                		Delay (1000);
                		u0 = 1;
                }
                
                int main(void)
                {
                
                //*********************************************************UART2 Configuration structure variable
                	PINSEL_CFG_Type PinCfg2;
                	UART_CFG_Type UARTConfigStruct2;
                	UART_FIFO_CFG_Type UARTFIFOConfigStruct2;
                //*********************************************************PWM 0 Configuration Set
                	PINSEL_CFG_Type PinCfg;
                 	PWM_TIMERCFG_Type PWMCfgDat;
                 	PWM_MATCHCFG_Type PWMMatchCfgDat;
                //*********************************************************Initialize UART2 Pin Connect : P0.10 , P0.11 ( pins 48 & 49 Of Micro )
                	PinCfg2.Funcnum = 1; 
                	PinCfg2.OpenDrain = 0;
                	PinCfg2.Pinmode = 0;
                	PinCfg2.Pinnum = 10;
                	PinCfg2.Portnum = 0;
                	PINSEL_ConfigPin(&PinCfg2);
                	PinCfg2.Pinnum = 11;
                	PINSEL_ConfigPin(&PinCfg2);
                	
                	UARTConfigStruct2.Baud_rate = 38400;
                	UARTConfigStruct2.Databits = UART_DATABIT_8;
                	UARTConfigStruct2.Parity = UART_PARITY_NONE;
                	UARTConfigStruct2.Stopbits = UART_STOPBIT_1;
                
                //*********************************************************Initialize PWM 0 pin connect : p1.18 ( pin 32 Of Micro )
                	PinCfg.Funcnum = 2;
                	PinCfg.OpenDrain = 0;
                	PinCfg.Pinmode = 0;
                	PinCfg.Portnum = 1;
                	PinCfg.Pinnum = 18;
                	PINSEL_ConfigPin(&PinCfg);
                
                	CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, ENABLE);
                //*********************************************************Initialize UART2 peripheral with given to corresponding parameter
                	UART_Init(LPC_UART2,&UARTConfigStruct2);
                	UART_FIFOConfigStructInit(&UARTFIFOConfigStruct2);
                //*********************************************************Initialize FIFO for UART2 peripheral
                	UART_FIFOConfig(LPC_UART2, &UARTFIFOConfigStruct2);
                	UART_IntConfig(LPC_UART2, UART_INTCFG_RBR, ENABLE);
                //*********************************************************Enable Interrupt for UART2 channel
                	NVIC_EnableIRQ(UART2_IRQn);
                //*********************************************************Enable UART2 Transmit
                	UART_TxCmd(LPC_UART2, ENABLE);
                
                	
                //*********************************************************
                
                
                	GPIO_SetDir(2 ,0x00001800 ,1 );
                
                	while (UART_CheckBusy(LPC_UART2));
                	UARTPuts_(LPC_UART2, "In The Name Of God");
                
                		while (1)
                		{
                			if (u0==1)
                			{
                				GPIO_ClearValue(2,0x00001000);
                				Delay(1000);
                				GPIO_ClearValue(2,0x00000800);
                				u0 = 0;
                			}
                		}
                }
                پناه بر تو که بی واژه مرا می شنوی

                دیدگاه


                  #9
                  پاسخ : خارج شدن از وقفه پورت سریال

                  توی وقفه از تاخیر استفاده نکن...

                  بهترین کار این هست که توی وقفه تنها مقدار رسیده از پورت سریال را توی یه بافر قرار بدی و برای خودت یک فلگ را فعال کنی، بعد توی main چک کن اگر اون فلگ یک شده بود به این معنی هست که یه داده رسیده اول فلگ را صفر کن و بعد داده رسیده را پردازش کن و کارهای مورد نظرت را انجام بده...

                  درون تابع وقفه ایت:

                  کد:
                  MyRXFlag = 1;
                  buff[x] = DATE;
                  درون تابع main

                  کد:
                  while(1)
                  {
                  while(MyRXFlag == 0);
                  MyRXFlag = 0;
                  پردازش داده و عملیات مورد نظر
                  }

                  دیدگاه

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