اطلاعیه

Collapse
No announcement yet.

چطوری بصورت نرم افزاری اینتراپت خارجی رو فعال کنم??

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

    چطوری بصورت نرم افزاری اینتراپت خارجی رو فعال کنم??

    با سلام
    من میخوام با نوشتن کد اینتراپت خارجی رو فعال کنم،برای مثال من با دستور اسمبلی به ادرس اینتراپت خارجی صفر رفتم و البته دستورات داخل اینتراپت اجرا شد ولی متاسفانه بعد از اجرای دستورات میکرو به ادامه برنامه برنمیگرده و از ادامه اینتراپت شروع میکنه به اجرای دستورات(یه جورایی مثه ریست شدن میمونه چون از تابع main شروع به اجرای دستورات میکنه).
    البته باید بگم که در انتهای اینتراپت از دستور RETI استفاده میکنم ولی بازم تاثیری نداره.
    دوستان لطفا راهنمایی بفرمایید،سپاسگذارم

    #2
    پاسخ : چطوری بصورت نرم افزاری اینتراپت خارجی رو فعال کنم??

    نوشته اصلی توسط saeiddiod نمایش پست ها
    با سلام
    من میخوام با نوشتن کد اینتراپت خارجی رو فعال کنم،برای مثال من با دستور اسمبلی به ادرس اینتراپت خارجی صفر رفتم و البته دستورات داخل اینتراپت اجرا شد ولی متاسفانه بعد از اجرای دستورات میکرو به ادامه برنامه برنمیگرده و از ادامه اینتراپت شروع میکنه به اجرای دستورات(یه جورایی مثه ریست شدن میمونه چون از تابع main شروع به اجرای دستورات میکنه).
    البته باید بگم که در انتهای اینتراپت از دستور RETI استفاده میکنم ولی بازم تاثیری نداره.
    دوستان لطفا راهنمایی بفرمایید،سپاسگذارم
    با سلام و درود.
    دستور اسمبلی RETI ادرس برگشت رو از stack بر میداره و داخل PC قرار میده.
    اگر وقفه خارجی اتفاق بیافته خود میکرو به طور اتوماتیک ادرس برگشت رو داخل stact قرار میده و هنگامی که روتین وقفه به اتمام رسید با دستور اسمبلی RETI ادرس رو از stack برمیداره تا بتونه به ادامه برنامه برگردد اما از اونجایی که برای کار شما وقفه خارجی رخ نداده و میخواهید به روتین وقفه برید باید حتما ادرس برگشت (مقدار فعلی PC) را در stack ذخیره کنید و سپس به ادرس روتین وقفه پرش کنید.
    توجه کنید که :
    در صورتی که از ترکیب زبان C و اسمبلی استفاده میکنید دقت کنید stack توسط زبان C مورد استفاده قرار میگیرد.

    PC همیشه به دستور بعدی اشاره میکند.

    موفق باشید.

    دیدگاه


      #3
      پاسخ : چطوری بصورت نرم افزاری اینتراپت خارجی رو فعال کنم??

      سپاس فراوان بخاطر پاسختون،تو اسمبلی stack رو مقدار دهی اولیه میکردم ولی تو C اینکارو نکردم،برم یه ازمایش بکنم ببینم نتیجه چی میشه،دستت درد نکنه بابت راهنماییت

      دیدگاه


        #4
        پاسخ : چطوری بصورت نرم افزاری اینتراپت خارجی رو فعال کنم??

        نوشته اصلی توسط saeiddiod نمایش پست ها
        سپاس فراوان بخاطر پاسختون،تو اسمبلی stack رو مقدار دهی اولیه میکردم ولی تو C اینکارو نکردم،برم یه ازمایش بکنم ببینم نتیجه چی میشه،دستت درد نکنه بابت راهنماییت
        کامپایلر های زبان C به طور اتوماتیک stack رو مقدار دهی اولیه میکنن. یعنی به هنگام شروع به کار پردازنده مقدار اولیه stack صفر هست بنابر این اگر در زبان اسمبلی روتینی بنویسید که با دستور call یا icall (درست یادم نیست همین دستور بود یا نه منظورم فراخوانی فوری هست ولی به احتمال زیاد همین دستور بود.) که در پایان روتین با دستور RET بخواهید به ادامه برنامه برگردید چون مقدار stack درست نشده به مشکل برمیخورید (همین طور به هنگام استفاده از وقفه) پس بهتر است در ابتدای برنامه کد زیر رو بنویسید
        LDI R16 , LOW(RAMEND(
        OUT SPL ,R16
        LDI R16 , HIGH(RAMEND(
        OUT SPH , R16
        نکته بالا فقط برای زمانی است که کلا اسمبلی مینویسد. و اگر از C استفاده میکنید نیازی به این کار نیست.

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

        و سوال دیگه اینکه مگر برای راه اندازی وقفه به صورت نرم افزاری (جوری که شما سوال پرسیدین این جور برداشت میشه که امکان راه اندازی به صورت سخت افزاری هست) راه دیگه ای هست؟؟؟؟
        اگر منظور سوال رو درست متوجه شدم که هیچی و موارد بالا درست هستند و اگر درست متوجه نشدم سوال رو بیشتر توضیح بدید و تشریح کنید.
        با تشکر.
        موفق و پیروز باشید.
        جدیدترین ویرایش توسط saati.sms; ۱۱:۲۵ ۱۳۹۸/۰۶/۱۰.

        دیدگاه

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