اطلاعیه

Collapse
No announcement yet.

مشکلی در زیر روال وقفه....

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

    مشکلی در زیر روال وقفه....

    سلام به همه دوستان و اساتید

    با اجازه یسوال داشتم ؟

    توی این برنامه ای که قرار دارم توی زیر روال وقفه باید مقدار موجود روی PIND.2 میکرو خونده بشه و داخل یک ارایه ثبت بشه

    اینم کد
    کد:
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    MCUCR=0x00;
    GIFR=0x00;
    GICR=0x00;
    x=0;
    for(i=0;i<14;i++)
    {
    fun1();
    D[i]=PIND.2;
    fun2();
    
    }
    GICR=0x40;
    GIFR=0x40;
    MCUCR=0x02;
    x=1;
    }
    با ورود به وقفه تمام ریجستر های مربوط به وقفه خارجی 0 (ATMEGA8 )
    غیر فعال کردم تا مطمن شم که PIND.2 بصورت وردی کار کیکنه و در اختیار وقفه خارجی قرار نداره
    بعد در داخل حلقه FOR مقدار موجود در روی PIND.2 خوانده میشه و در داخل ارایه قرار میگیره....
    نوع ارابه هم از نوع UNSIGNED INT هست
    این برنامه توی شبیه ساز(PROTUSE)
    کار میکنه و جواب هم میده ولی توی واقیت کار نمیکنه و همش عدد 0 رو برمیگردونه

    که نباید اینطور باشه باید 1 هم نشون بده

    دو تابع FUN1 وFUN2
    برای ایجاد تاخیر بکار مبرند..
    دوستان منتظر جوابتون هستم

    #2
    پاسخ : مشکلی در زیر روال وقفه....

    شما اومدید داخل وقفه تاخیر و حلقه for قرار دادید!! بهتره که یه فلگ داخل وقفه بذارید و با 1 شدن فلگ داخل while(1) برنامتون اجرا بشه.
    www.gam-co.blogsky.com

    دیدگاه


      #3
      پاسخ : مشکلی در زیر روال وقفه....

      نوشته اصلی توسط vahidabedi
      شما اومدید داخل وقفه تاخیر و حلقه for قرار دادید!! بهتره که یه فلگ داخل وقفه بذارید و با 1 شدن فلگ داخل while(1) برنامتون اجرا بشه.
      ممنونکه جواب دادید

      این برنامه تو protuse کار میده و نتیجه مطلوبه تحویل میده ولی تو واقعیت نه...

      اینو باید چیکار کنم؟؟؟؟


      دیدگاه


        #4
        پاسخ : مشکلی در زیر روال وقفه....

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

        دیدگاه


          #5
          پاسخ : مشکلی در زیر روال وقفه....

          کد:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.05.3 Standard
          Automatic Program Generator
          © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : 
          Version : 
          Date  : 21/03/2015
          Author : H-TORABI
          Company : 
          Comments: 
          
          
          Chip type        : ATmega8
          Program type      : Application
          AVR Core Clock frequency: 12.000000 MHz
          Memory model      : Small
          External RAM size    : 0
          Data Stack size     : 256
          *****************************************************/
          
          #include <mega8.h>
          #include <stdio.h>
          #include <delay.h>
          // Alphanumeric LCD functions
          #include <alcd.h>
          unsigned char D[14];
          unsigned int i,j,g;
          bit x=0;
          char str1[14];
          //make 1.3ms=1300us delay..
          void fun1()
          {
          TCNT0=9;
          TCCR0=0x03;
          while(!(TIFR&0b00000001))
          {
          
          }
          TIFR=0b0000001;
          TCCR0=0x00;
          }
          //make 444 us delay;
          void fun2()
          {
          TCNT0=173;
          TCCR0=0x03;
          while(!(TIFR&0b00000001))
          {
          
          }
          TIFR=0b0000001;
          TCCR0=0x00;
          }
          
          // External Interrupt 0 service routine
          interrupt [EXT_INT0] void ext_int0_isr(void)
          {
          MCUCR=0x00;
          GIFR=0x00;
          GICR=0x00;
          x=0;
          for(i=0;i<14;i++)
          {
          fun1();
          PORTB.0=1;
          D[i]=PIND.2;
          PORTB.0=0;
          //delay_us(35);
          fun2();
          
          }
          
          x=1;
          }
          
          // Declare your global variables here
          
          void main(void)
          {
          // Declare your local variables here
          
          // Input/Output Ports initialization
          // Port B initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
          // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
          PORTB=0x00;
          DDRB=0xFF;
          
          // Port C initialization
          // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          
          // Port D initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTD=0x00;
          DDRD=0x00;
          
          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: 187.500 kHz
          TCCR0=0x00;//0x03
          TCNT0=0x00;
          
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: Timer1 Stopped
          // Mode: Normal top=0xFFFF
          // OC1A output: Discon.
          // OC1B output: Discon.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer1 Overflow Interrupt: Off
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          
          
          // External Interrupt(s) initialization
          // INT0: On
          // INT0 Mode: Falling Edge
          // INT1: Off
          GICR|=0x40;
          MCUCR=0x02;
          GIFR=0x40;
          
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x00;
          
          // USART initialization
          // USART disabled
          
          
          // Alphanumeric LCD initialization
          // Connections are specified in the
          // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
          // RS - PORTD Bit 7
          // RD - PORTD Bit 6
          // EN - PORTD Bit 5
          // D4 - PORTD Bit 4
          // D5 - PORTD Bit 3
          // D6 - PORTD Bit 1
          // D7 - PORTD Bit 0
          // Characters/line: 16
          lcd_init(16);
          
          // Global enable interrupts
          #asm("sei")
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_putsf("RC5-PROJECT");
          delay_ms(150);
          for(g=0;g<14;g++)
          {
          D[g]=0;
          }
          while (1)
          
             {
              if(x==1)
              {
              for(j=0;j<14;j++)
              {
              sprintf(str1,"DATE=%u N=%u",D[j],j);
              lcd_clear();
              lcd_gotoxy(0,0);
              lcd_puts(str1);
              delay_ms(150);
              lcd_clear();
              }
              lcd_gotoxy(0,1);
              lcd_putsf("finish");
              delay_ms(150);
              lcd_clear(); 
              for(g=0;g<14;g++)
              {
              D[g]=0;
              }
              x=0;
              MCUCR=0x02;
              GICR=0x40;
              GIFR=0x40;
              }
              else if(x==0)
              {
              lcd_clear();
              lcd_gotoxy(0,0);
              lcd_putsf("NO DATE !");
              delay_ms(250);
              }
             }
          }
          سلام اینم برنامه کامل توضیح اینکه برنامه چطور کار میکنه

          توی پست بعدی قرار میدم...

          دیدگاه


            #6
            پاسخ : مشکلی در زیر روال وقفه....

            سلام به همه دوستان سال نوهمه دوستان مبارک @};- @};- @};- @};- @};- @};- @};-


            تو این برنامه برای تشخیص دادن صفر و یک بودن بیت دریافتی از سنسور گیرنده tsop

            از این روش استفاده شده

            همونطور که تمام دوستان میدونن 0 و 1 در rc-5 به شکل زیر تشخیص داده میشوند


            هر بیت از دو قسمت با زمان 889 us درست میشه اگر قسمت اول صفر باشه و قسمت دوم دارای مدالاسیون باشه معادل 1 میشد

            و بلعکس اون هم میشه معادل 0

            این سیگنالی که در تصویر مشاهده میکنید سیگنالی هست که فرستنده باید تولید کنه

            و در گیرنده باید به این شکل تبدیل بشه


            تو این برنامه برای تشخیص دادن 0 و1 بیت های دریافت شده ما میام قسمت دوم سیگنال دریافتی میخونیم پس 889us اول کاری نداریم از 889us دوم هم نصفشو رد میکنیم که نصفش میشه 444

            و جمع این دو 889us +444us برابر میشه با 1.3 ms تقریبا.......

            یعنی 1.3ms صبر میکنیم و هیچ کاری انجام نمیدیم تا به قسمت دوم برسیم

            وقتی به قسمت دوم رسیدیم از سیگنال نمونه برداری میکنیم اگر قسمت دوم دارای سطح 1 باشه به معنی این هست که این بیت معادل 1 (با توجه به تصویراول)

            واگر قسمت دوم سیگنال دارای سطح 0 باشه به این معنی هست که بیت دریافتی معادل 0 میباشد (با توجه به تصویراول)

            و اطلاعات دریافتی رو در یک ارایه ذخیره میکنیم

            تو برنامه ای که نوشتیم تونستیم بدون مشکل سیگنال دریافتی رو بصورت درست دریافت کنیم

            و درقسمت تایین شده نمونه برداری انجام بشه
            اینم تصاویری از محیط protuse



            این برنامه توی شبیه ساز درست کار میکنه ولی توی واقعیت درست جواب نمیده :eek:

            یعنی تمام دیتا های دریافتی رو 0 نشون میده....

            حالا موندم علتش چی میتونه باشه


            دیدگاه


              #7
              پاسخ : مشکلی در زیر روال وقفه....

              دقیقا از چه سنسوری استفاده میکنید؟
              rc-5 یه پروتکل ارتباطی هست شما خودتون سیگنال فرستنده رو تولید میکنید یا قراره یه وسیله ای ارسال کنه؟
              تو 889 میکرو ثانیه ای که توی hiقرار داره 27 میکرو ثانیه hi و 27 میکرو ثانیه در قسمت LOW قرار داره. شما دارید یه لحظه رو میخونید که سیگنال ممکنه hi یا low باشه اگر hi باشه میکروتون ممکنه درست عمل کنه اما اگه low بخونه چی؟
              متوجه منظورم شدید؟
              اسمم بابا برقيه مي دونين کارم چيه دلم مي خواد همه جا که با کمک شما
              مصرف برق کم بشه تا برقمون قطع نشه
              مصرف بي رويه کار خيلي بديه موقع پخش کارتون برق تلويزيون
              اگه يه دفعه بره حوصله مون سر مي ره
              هرگز نشه فراموش لامپ اضافي خاموش

              دیدگاه


                #8
                پاسخ : مشکلی در زیر روال وقفه....


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

                دیدگاه


                  #9
                  پاسخ : مشکلی در زیر روال وقفه....

                  نوشته اصلی توسط بابا برقی
                  دقیقا از چه سنسوری استفاده میکنید؟
                  rc-5 یه پروتکل ارتباطی هست شما خودتون سیگنال فرستنده رو تولید میکنید یا قراره یه وسیله ای ارسال کنه؟
                  تو 889 میکرو ثانیه ای که توی hiقرار داره 27 میکرو ثانیه hi و 27 میکرو ثانیه در قسمت LOW قرار داره. شما دارید یه لحظه رو میخونید که سیگنال ممکنه hi یا low باشه اگر hi باشه میکروتون ممکنه درست عمل کنه اما اگه low بخونه چی؟
                  متوجه منظورم شدید؟
                  دوست عزیز از tsop1330 برای دریافت سیگنال استفاده میکنم

                  و از اینم اطلاع دارم که rc-5 یه پروتکل ارتباطی هست :agree:

                  سیگنال فرستنده رو هم با atmega8 درست کردم

                  پروتکل rc-5 که فرکانسی مرکزیش 36khz هست

                  ولی در این مورد بخاطر استفاده از tsop1330 که فرکانس مرکزیش 30khz هست

                  پروتکل rc-5 با فرکانس مرکزی 30khz ساختم (ولی منطق 0 و 1 همونه مثل تصوسری که قرار دادید)....


                  نه اینجا نیازی نیست هر 27 میکرو ثانیه اطلاعات رو بخونم :eek:

                  بطور کامل در راجب به خوندن اطلاعات توضیح دادم

                  توی همین تایپ بعد از کد برنامه




                  دیدگاه


                    #10
                    پاسخ : مشکلی در زیر روال وقفه....

                    و این برنامه برای تشخیص دادن 0 و1 بیت های دریافت شده ما میام قسمت دوم سیگنال دریافتی میخونیم پس 889us اول کاری نداریم از 889us دوم هم نصفشو رد میکنیم که نصفش میشه 444

                    و جمع این دو 889us +444us برابر میشه با 1.3 ms تقریبا.......

                    یعنی 1.3ms صبر میکنیم و هیچ کاری انجام نمیدیم تا به قسمت دوم برسیم

                    وقتی به قسمت دوم رسیدیم از سیگنال نمونه برداری میکنیم اگر قسمت دوم دارای سطح 1 باشه به معنی این هست که این بیت معادل 1 (با توجه به تصویراول)
                    این غلطه که شما یه بار نمونه برداری کنید و نتیجه بگیریرد که سیگنال سطح یک نداره.اون سیگنال در هر 27 میکرو ثانیه 9 میکرو ثانیش سطح یک داره و بقیش صفره :agree:
                    اسمم بابا برقيه مي دونين کارم چيه دلم مي خواد همه جا که با کمک شما
                    مصرف برق کم بشه تا برقمون قطع نشه
                    مصرف بي رويه کار خيلي بديه موقع پخش کارتون برق تلويزيون
                    اگه يه دفعه بره حوصله مون سر مي ره
                    هرگز نشه فراموش لامپ اضافي خاموش

                    دیدگاه


                      #11
                      پاسخ : مشکلی در زیر روال وقفه....

                      نوشته اصلی توسط بابا برقی
                      این غلطه که شما یه بار نمونه برداری کنید و نتیجه بگیریرد که سیگنال سطح یک نداره.اون سیگنال در هر 27 میکرو ثانیه 9 میکرو ثانیش سطح یک داره و بقیش صفره :agree:
                      دوست عزیز چیزی که میکرو از tsop میگیره اینه..



                      نه این...




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

                      دیدگاه


                        #12
                        پاسخ : مشکلی در زیر روال وقفه....

                        من از این که میکرو چه سیگنالی رو دریافت میکنه اطلاعی ندارم ولی اگه مطمینید سیگنال همونطور که گفتید به میکرو میرسه
                        اول مطمین بشید فیوزبیتهای میکرو روی کریستال خارجی و از کریستال 12مگ استفاده میکنید
                        بعدش این بخش از کدتون رو اصلاح کنید
                        [code=c]// Global enable interrupts

                        lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("RC5-PROJECT"


                        for(g=0;g<14;g++)
                        {
                        D[g]=0;
                        }
                        #asm("sei&quot
                        delay_ms(150);
                        [/code]
                        اسمم بابا برقيه مي دونين کارم چيه دلم مي خواد همه جا که با کمک شما
                        مصرف برق کم بشه تا برقمون قطع نشه
                        مصرف بي رويه کار خيلي بديه موقع پخش کارتون برق تلويزيون
                        اگه يه دفعه بره حوصله مون سر مي ره
                        هرگز نشه فراموش لامپ اضافي خاموش

                        دیدگاه


                          #13
                          پاسخ : مشکلی در زیر روال وقفه....

                          نوشته اصلی توسط بابا برقی
                          من از این که میکرو چه سیگنالی رو دریافت میکنه اطلاعی ندارم ولی اگه مطمینید سیگنال همونطور که گفتید به میکرو میرسه
                          اول مطمین بشید فیوزبیتهای میکرو روی کریستال خارجی و از کریستال 12مگ استفاده میکنید
                          بعدش این بخش از کدتون رو اصلاح کنید
                          [code=c]// Global enable interrupts

                          lcd_clear();
                          lcd_gotoxy(0,0);
                          lcd_putsf("RC5-PROJECT"


                          for(g=0;g<14;g++)
                          {
                          D[g]=0;
                          }
                          #asm("sei&quot
                          delay_ms(150);
                          [/code]
                          کریستال میکرو 12 MHZ

                          و فیوز بیت ها رو هم درست انتخواب کردم :read:

                          ببخشید مشکل این قسمت کد چی هست :question:

                          که میگید به صورتی که قرار دادید درستش کنم....؟؟

                          دیدگاه


                            #14
                            پاسخ : مشکلی در زیر روال وقفه....

                            اول اینتراپت رو فعال میکنید
                            بعدش زمان تاخیر میدید که متغیر D پر بشه
                            بعدش دوباره میگید D رو خالی کن!

                            بعضی جاها کدی که زدید مشکل داره مثلاً این تابع اینتراپت شماست
                            [code=c]
                            interrupt [EXT_INT0] void ext_int0_isr(void)
                            {
                            MCUCR=0x00;
                            GIFR=0x00;
                            GICR=0x00;
                            x=0; //متغیر ایکس صفر شود
                            for(i=0;i<14;i++)
                            {
                            fun1();
                            PORTB.0=1;
                            D[i]=PIND.2;
                            PORTB.0=0;
                            //delay_us(35);
                            fun2();
                            }

                            x=1; //متغیر ایکس 1 شد
                            }


                            [/code]
                            متغیر ایکس داخل اینتراپت اول صفر و بعدا یک میشه .بعد داخل حلقه while(1) گفتید اگه x=0 بود ... کن در صورتی که هیچ وقت صفر نمیتونه باشه و ...
                            شما دیتا رو تو شبیه سازی با تاخیر ارسال کنید و تست بگیرید اون وقت احتمالا تو شبیه سازی هم دچار مشکل بشه.
                            حالا یه تست بزنید و نتیجه رو اعلام کنید.
                            اسمم بابا برقيه مي دونين کارم چيه دلم مي خواد همه جا که با کمک شما
                            مصرف برق کم بشه تا برقمون قطع نشه
                            مصرف بي رويه کار خيلي بديه موقع پخش کارتون برق تلويزيون
                            اگه يه دفعه بره حوصله مون سر مي ره
                            هرگز نشه فراموش لامپ اضافي خاموش

                            دیدگاه


                              #15
                              پاسخ : مشکلی در زیر روال وقفه....

                              نوشته اصلی توسط بابا برقی
                              اول اینتراپت رو فعال میکنید
                              بعدش زمان تاخیر میدید که متغیر D پر بشه
                              بعدش دوباره میگید D رو خالی کن!

                              بعضی جاها کدی که زدید مشکل داره مثلاً این تابع اینتراپت شماست
                              [code=c]
                              interrupt [EXT_INT0] void ext_int0_isr(void)
                              {
                              MCUCR=0x00;
                              GIFR=0x00;
                              GICR=0x00;
                              x=0; //متغیر ایکس صفر شود
                              for(i=0;i<14;i++)
                              {
                              fun1();
                              PORTB.0=1;
                              D[i]=PIND.2;
                              PORTB.0=0;
                              //delay_us(35);
                              fun2();
                              }

                              x=1; //متغیر ایکس 1 شد
                              }


                              [/code]
                              متغیر ایکس داخل اینتراپت اول صفر و بعدا یک میشه .بعد داخل حلقه while(1) گفتید اگه x=0 بود ... کن در صورتی که هیچ وقت صفر نمیتونه باشه و ...
                              شما دیتا رو تو شبیه سازی با تاخیر ارسال کنید و تست بگیرید اون وقت احتمالا تو شبیه سازی هم دچار مشکل بشه.
                              حالا یه تست بزنید و نتیجه رو اعلام کنید.
                              سلام ببینید این کد فقط بار اول اجدا میشه
                              کد:
                              for(g=0;g<14;g++)
                              {
                              D[g]=0;
                              }
                              البته میتونه نباشه....

                              زیاد بودنش مهم نیست (البته تو اینجا...)

                              در مورد روال وقفه هم عرض کنم خدمدتون

                              اگه به برنامه نگاه کنیید متوجه میشید

                              متغیر x از اول برنامه برابر 0 هست همین باعث میشه

                              تو حلقه while عبارت "no date !"

                              برای اینکه هنوز دیتایی دریافت نشده

                              نشون میده

                              وقتی داخل روال وقفه میشه متغیره x رو از دوباره برابر 0 قرار مبده نمونه برداریشو که انجام داد

                              x=1 وقتی این کار رو انجام داد

                              تو حلقه while با 1 شدن x میاد دیتای دریافت شده از pind.2 رو که توی ارایه ذخیره شده

                              در نمایشگر نشون میده و بعد از نمایش عبارت "finish"

                              بعد هم مقدار تمام تمام عناصر ارایه رو برابر 0 میکنه وبعد هم x برابر 0 میکنه

                              و وقفه خارجی میکرو رو فعال میکنه....

                              و بازم تکرار .....

                              میشه بگید چطور به این نتیجه رسیدید که x هیچ وقت0 نمیشه :eek: :question:

                              اول برنامه قسمت تعریف متغیر ها رو نکاه کنید.......

                              دوست عزیز با تاخیر دادن توی فرستنده برنامه کار میکنه

                              شما برنامه رو نگاه کن خودتون متوجه میشی ....... :agree:

                              اها راستی اوا پست فرمودید زمان میدید تا متغیر پر بشه :eek:

                              من این زمان دادم برای موندن عبارت روی نمایشگر

                              البته قبول دارم این حلقه for قبل از while کار خاصی انجام نمیده

                              ولی فقط یبار انجام میشه.............

                              وبعد هم اجرای باقیه کار ها...

                              بازم ممنون میشم اگه مشکلی دیدید بگید ............

                              امید وارم جواب سوالاتونو گرفته باشید

                              دیدگاه

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