اطلاعیه

Collapse
No announcement yet.

پرش از داخل اینتراپت به قسمت خاصی از برنامه

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

    پرش از داخل اینتراپت به قسمت خاصی از برنامه

    سلام.من توی برنامم واسه کلید امرجنسی مدار یک اینتراپت تعریف کردم که با اجرای اینتراپت تمام خروجی ها غیر فعال میشن تا از آسیب قطعات مکانیکی جلوگیری کنم.حالا میخوام وقتی کلید امرجنسی برداشته شد, اینتراپت به مکانی که از حافظه کد که از اونجا به اینتراپت پرش کرده , برنگرده و بره برنامه رو از اول اجرا کنه.یعنی در واقع میخوام توسط goto بپرم به اول برنامم.
    این کار امکان پذیر هست .اما عملا اتفاقی که میفته اینه که هربار که اینتراپت اجرا میشه رجیستر ها تو stack ذخیره میشن و وقتی بدون return از توی برنامم از دستور goto استفاده میکنم , بدون اینکه stack خالی بشه به یک قسمت دیگه از برنامم پرش میکنم . و این باعث میشه بعد از چند بار اجرای اینتراپت stck پر میشه و میکرو هنگ میکنه.
    حالا میخوام بدونم راه منطقی پرش از توی برنامه اینتراپت چیه؟
    ممنون. از بسکام استفاده میکنم.

    #2
    پاسخ : پرش از داخل اینتراپت به قسمت خاصی از برنامه

    سلام عزیز جان
    میتونی برنامه رو از چند تابع تشکیل بدی
    و هر بار از این تابع به اون یکی تابع پرش کنی فکر نکنم دیگه میکرو اینجوری هنگ کنه

    روش بدی نیست...

    دیدگاه


      #3
      پاسخ : پرش از داخل اینتراپت به قسمت خاصی از برنامه

      شاید روش زیر مفید باشه:
      توی روتین وقفه یه حلقه بی پایان بذارید و توی حلقه پین ورودی (پین وقفه) رو بخونید و هر وقت وضعیتش تغییر کرد Watchdog رو روشن کنید تا میکرو رو ریست کنه. البته در این صورت بعد از زدن کلید امرجنسی، فقط برنامه قسمت وقفه اجرا می شه.

      دیدگاه


        #4
        پاسخ : پرش از داخل اینتراپت به قسمت خاصی از برنامه

        من بیسیک بلد نیستم اما اگه یه جوری به آدرس صفر که همون بردار ریست هست پرش کنید (با دستورات اسمبلی) میکرو ریست میشه. الان دقیق یادم نیست استک پوینتر رو هم این کار ریست میکرد یا نه! به هر حال ریجستر SP رو دستی میتونید مقدار بدید. مقدارش بستگی به تنظیمات کامپایلر داره.(این قدر استک نرم افزاری و سخت افزاری و .... تعریف شده که نمیدونم کدومشون منظورش همین استک هست) حالت کلی باید به آخرین خونه رم اشاره کنه.
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


          #5
          پاسخ : پرش از داخل اینتراپت به قسمت خاصی از برنامه

          نوشته اصلی توسط aed
          شاید روش زیر مفید باشه:
          توی روتین وقفه یه حلقه بی پایان بذارید و توی حلقه پین ورودی (پین وقفه) رو بخونید و هر وقت وضعیتش تغییر کرد Watchdog رو روشن کنید تا میکرو رو ریست کنه. البته در این صورت بعد از زدن کلید امرجنسی، فقط برنامه قسمت وقفه اجرا می شه.
          خودمم دقیقا همین کارو کردم.ولی میخوام اینو بدونم که بدون ریست چجوری میشه اینکارو انجام داد.به هر حال حتما برنامه نویسا یه فکری هم برای این مورد کردن دیگه!
          واسه خود من که تا حالا 5-6 بار پیش اومده که نیاز به این کار داشتم واسه بقیه هم قطعا این مشکل وجود داشته دیگه!

          دیدگاه


            #6
            پاسخ : پرش از داخل اینتراپت به قسمت خاصی از برنامه

            در برنامه های بوت لودر بعد از اتمام پروگرم حافظه فلش؛ به آدرس ریست پرش بدون شرط انجام میشه
            این کد رو از بوت لودر سریال موجود تو نت برات میذارم

            #asm
            ldi r30,0x00
            ldi r31,0x00
            ijmp
            #endasm

            دیدگاه


              #7
              پاسخ : پرش از داخل اینتراپت به قسمت خاصی از برنامه

              معادل بسکام برنامه اسمبلی آقای ماجلان
              GOTO $H00
              بعد هم اگر از تنظیمات پاک شدن هنگام بوت میکرو فعال بوده باشه ، مثل این میمونه که تقریبا ریست کرده باشی
              هميشه به ياد خدا باش !

              دیدگاه

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