اطلاعیه

Collapse
No announcement yet.

آیا میتوان در حین اجرای یک وقفه خارجی، وقفه دیگری را فعال نمود ؟؟!

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

    آیا میتوان در حین اجرای یک وقفه خارجی، وقفه دیگری را فعال نمود ؟؟!

    با سلام
    در برنامه من وقتی وقفه خارجی int0 فعال است و سابروتین وقفه درحال انجام است در این هنگام نمیتوان با فعال کردن int1 سابروتین وقفه دیگری را فعال نمود وباید صبر کرد که سابروتین وقفه به طور کامل اجرا شود .. آیا در میکرو 8051 نمیشه در حین اجرای یک وقفه ،یک وقفه دیگر را اجرا کرد ؟چطور میتونم این کار را بکنم؟ یعنی وقتی int1 را فعال میکنم وقفه قبلی را رها کرده و وقفه جدید را اجرا کند؟ ( زبان اسمبلی )
    لطفا کمکم کنید .. با تشکر

    #2
    پاسخ : آیا میتوان در حین اجرای یک وقفه خارجی، وقفه دیگری را فعال نمود ؟؟!

    سلام دوست عزیز . به انجمن خوش اومدی
    در 8051 با استفاده از ثبات IP برای وقفه ها دو سطح اولویت میشه تعریف کرد: اولویت بالا و پایین
    فقط وقفه های با اولویت پایین میتونن توسط وقفه های الویت بالا متوقف بشن. وقفه های هم درجه هم نمیتونن همدیگر رو متوقف کنن.
    حالا اگر برای شما یکی از وقفه ها از دیگری مهمتره میتونین با یک کردن بیت مربوطش تو ثبات IP به اون اولویت بدین.
    اما اگه میخواین هر دو سابروتین وقفه بتونن توسط هم متوقف بشن باید یه ترفندی بزنید:
    ببینید وقتی CPU میره توی سابروتین یه وقفه، در واقع وقفه های هم درجه و پایین تر غیر فعال میشن.
    کاری که شما باید بکنید اینه که بعد از وارد شدن به سابروتین وقفه یه بار دستور RETI رو CALL کنید. مثال:

    ;**********************************
    EX0ISR: LCALL DUMMY
    ...
    Do something
    ...
    RET
    DUMMY: RETI
    ;**********************************
    EX1ISR: LCALL DUMMY
    ...
    Do something
    ...
    RET
    ;**********************************
    فقط فراموش نکنید برای خروج از وقفه به جای RETI از RET استفاده کنید.

    دیدگاه


      #3
      پاسخ : آیا میتوان در حین اجرای یک وقفه خارجی، وقفه دیگری را فعال نمود ؟؟!

      از توضیحاتتون ممنونم . ترفندتان را بکار بردم اما آن نتیجه ای که عنوان کردید رو نتونستم ببینم ! یعنی پس از اجرای وقفه صفر بدون اینکه منتظر وقفه دیگری بماند به طور خودکار سابروتین وقفه بعدی را اجرا میکند ! ( صفر بعدی ) . برنامه ای که تحت عنوان ترفند نوشتید چطور کار میکنه؟ با اجرای وقفه دستور reti را صدا میزند و به قسمت برنامه اصلی میرود ( $ SJMP ) و منتظر وقفه بعدی میماند ؟

      دیدگاه


        #4
        پاسخ : آیا میتوان در حین اجرای یک وقفه خارجی، وقفه دیگری را فعال نمود ؟؟!

        بازم سلام
        ترفندی که من نوشتم چیز خاصی نیست.فقط وقتی LCALL DUMMY رو اجرا میکنید cpu یه بار میره به DUMMY و دوباره برمیگرده همونجا.
        تنها فایدش اینه که دستور RETI یه بار اجرا میشه و cpu فکر میکنه که سابروتین وقفه تموم شده و به همین دلیل به وقفه های دیگه اجازه اجرا میده.(به sjmp $ هم ربطی نداره oo
        من خودم امتحان کردم جواب میده
        شما اگر مایلید کدی که نوشتید رو بزارید و کاری که باید انجام بده رو بنویسید تا من و دوستان یه نگاهی بندازیم.

        دیدگاه

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