اطلاعیه

Collapse
No announcement yet.

خارج شدن از وقفه دریافت UART

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

    خارج شدن از وقفه دریافت UART

    سلام

    من با میکرو LPC1768 و کامپایلر Keil کار میکنم
    وقفه سریال رو به صورت زیر فعال کردم :
    کد:
    LPC_UART0->IER = 0x01;
     NVIC_SetPriority(UART0_IRQn,0);
     NVIC_EnableIRQ(UART0_IRQn);
    و زیر روال وقفه هم به صورت زیر هست :
    کد:
    void UART0_IRQHandler(void) {
    	UART0_GetZE10(Output1ze10,Output2ze10);
    	return;
    	}
    ولی زیر روال وقفه به صورت یک حلقه بینهایت هست و وقتی واردش میشه دیگه خارج نمیشه ، مثلا اگر همون مقدار دریافتی رو توی زیر روال روی LCD نشون بدم ، با سرعت زیاد روی LCD نمایش داده میشه و مثل یه حلقه عمل میکنه
    چطوری باید وقفه دریافت رو پاک کرد ؟؟ چطوری باید از زیروال خارج شد ؟؟

    تشکر
    http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

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

    شما تا یک بافر درست نکنید و اطلاعات رو ازش نگیرید این تو حلفه میمونه.یک بافر درست کن و در زیر روال وقفه این جور بنویس
    rx_buffer[Cnt++] = LPC_UART0->RBR;
    بعد میبینی که درست میشه

    دیدگاه


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

      نوشته اصلی توسط D.S
      شما تا یک بافر درست نکنید و اطلاعات رو ازش نگیرید این تو حلفه میمونه.یک بافر درست کن و در زیر روال وقفه این جور بنویس
      rx_buffer[Cnt++] = LPC_UART0->RBR;
      بعد میبینی که درست میشه
      سلام

      ممنون
      ولی نشد ، یک کاراکتر رو با RBR دریافت کردم ، حتی کل رشته رو هم دریافت کردم ولی از وقفه خارج نشد !!!
      راستی یک سوال دیگه هم داشتم ، من یک رشته دارم به صورت 000195000000510C:R1111T2222Y3333U4444O+ هست که خواستم اعداد 1111 و 2222 و 3333 و 4444 رو به صورت 4 متغیر جدا داشته باشم ، به همین دلیل تابع زیر رو نوشتم ، ولی یه مشکل هست اینکه عدد اولی درست دریافت میشه ولی عدد دوم آخرش یه Y هست و عدد سوم آخرش یه U و عدد چهارم آخرش یه O هست ، یعنی همین علامت هایی که خودم توی رشته برای جدا کردن قسمت های رشته گزاشته بودم الان توی اعدادم هست !!!

      این تابع :
      کد:
      int UART0_GetZE10 (unsigned char *str,unsigned char *str1,unsigned char *str2,unsigned char *str3) 
      {
      	int i = 0;
       unsigned char temp1;
      	int j = 0;
       unsigned char *temp2 = str;
      	int k = 0;
       unsigned char *temp3 = str1;
      	int l = 0;
       unsigned char *temp4 = str2;
      	int m = 0;
       unsigned char *temp5 = str3;
      	
      	do{
      		temp1 = UART0_GetChar();
      		i++;
      	}while((temp1++) != 'R');
      	do{
      		*temp2 = UART0_GetChar();
      		j++;
      	}while(*(temp2++) != 'T');
      	do{
      		*temp3 = UART0_GetChar();
      		k++;
      	}while(*(temp3++) != 'Y');
      	do{
      		*temp4 = UART0_GetChar();
      		l++;
      	}while(*(temp4++) != 'U');
      	do{
      		*temp5 = UART0_GetChar();
      		m++;
      	}while(*(temp5++) != 'O');
      	*(temp2-1) = 0;
      	return j;
      	*(temp3-1) = 0;
      	return k;
      	*(temp4-1) = 0;
      	return l;
      	*(temp5-1) = 0;
      	return m;
      }
      توی زیرروال وقفه سریال هم تابع رو با UART0_GetZE10(Output1ze10,Output2ze10,Output3ze10, Output4ze10); میخونم که این تابع خودم 4 تا GetChar توش داره یعنی 4 بار بافر سریال با RBR خونده میشه ولی بازم از وقفه سریال خارج نمیشه !!!

      این هم تابع GetCharم :
      کد:
      int UART0_GetChar (void) 
      {
       	while (!(LPC_UART0->LSR & 0x01));
       	return (LPC_UART0->RBR);
      }
      http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

      دیدگاه


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

        سلام
        در زیر روال وقفه با خواندن رجیستری که اطلاعات در آن آمده پرچم وقفه هم پاک می شود
        فيلم آموزشي ميکروکنترلر LPC1768
        فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
        فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
        فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

        دیدگاه


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

          اصلا امکان نداره وقتی شما در زیر روال وقفه وقتی اطلاعات رو از رجستر به بافر منتقل کنی از وقفه خارج نشه.یک برنامه برای سیم 900 اقای اروین در همین بخش گداشته.اون رو نگاه کنید همین کار های شما رو بصورت راحت تر انجام داده.بعد شما با نوشتنcher get برنامه همینطور منتطر میماند دیگه وقفه میخواید چیکار.پیشنهاد میکنم برنامه سیم 900 همین بخش رو حتما نگاه کنید.از متدد خاصی استفاده شده.

          دیدگاه


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

            نوشته اصلی توسط D.S
            اصلا امکان نداره وقتی شما در زیر روال وقفه وقتی اطلاعات رو از رجستر به بافر منتقل کنی از وقفه خارج نشه.یک برنامه برای سیم 900 اقای اروین در همین بخش گداشته.اون رو نگاه کنید همین کار های شما رو بصورت راحت تر انجام داده.بعد شما با نوشتنcher get برنامه همینطور منتطر میماند دیگه وقفه میخواید چیکار.پیشنهاد میکنم برنامه سیم 900 همین بخش رو حتما نگاه کنید.از متدد خاصی استفاده شده.
            سلام

            الان زیروال وقفه رو به صورت زیر تغییر دادم ، BUFSIZE رو هم فرقی نداره چند بزارم از وقفه خارج میشه ولی یه مشکل ، اگر اون tftlcd_clear(); رو پاک کنم دیگه از وقفه خارج نمیشه oo: فکر کنم چون اون tftlcd_clear(); خودش ارجاع میده به یه تابع موجب خارج شدن از وقفه میشه ، نمیشه کاریش کرد ؟؟؟ آخه نمیخام LCD پاک بشه :biggrin: مثلا return بشه به همونجا که بوده ؟؟؟

            راستی الان من 4 تا رشته دارم که یکیش 1111 هست و یکیش 2222E و یکیش 3333R و یکیش 4444T هست ، خوب الان میخام این E و R و T رو از آخر اون 3 تا رشته حذف کنم و بعد 4 تا رشته رو به عدد تبدیل کنم ، یعنی بتونم اعمال جبری روش انجام بدم و ....

            ممنون
            http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

            دیدگاه


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

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

              الان زیروال وقفه رو به صورت زیر تغییر دادم ، BUFSIZE رو هم فرقی نداره چند بزارم از وقفه خارج میشه ولی یه مشکل ، اگر اون tftlcd_clear(); رو پاک کنم دیگه از وقفه خارج نمیشه oo: فکر کنم چون اون tftlcd_clear(); خودش ارجاع میده به یه تابع موجب خارج شدن از وقفه میشه ، نمیشه کاریش کرد ؟؟؟ آخه نمیخام LCD پاک بشه :biggrin: مثلا return بشه به همونجا که بوده ؟؟؟

              راستی الان من 4 تا رشته دارم که یکیش 1111 هست و یکیش 2222E و یکیش 3333R و یکیش 4444T هست ، خوب الان میخام این E و R و T رو از آخر اون 3 تا رشته حذف کنم و بعد 4 تا رشته رو به عدد تبدیل کنم ، یعنی بتونم اعمال جبری روش انجام بدم و ....

              ممنون
              ببخشید
              این زیرروال وقفه ، مربوط به پست بالا :
              کد:
              void UART0_IRQHandler(void) {
              	UART0_GetZE10(Output1ze10,Output2ze10,Output3ze10,Output4ze10);
               tftlcd_clear();
              	 rx_buffer[Cnt++] = LPC_UART0->RBR;
                 if (Cnt == BUFSIZE){
                  Cnt = 0;		/* buffer overflow */   
                 }  
              	NVIC_ClearPendingIRQ(UART0_IRQn);  // Clear Interrupt
              	}
              http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

              دیدگاه


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

                این برنامه رو با سیمولاتور خود کیل امتحان کن ببین از روال وقفه میاد بیرون
                http://www.uplooder.net/cgi-bin/dl.cgi?key=f51dae8ef7b6bb8d1700bfc8cda041c0

                دیدگاه


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

                  برای برداشتن اون حرفها از انتهای عداد هرچند میشه از پایه درستش کرد ولی اگه نمیتونی از توابع کتابخانه string.h استفاده کن.و برای اینکه به مقدار عدد درش بیاری از تابع atoi() از کتابخانه stdlib.h
                  ولی برای به دست اوردن اون عداد میشه از راه های بهتری استفاده کرد که اینم من بگم هم برنامه رو من نوشتم.lol

                  دیدگاه


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

                    نوشته اصلی توسط D.S
                    این برنامه رو با سیمولاتور خود کیل امتحان کن ببین از روال وقفه میاد بیرون
                    http://www.uplooder.net/cgi-bin/dl.cgi?key=f51dae8ef7b6bb8d1700bfc8cda041c0
                    سلام

                    خیر ، وقتی آخرین خط زیروال رو اجرا میکنه میره به تابع UART0_SendByte و دوباره برمیگرده به زیروال oo:
                    راستی برای حذف اون علامت ها ، شما گفتید که میشه از پایه درستش کرد ، میشه بگید چطوری ؟؟؟ ممنون میشوم :nerd:
                    من الان رشته ی 000195000000510C:Q1111W2222E3333R4444T+ هست ، که داده های اصلی همون 1111 و 2222 و .... هستند و اون قسمت اولی یعنی :000195000000510C+ هست و نمیشه کاریش کرد ولی میتونم بعد از اون یعنی نحوه ارسال اون اعداد و علامت های بینشون که خودم گزاشتم مثلا Q و W و ... رو تغییر بدم

                    ممنون
                    منتطرم
                    http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

                    دیدگاه


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

                      دیگه برنامه ای که برات فرستادم درست کار میکنه.اگه بر تو زیر روال دائم پرت 2 خاموش روشن میشه.شما دوتا کارکتر بفرستید پرت دوبار خاموش روشن میشه.برای ادامه مطالب هم با ید عرض کنم که من هیچی نفهمیدم.یکبار خودت بخون ببین میفهمی چی نوشتی

                      دیدگاه


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

                        ببین با گیت کر کار نکن کل اطلاعاتت رو بریز توی یک بافر بعد مثل کد زیر عمل کن
                        if(Cnt>0){
                        delay_ms(100);
                        Cnt=strlen(rx_buffer);
                        for(I=0;I<=Cnt;I++){
                        for(i=0;i<=3;i++)
                        M[i]=rx_buffer[i+I];
                        if(!strcmp(M,"CLIP&quot){
                        for(j=0;j<=Cnt;j++){
                        for(i=0;i<=3;i++)
                        M[i]=rx_buffer[i+j];
                        if(!strcmp(M,"+989&quot){
                        حالا میتونی جای clip و +989 علائم خودت رو بزاری.گفتم برنامه سیم 900 اروین رو نگاه کن.یک تغیر دیگه هم باید بدی وقتی به علائم رسید تعداد شمارش فر رو 4 تا کن نا اندازه دیتای که میخوای بشه

                        دیدگاه

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