اطلاعیه

Collapse
No announcement yet.

کار با وقفه تایمر

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

    کار با وقفه تایمر

    سلام.
    برنامه زیر را برای کار با وقفه تامیر صفر دانلود کردم و قراره که یک موج مربعی با دوره تناوب 400us با استفاده از وقفه سرریز تولید کند
    کد:
    #include <mega16.h>
    #define xtal 8000000
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    PORTA^=0xFF;
    TCNT0=0x38; //TCNT=55
    }
    void main(void)
    {
    DDRA=0xFF;
    PORTA=0x00;
    TCCR0=0B00000010; // Timer Clock = CLK/8
    TIMSK=0x01; //Enable TIMER0 Overflow
    Interrupt
    #asm("sei") // Global enable interrupts
    TCNT0=0x38;
    while (1);
    }
    تعریف وقفه به این صورت است که هنگامی که وقفه رخ داد، اجرای برنامه اصلی متوقف شود و آدرس خط ذخیره شود و زیر برنامه وقفه اجرا شود. بعد از اتمام زیر برنامه وقفه به آدرس ذخیره شده برود. در این برنامه هنگامی که وقفه رخ می دهد برنامه قبل از دستور while است و بعد از انجام سرویس وقفه به دستور while میرسیم که یک حلقه بی نهایت است بنابراین ما تنها باید یک پالس که از صفر به یک تغییر حالت می دهد داشته باشیم.
    در شبیه سازی یک موج مربعی داریم.

    دنیا آنقدر وسیع هست که برای همه مخلوقات جایی باشد پس به جای آنکه جای کسی را بگیریم تلاش کنیم جای واقعی خود را بیابیم

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

    خب الان مشکل کجاست؟؟؟
    ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

    امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

    دیدگاه


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

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

      یه سوال دیگر: در هنگام استفاده از وقفه بیت سرریز TOV خودش صفر میشه؟به صورت سخت افزاری دیگه لازم نیست صفر کنیم؟
      دنیا آنقدر وسیع هست که برای همه مخلوقات جایی باشد پس به جای آنکه جای کسی را بگیریم تلاش کنیم جای واقعی خود را بیابیم

      دیدگاه


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

        در روتین رسیدگی به وقفه اول وقفه عمومی رو باید از کار بنداری بعدش هم باید پرچم tifr رو با نوشتن یک در اون پاکش کنی برای وقفه های بعدی. اینکه خروجی در یک حالت میمونه به خاطر پاک نکردن پرچم هاست.
        در آخر هم دوباره وقفه عمومی رو فعال کن
        ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

        امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

        دیدگاه


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

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

          ولی مشکل دوم من با پاک کردن بیت سرریز حل نشده. متوجه نمیشم که کی این بیت را پاک می کنه
          دنیا آنقدر وسیع هست که برای همه مخلوقات جایی باشد پس به جای آنکه جای کسی را بگیریم تلاش کنیم جای واقعی خود را بیابیم

          دیدگاه


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

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

            ولی مشکل دوم من با پاک کردن بیت سرریز حل نشده. متوجه نمیشم که کی این بیت را پاک می کنه
            وقتی وقفه ای اتفاق می افتد پرچم وقفه مربوطه یک می شود.
            تحت این دو حالت پرچم پاک می شود:
            1-هنگام خروج از روتین وقفه مربوطه اتوماتیک پرچم وقفه پاک میشه (در مورد برنامه شما این حالت صدق میکنه)
            2-با نوشتن یک در بیت مربوط به پرچم وقفه این بیت صفر می شود.(توجه کنید نوشتن صفر در آن بی اثر است و برای صفر کردن آن باید در آن یک نوشته شود.)
            افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

            دیدگاه


              #7
              پاسخ : کار با وقفه تایمر

              از کجاباید متوجه بشیم که این بیت به صورت خودکار صفر میشود و یا باید خودمان صفر کنیم؟
              دنیا آنقدر وسیع هست که برای همه مخلوقات جایی باشد پس به جای آنکه جای کسی را بگیریم تلاش کنیم جای واقعی خود را بیابیم

              دیدگاه


                #8
                پاسخ : کار با وقفه تایمر

                نوشته اصلی توسط seda...
                از کجاباید متوجه بشیم که این بیت به صورت خودکار صفر میشود و یا باید خودمان صفر کنیم؟
                بستگی به برنامه شما داره
                اگر شما از زیر برنامه وقفه استفاده کنید نیازی به پاک کردن اون ندارید و این کار اتوماتیک انجام میشه.
                ولی اگر زیر برنامه وقفه وجود نداشته باشه و برنامه شما وابسته به وضعیت این بیت باشه شما باید خودتون اون رو صفر کنید
                مثلا: برای ایجاد تاخیر برنامه ای لازم دارید که تایمر رو فعال میکنه و تا زمانی که سرریز اتفاق بیافته باید صبر کنه(عملکرد مشابه delay_us یا delay_ms )
                برای اینکار شما نیاز دارید بعد از روشن کردن تایمر مرتب بیت پرچم سرریز رو چک کنید و تا وقتی این بیت یک نشده (و در نتیجه سرریز اتفاق نیافتاده) تو همون قسمت از برنامه بمونید
                بعد که بیت یک شد بقیه برنامه رو ادامه بدید.
                حالا وقتی سریز اتفاق بیافته این بیت یک میشه و شما متوجه سرریز میشید(چون مرتب در حال چک کردن این بیت هستید) و برنامه رو ادامه میدید ولی مساله اینجاست که چون از زیر برنامه وقفه استفاده نکردید بعد از یک شدن این بیت، همچنان یک باقی میمونه در نتیجه برای استفاده بعدی لازمه شما دستی این بیت رو صفر کنید(با نوشتن یک تو اون بیت)
                افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

                دیدگاه


                  #9
                  پاسخ : کار با وقفه تایمر

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

                  دیدگاه

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