اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه خارجی

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

    مشکل با وقفه خارجی

    سلام
    میخوام فاصله زمانی اتفاق افتادن 2 تا وقفه خارجی رو اندازه گیری
    کنم و تو محاسباتم ازش استفاده کنم.
    از وقفه خارجی صفر استفاده میکنم و میخوام مثلا تایمر یک با یک شدن
    into شروع به شمارش کنه و با یک شدن مجدد int0 متوقف بشه و فاصله این 2 تا وقفه رو حساب کنه.و
    این کار مرتبا تکرار بشه.
    برنامه ای که نوشتم اینه ولی شبیه سازیش جواب نمیده :cry2:
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    // Place your code here
    n++;

    }

    if(n==1){
    T1=TCNT1;
    TCNT1=0;
    }
    if(n==2){
    T2=TCNT1;
    TCNT1=0;
    n=0;
    }
    T=T1+T2;

    #2
    پاسخ : مشکل با وقفه خارجی

    سلام دادا.
    کل ایم کارو باید توی خود وقفه انجام بدی.
    زمانی که وقفه اول اتفاق افتاد تایمر بکار بیفته. و اگه دوباره وقفه فعال شد از کار بیفته.
    حالا برای تشخیص اولین رخداد و دومین رخداد باید از روج و فرد استفاده کنی. یعنی یه شمارنده تئی وقفه بذاری و مثلاً وفتی فرد بود یعنی برای اولین بار زده شده و وقتی زوج بود برای دومین بار.
    تشکر لازم نیست!

    دیدگاه


      #3
      پاسخ : مشکل با وقفه خارجی

      ممنون که جواب دادین
      ولی یه راه حل خوب اینه که یه متغییر تو خود وقفه مثل n بگیریم
      بعدش از اون خارج وقفه و تو while استفاده کنیم . ولی نمیدونم چرا برنامم جواب نمیده :cry2:
      یه سوال: زوج و فرد بودنشو چطور بگم؟
      مثلا mode n/2 =0 , mode n/2=1 یا راه حل دیگه ای داره؟

      دیدگاه


        #4
        پاسخ : مشکل با وقفه خارجی

        سلام دادا.
        ولی یه راه حل خوب اینه که یه متغییر تو خود وقفه مثل n بگیریم
        بعدش از اون خارج وقفه و تو while استفاده کنیم .
        اینطوری درست نیست دادا.
        زمانی که یه وقفه ایجاد میشه روند برنامه متوقف میشه و وارد روتین وقفه میشه تا اونو اجرا کنه و در این میان شما این زمان رو از دست میدی. بهتره اوی همون وقفه تایمر رو روشن کنی.

        یه سوال: زوج و فرد بودنشو چطور بگم؟
        باقیمانده تقسیم یک عدد زوج به 2 برابر صفر و باقیمانده عددی فرد به 2 برابر یک است. (عملگر باقیمانده % هست دادا).
        تشکر لازم نیست!

        دیدگاه


          #5
          پاسخ : مشکل با وقفه خارجی

          ممنون
          همین کارو میکنم (ولی زمان وقوع وقفه خیلی کمه مثلا صدم ثانیه و عملا در نظر گرفته نمیشه)
          سوال:من میخوام به اندازه T1+T2=T مثلاPORTA.0=1 بشه ولی وقتی T1بدست میاد
          برنامه دیگه منتظر T2 نمیشه!و به اندازه T1+0=T اجرا میشه ! واسه این چیکار کنم؟
          سوال دوم: میخوام به اندازه T از دستور
          (delay_ms(T استفاده کنم،به نظرتون باید روی Tتبدیلی انجام بدم، یا همین دستور کافیه؟
          ممنونم که جواب میدین :smile:

          دیدگاه


            #6
            پاسخ : مشکل با وقفه خارجی

            برنامم رو اصلاح کردم ولی باز زمان اشتباهی میده:
            interrupt [EXT_INT0] void ext_int0_isr(void)
            {
            // Place your code here
            n++;
            a=1;
            m=n%2;
            if(m==1){
            TIMSK=0x40;
            }
            else{
            TIMSK=0x00;
            T=TCNT1;
            TCNT1=0;
            n=0;
            }
            }

            while (1)
            {
            // Place your code here
            if(a==1){

            delay_ms(T);
            PORTB.0=1;
            delay_ms(T);
            PORTB.0=0;
            کسی میدونه مشکل این برنامه چیه؟؟؟؟؟؟؟؟ :angry:

            دیدگاه

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