اطلاعیه

Collapse
No announcement yet.

استفاده از دو وقفه همزمان

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

    استفاده از دو وقفه همزمان

    سلام
    توی یک پروژه من لازمه که که هر 10 ثانیه توسط تایمر یک وقفه ایجاد بشه و یک سری از پارامترها رو اندازه گیری بکنه
    و پایه ی int0 رو هم اگه فشار بدیم برنامه باید بره به setting
    حالا کمکی که من از دوستان میخوام اینه که اگه کاربر کلیدی که به int0 وصله رو فشار بده و توی برنامه وقفه ایجاد بشه حالا اگه ست کردن تنظیمات توسط کاربر طول بکشه با توجه به این که دیگه وقفه تایمر تاثیری نداره چجوری باید هر 10 ثانیه پارامترها رو چک کنه
    البته بگم چون برنامم طولانیه نمیتونم برای settiung از if استفاده کنم

    #2
    پاسخ : استفاده از دو وقفه همزمان

    سلام
    فکر کنم اگر توی سابروتین اینتراپت خارجی ، دستور فعال سازی تایمر رو هم اضافه کنی میتونی در حین ست کردن پارامترها اگه 10ثانیه شد، وارد سابروتین وقفه تایمر بشی ولی مطمئن نیستم که جواب بده. تازه لازمه یه شرطی هم بذاری که وقتی از داخل سابروتین اینتراپت خارجی به سابروتین وقفه تایمر رفت و پارامترها رو اندازه گرفت دوباره برگردد به سابروتین اینتراپت خارجی. :sad: :sad:

    به نظر من بهترین کار برای حل شدن مشکل صرف نظر کردن از استفاده از وقفه خارجیه. همونطور توی حلقه اصلی برنامه شرطی بذار که اگر یه پین مشخصی(مثلا همون پین int0) یک شد، برنامهآ‌ی setting انجام بشه. در این حالت که توی حلقه اصلی برنامه داری setting رو انجام می دی اگه کارت طول بکشه و بیش از 10ثانیه بشه خیلی راحت و سریع بدون مشکلی برنامه وارد وقفه تایمر شده و پارامترها را اندازه گیری می کنه و برمیگرده به خطی که در قسمت Setting بوده و ادامه میده. :agree: :rolleyes: :read: :redface:
    به يادت ميآ‌مانم و ميآ‌دانم که ميآ‌آيي--- تو تنها يادگار مانده از قوم اهورائي-

    دیدگاه


      #3
      پاسخ : استفاده از دو وقفه همزمان

      نوشته اصلی توسط mo'jezeh
      سلام
      فکر کنم اگر توی سابروتین اینتراپت خارجی ، دستور فعال سازی تایمر رو هم اضافه کنی میتونی در حین ست کردن پارامترها اگه 10ثانیه شد، وارد سابروتین وقفه تایمر بشی ولی مطمئن نیستم که جواب بده. تازه لازمه یه شرطی هم بذاری که وقتی از داخل سابروتین اینتراپت خارجی به سابروتین وقفه تایمر رفت و پارامترها رو اندازه گرفت دوباره برگردد به سابروتین اینتراپت خارجی. :sad: :sad:

      به نظر من بهترین کار برای حل شدن مشکل صرف نظر کردن از استفاده از وقفه خارجیه. همونطور توی حلقه اصلی برنامه شرطی بذار که اگر یه پین مشخصی(مثلا همون پین int0) یک شد، برنامهآ‌ی setting انجام بشه. در این حالت که توی حلقه اصلی برنامه داری setting رو انجام می دی اگه کارت طول بکشه و بیش از 10ثانیه بشه خیلی راحت و سریع بدون مشکلی برنامه وارد وقفه تایمر شده و پارامترها را اندازه گیری می کنه و برمیگرده به خطی که در قسمت Setting بوده و ادامه میده. :agree: :rolleyes: :read: :redface:
      ممنون از راهنماییت
      منم اول همین کار رو کرده بودم یعنی توی حلقه ی اصلی شرط گذاشته بودم اما چون برنامه طولانیه دیر به دیر میاد کلید رو چک میکنه که این مشکل باعث شد بخوام از وقفه خارجی استفاده کنم

      دیدگاه


        #4
        پاسخ : استفاده از دو وقفه همزمان

        منم چنین مشکلی داشتم ولی حلقه اصلی رو اگر کوتاه تر کنی و همچنین فرکانس کاری رو خیلی بالا بذاری در عمل مشکلی پیش نمیآید . پروتیئوس در مقایسه با واقعیت خیلی کند و آهسته برنامه ها رو نشون میده حتی کمتر از 2MHz.
        به يادت ميآ‌مانم و ميآ‌دانم که ميآ‌آيي--- تو تنها يادگار مانده از قوم اهورائي-

        دیدگاه


          #5
          پاسخ : استفاده از دو وقفه همزمان

          نوشته اصلی توسط Masoud0711
          سلام
          توی یک پروژه من لازمه که که هر 10 ثانیه توسط تایمر یک وقفه ایجاد بشه و یک سری از پارامترها رو اندازه گیری بکنه
          و پایه ی int0 رو هم اگه فشار بدیم برنامه باید بره به setting
          حالا کمکی که من از دوستان میخوام اینه که اگه کاربر کلیدی که به int0 وصله رو فشار بده و توی برنامه وقفه ایجاد بشه حالا اگه ست کردن تنظیمات توسط کاربر طول بکشه با توجه به این که دیگه وقفه تایمر تاثیری نداره چجوری باید هر 10 ثانیه پارامترها رو چک کنه
          البته بگم چون برنامم طولانیه نمیتونم برای settiung از if استفاده کنم
          وقتی میکرو وارد روتین یکی از وقفه ها میشه بیت فعال ساز وقفه سراسری رو اتوماتیک صفر میکنه و در نتیجه در حین انجام روتین یک وقفه اگر درخواست وقفه توسط منبع دیگه ای هم بشه تا پایان روتین جاری توجهی بهش نمیشه و هنگام خروج از روتین جاری باز اتوماتیک بیت فعال ساز وقفه سراسری رو یک میکنه و وقفه ای که در حین اجرای وقفه قبل اتفاق افتاده اعمال میشه.
          شما میتونید با دستور #asm("sei&quot بیت فعال ساز وقفه سراسری رو یک کنید. در این صورت وقتی وقفه جدید در داخل وقفه جاری اتفاق بیافته میکرو میره سروقت اجرای وقفه جدید و وقتی کارش تموم شد بر میگرده و وقفه جاری رو ادامه میده.
          افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

          دیدگاه


            #6
            پاسخ : استفاده از دو وقفه همزمان

            سلام.

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

            دیدگاه


              #7
              پاسخ : استفاده از دو وقفه همزمان

              نوشته اصلی توسط abolfazl_moradpour
              وقتی میکرو وارد روتین یکی از وقفه ها میشه بیت فعال ساز وقفه سراسری رو اتوماتیک صفر میکنه و در نتیجه در حین انجام روتین یک وقفه اگر درخواست وقفه توسط منبع دیگه ای هم بشه تا پایان روتین جاری توجهی بهش نمیشه و هنگام خروج از روتین جاری باز اتوماتیک بیت فعال ساز وقفه سراسری رو یک میکنه و وقفه ای که در حین اجرای وقفه قبل اتفاق افتاده اعمال میشه.
              شما میتونید با دستور #asm("sei&quot بیت فعال ساز وقفه سراسری رو یک کنید. در این صورت وقتی وقفه جدید در داخل وقفه جاری اتفاق بیافته میکرو میره سروقت اجرای وقفه جدید و وقتی کارش تموم شد بر میگرده و وقفه جاری رو ادامه میده.
              آقا ابوالفضل یعنی تو روتین وقفه دستی بیت فعالساز رو فعال کنم؟اینجوری دوباره برمیگرده توی وقفه ای که بود؟

              دیدگاه


                #8
                پاسخ : استفاده از دو وقفه همزمان

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

                یک راه حل که به نظر من رسید اینه که توی هر کدوم از وقفه ها که می دونید توی اجرای اون وقفه ، وقفه دیگه رخ میده بیاید و flag اینتراپت اون یکی وقفه را چک کنید. تا اونجایی که بنده اطلاع دارم هر اینتراپتی که زده میشه flag اینتراپتش فعال میشه یعنی یک میشه. پس اگه flag وقفه ای را که ممکنه در حین وقفه دیگه اجرا بشه توی وقفه چک کنیم و همون علیات وقفه دیگه را انجام بدیم مشکلی پیش نمیاد.
                یعنی بیام با دستور if چکش کنم؟ امکان پذیر هست وضعیت flag ها رو بخونیم عایااا؟

                دیدگاه


                  #9
                  پاسخ : استفاده از دو وقفه همزمان

                  نوشته اصلی توسط Masoud0711
                  آقا ابوالفضل یعنی تو روتین وقفه دستی بیت فعالساز رو فعال کنم؟اینجوری دوباره برمیگرده توی وقفه ای که بود؟
                  بله
                  بهش وقفه در وقفه می گن
                  فقط هر بار که وقفه ای اتفاق میافته اطلاعات پردازش فعلی(مقادیر برخی متغییر ها) در استک ذخیره میشه. اگر تعداد وقفه های تو در تو زیاد بشه ممکنه با stack overflow مواجه بشید.هرچند به نظرم بهتره برنامه رو طوری باز نویسی کنید که نیاز به این کارها نباشه. بهتره به جای استفاده از اینتراپت خارجی اون پایه رو تو روتین main مرتب بخونید و هر وقت فشار داده شد برید تو برنامه تنظیمات و این جوری یکی از وقفه ها رو کم کنید.
                  افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

                  دیدگاه


                    #10
                    پاسخ : استفاده از دو وقفه همزمان

                    نوشته اصلی توسط abolfazl_moradpour
                    بله
                    بهش وقفه در وقفه می گن
                    فقط هر بار که وقفه ای اتفاق میافته اطلاعات پردازش فعلی(مقادیر برخی متغییر ها) در استک ذخیره میشه. اگر تعداد وقفه های تو در تو زیاد بشه ممکنه با stack overflow مواجه بشید.هرچند به نظرم بهتره برنامه رو طوری باز نویسی کنید که نیاز به این کارها نباشه. بهتره به جای استفاده از اینتراپت خارجی اون پایه رو تو روتین main مرتب بخونید و هر وقت فشار داده شد برید تو برنامه تنظیمات و این جوری یکی از وقفه ها رو کم کنید.
                    منم اولش توی برنامه مرتب میخوندمش ولی تو پروتئوس که بستم خیلی بد کار میکرد حالا عملی ایشالا میبندم ببینم چی میشه

                    دیدگاه

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