اطلاعیه

Collapse
No announcement yet.

چطور اولویت وقفه ها رو تنظیم کنم؟

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

    چطور اولویت وقفه ها رو تنظیم کنم؟

    من با میکرو یه مدار بستم که هم از وقفه سرریز تایمر صفر استفاده کردم هم از وقفه خارجی صفر. برای من وقفه خارجی اهمیت بیشتری داره، در حالیکه میدونم وقفه تایمر بالاترین اولویت رو بین وقفه ها داره! حالا باید چیکار کنم؟چطوری میشه اولویت وقفه ها رو عوض کنم؟رجیسترش چیه؟ و باید چطوری باشه؟ :icon_razz:

    #2
    پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

    راستی یه زمانی یه جایی دیده بودم که با چند تا دستور اسمبلی که وسط برنامه سی(codevision) نوشته بودند، یه کاری تو این مایه ها کرده بودند:یعنی وقفه ها رو دستکاری کرده بودند،کسی چیزی در این مورد نمیدونه؟

    دیدگاه


      #3
      پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

      نوشته اصلی توسط uni_ahmadi
      در حالیکه میدونم وقفه تایمر بالاترین اولویت رو بین وقفه ها داره! :icon_razz:
      از کجا میدونی
      اولویت وقفه خارجی بالاتره
      در ثانی مگه چقدر زمان فرضا 500 نانو ثانیه برات مهمه
      یادت باشه وقفه ها در صورتی که با هم اتفاق بیفتن از بین نمیرن و به کار هردوشون رسیدگی میشه



      اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

      دیدگاه


        #4
        پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

        ای بابا! حتما یه چیزی میدونم که میگم دیگه!تو دیتا شیت مگا32 تو بخش تایمرها دیدم که وقفه تایمر بالاترین اولویتو داره! در ثانی خود وقفه که مهم نیست زمانش!زیر برنامه ای که توی وقفه تایمرم اجرا میشه 3ثانیه طول میکشه، من میخوام اگه این وسط وقفه خارجی فعال شد، میکرو، زیربرنامه وقفه تایمرو ول کنه و بره سراغ وقفه خارجی و زیر برنامه اون،بعدا برگرده سراغ تایمر ...

        دیدگاه


          #5
          پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

          یکی از اشکالات بزرگ AVR این است که اولویت وقفه های آن فقط از نوع Static است(بر خلاف 8051 و XMEGA که بیش از یک سطح اولویت در آنها قابل تعریف است). به این معنا که اگر دو یا چند وقفه بصورت همزمان درخواست شوند، وقفه ای که آدرس بردار آن (در حافظه Flash) کوچکتر باشد، دارای اولویت بالاتری خواهد بود و زودتر پذیرفته می شود. اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
          ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #6
            پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

            نوشته اصلی توسط طراح
            یکی از اشکالات بزرگ AVR این است که اولویت وقفه های آن فقط از نوع Static است(بر خلاف 8051 و XMEGA که بیش از یک سطح اولویت در آنها قابل تعریف است). به این معنا که اگر دو یا چند وقفه بصورت همزمان درخواست شوند، وقفه ای که آدرس بردار آن (در حافظه Flash) کوچکتر باشد، دارای اولویت بالاتری خواهد بود و زودتر پذیرفته می شود. اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
            ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.
            بله آقای طراح درست میفرمایند
            این چیزی که شما میخوای بهش میگم ماسک پذیری وقفه که متاسفانه توسط میکروی AVR پشتیبانی نمیشه
            راه کاری که بشه کار شما رو راه انداخت به این صورته
            شما زیر برنامه ای رو که قراره تو تایمر اجرا بشه رو بذار تو لوپ تابع main براش یه شرط بذار که مثلا وقتی فلان رجیستر مقدارش 1 بود بیاد و برنامه رو اجراکنه ، اون وقت تو تایمر بیا و مقدار اون متغییر رو یک کن
            اینجوری روتین وقته تایمر فقط چند پالس ساعت طول میکشه و لطمه ای به روتن دیگر وقفه ها نمیزنه
            کد:
            char flag=0;
            
            //timer int
            {
            flag = 1;
            }
            
            
            
            // main rotin
            {
            while(1){
            if(flag==1){
            flag = 0;
            .
            .
            .
            }
            }
            }

            دیدگاه


              #7
              پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

              نوشته اصلی توسط طراح
              یکی از اشکالات بزرگ AVR این است که اولویت وقفه های آن فقط از نوع Static است(بر خلاف 8051 و XMEGA که بیش از یک سطح اولویت در آنها قابل تعریف است). به این معنا که اگر دو یا چند وقفه بصورت همزمان درخواست شوند، وقفه ای که آدرس بردار آن (در حافظه Flash) کوچکتر باشد، دارای اولویت بالاتری خواهد بود و زودتر پذیرفته می شود. اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
              ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.

              فک کنم روال بدون اینکه برنامه اسمبلی هم دست کاری بشه باز هم اجرا بشه
              توی همین بخش چند تا مثال آوردم " به نام وقفه در وقفه "
              حتی اونجا با یک برنامه نشون دادم که اگه بجای 2 تا وقفه تعداد بیشتری وقفه اتفاق بیفته باز هم به کار همگی رسیدگی میشه و هیچ وقفه ای از بین میره

              به نظر من برنامه نویسی جناب یونی آندرلاین احمدی مشکل داره که تویزیر روال وقفه تاخیر 3 ثانیه ایجاد کرده وگرنه وقفه ها هیچ مشکلی نداره


              اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

              دیدگاه


                #8
                پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                در سوال جناب uni_ahmadi بحث بر سر از بین رفتن وقفه نیست، بلکه سوال بر سر اجرای روتین یک وقفه در وسط اجرای روتین وقفه دیگر است. بعد از پذیرش تقاضای یک وقفه توسط CPU و پرش به آدرسی که روتین وقفه در آن نوشته شده، Flag مجوز تمام وقفه ها که در رجیستر SREG قرار دارد و I نامیده می شود، تا پایان وقفه بصورت خودکار صفر می شود و بنابراین هیچ وقفه دیگری تا پایان اجرای روتین وقفه جاری پذیرفته نمی شود. بنابراین راه تغییر این وضعیت همان است که در پست قبل گفته شد.
                اما در مورد از بین نرفتن وقفه ها هم اشاره به این نکته لازم است که در برخی شرایط ممکن است وظیفه ای که به عهده یک وقفه است به دلیل نوع برنامه نویسی و عدم امکان پاسخگویی CPU به درستی انجام نشود و هرچند در این موقعیت، وقفه به اصطلاح از بین نمی رود، اما وظیفه خود را هم نمی تواند به درستی انجام بدهد. به عنوان مثال فرض کنید وقفه دریافت USART فعال شده باشد و بایتی دریافت شود که تقاضای وقفه ای را ایجاد کند. اگر پاسخ گویی به این تقاضای وقفه به دلیل درگیر بودن CPU در وقفه دیگر به حدی طول بکشد که اطلاعات جدیدی در بافر سریال نوشته شود، در این شرایط تقاضای وقفه به قوت خود باقی است، اما شرایط Overrun ایجاد می شود که به معنای از دست رفتن Data قبلی است. یا به عنوان مثال دیگر اگر لازم باشد به ازای هر بار سرریز (Overflow) یک تایمر عملی انجام شود، اما بعد از یکبار سرریز، تقاضای وقفه به حدی معطل شود که سرریز بعدی اتفاق بیافتد. در این شرایط تقاضای وقفه از بین نرفته است، اما وظیفه مورد نظر برنامه نویس برای وقفه هم به درستی انجام نشده است.
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


                  #9
                  پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                  آقای طراح ممنون از راهنماییتون!
                  دستور sei همه وقفه ها رو فعال میکنه، من در حال حاضر همین دو تا وقفه رو دارم اما به زودی به تعداد وقفه ها اضافه میشه، و یه این دلیل نمیتونم همه روبا همفعال یا غیر فعال کنم. یعنی الویت دهی میخوام :mrgreen:
                  آقای گاپه ممنون از راهنماییتون!
                  من حلقه اصلی برنامم قراره یه عالمه شولوغ پولوغ بشه، یه عالمه کار کنه میکروی بیچاره! حالا اگه من این تاخیر لعنتی رو ببرم تو حلقه اصلی که بقیه کارا علاف میشه!اونا رو چه کنم؟! :icon_razz:
                  یعنی هیچ راه دیگه ای وجود نداره!؟من صدسال پیش که اسمبلی خوندم به این نتیجه رسیدم که با اسمبلی میشه همه جای میکرو رو دستکاری کرد. من با کدویژن برنامه مینویسم و کلا اسمبلی از ذهنم پریده! واسه همین فکر میکنم اگه بلد بودم شاید میشد یه کلکی به میکرو بزنم! :icon_razz:
                  کلا چطوری میتونم دستورای اسمبلی که میشه وسط برنامه سی استفاده کرد و رجیسترها رو دستکاری کرد، گیر بیارم؟کسی ایده ایف نظری...داره آیا؟
                  ممنون

                  دیدگاه


                    #10
                    پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                    نوشته اصلی توسط uni_ahmadi
                    دستور sei همه وقفه ها رو فعال میکنه، من در حال حاضر همین دو تا وقفه رو دارم اما به زودی به تعداد وقفه ها اضافه میشه، و یه این دلیل نمیتونم همه روبا همفعال یا غیر فعال کنم. یعنی الویت دهی میخوام
                    در اینصورت می توانید در ابتدای روتین وقفه هایی که دارای اولویت پائین تر هستند و قبل از یک کردن بیت I، سایر وقفه های هم اولویت را از طریق رجیسترهایی که مجوز هر وقفه در آن تعریف می شود، غیر فعال کنید تا فقط اولویت بالاتر بتواند پذیرفته شود.در انتهای روتین هم می توانید وضعیت مجوز وقفه ها را به وضعیت اولیه باز گردانید.
                    اوژن: به معنای افکننده و شکست دهنده است
                    دانایی، توانایی است-Knowledge is POWER
                    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                    دیدگاه


                      #11
                      پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                      سلام جناب طراح و سایر دوستان
                      نوشته اصلی توسط طراح
                      اما اگر وقفه ای پذیرفته شد، به دلیل عدم امکان تعریف اولویت در AVR، سایر وقفه ها (صرف نظر از اولویت آنها) قادر به متوقف کردن این وقفه نخواهند بود و تا پایان اجرای آن باید منتظر بمانند. تنها راهی که می توان بر این اشکال غلبه کرد این است که در روتین وقفه پذیرفته شده، سایر وقفه ها را بصورت نرم افزاری Enable کرد. حتی می توان با تغییر رجیسترهای مجوز دهنده به وقفه های دیگر، فقط به بعضی از آنها اجازه متوقف کردن وقفه جاری را داد. در برنامه شما اگر فقط همین دو نوع وقفه وجود دارد، می توانید در روتین وقفه تایمر با اجرای دستور اسمبلی sei برای وقفه دیگر مجوز پذیرفته شدن را ایجاد کنید.
                      یعنی وقتی داره زیر برنامه وقفه ای اجرا میشه اگر همون وقفه دوباره بیاد هم تا پایان زیر برنامه ، زیر برنامه ی وقفه از ابتدا اجرا نمیشه؟

                      نوشته اصلی توسط طراح
                      ضمنا از نظر روش صحیح برنامه نویسی، نوشتن روتین وقفه تایمر که 3 ثانیه طول بکشد کار اصولی نیست و ساختار چنین برنامه ای نیاز به اصلاح دارد.
                      چه طوری می تونم متوجه شم که روتین وقفم چقد طول میکشه ؟
                      این قضیه خیلی برام حیاتیه !
                      آخه دارم با وقفه ی USART یه سری رشته رو دریافت میکنم که چیه ! (با صدا زدن چند تایع دیگه)
                      البته الان مشکلی نداره و به درستی کار میکنه(البته صد در صد اصولی نیست طبق صحبت دوستان تو جاهای مختلف :read
                      [بادریت : 9600 / کریستال:11.0592 / Atmega8A]
                      زمان تنها واحد حقیقی اندازه گیریه
                      زمان وجود ماده رو اثبات میکنه
                      بدون زمان هیچکدوم ما وجود نخواهیم داشت
                      زمان یکتاست

                      دیدگاه


                        #12
                        پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

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

                        دیدگاه


                          #13
                          پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                          نوشته اصلی توسط mojtaba_led
                          کامپایلر برنامه شما رو به هر زبونی که باشه اول به اسمبلی تبدیل میکنه ، معادل اسمبلی روتین وقفتون رو ببینید بعد با دونستن فرکانس کار میکرو و اینکه هر دستور در چند سیکل اجرا میشه میتونید زمان اجرای روتین وقفه رو حساب کنید البته در صورت لزوم میتونید روتین وقفه خودتون به اسمبلی بنویسید .
                          پس با این حساب در خد سوات من نیست
                          نمیشه با یه تخمین زیاد محاسبه کرد ؟ زمان دقیقش خیلی برام مهم نیست !
                          مثلا دستور مقایسه (if) یا مقدار دهی به یک متغیر در َAtmegaA چند سیکل طول میکشه ؟

                          آخه دارم با وقفه ی USART یه سری رشته رو دریافت میکنم که چیه ! (با صدا زدن چند تایع دیگه)
                          البته الان مشکلی نداره و به درستی کار میکنه(البته صد در صد اصولی نیست طبق صحبت دوستان تو جاهای مختلف :read
                          [بادریت : 9600 / کریستال:11.0592 / Atmega8A]
                          الان که داره درست کار میکنه امکان داره به مشکل بخوره؟
                          آحه زمان اجرای زیر برنامه همیشه ثبته دیگه ! پس اگه الن کار میکنه میشه مطمئن باشم که از نشر زمانی ایرتدی نداره؟
                          زمان تنها واحد حقیقی اندازه گیریه
                          زمان وجود ماده رو اثبات میکنه
                          بدون زمان هیچکدوم ما وجود نخواهیم داشت
                          زمان یکتاست

                          دیدگاه


                            #14
                            پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

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

                            الان که داره درست کار میکنه امکان داره به مشکل بخوره؟
                            آحه زمان اجرای زیر برنامه همیشه ثبته دیگه ! پس اگه الن کار میکنه میشه مطمئن باشم که از نشر زمانی ایرتدی نداره؟
                            اگه برنامه تون در عمل تحت شرایط مختلف درست کار میکنه پس مشکلی نباید باشه

                            دیدگاه


                              #15
                              پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                              نوشته اصلی توسط mojtaba_led
                              خوب ماکزیمم زمانی که میتونید به اجرای وقفه تون اختصاص بدید چقدره ؟
                              اگه بخوام بدترین شرایط رو در نظر بگیرم 500میلی ثانیه
                              دارم از USART دیتا میگیرم . هر وقت یه دیتای کامل(8بیتی) برسه میره به وقفه
                              Boudrate=9600 / Data bit=8 / Parity=None / Stop bit=1 / Flow control=None
                              یعنی تقریبا هر دیتای کامل که بخواد برسه و وقفه فعال بشه چقدر طول میکشه؟
                              زمان تنها واحد حقیقی اندازه گیریه
                              زمان وجود ماده رو اثبات میکنه
                              بدون زمان هیچکدوم ما وجود نخواهیم داشت
                              زمان یکتاست

                              دیدگاه

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