اطلاعیه

Collapse
No announcement yet.

اینتراپت

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

    اینتراپت

    سلام دوستان تویه یه برنامه که با بسکام نوشتم نیازه که بین دو تا loop پرش انجام بشه به این صورت که با اینتراپت 0 و یک کلید از حلقه اول به دوم پرش کنم و با زدن مجدد به حلقه اول ولی میکرو هنگ میکنه
    فکر میکنم چون از دستور goto استفاده میکنم و return از اینتراپت هیچ وقت انجام نمیشه این مشکل پیش میاد
    کسی تا حالا این کار رو انجام داده ،لطفا راهنمایی کنید.
    عجب روزگاریست...! هیچکس به سکوت آدم نمیرسد،همه منتظرند به داد آدم برسند...!

    #2
    پاسخ : اینتراپت

    باسلام
    مدتهاست با بسکام کار نکردم و شکل دقیق دستورات حلقش الان یادم نیست
    ولی من کد لازم رو به زبان c براتون میذارم- خودتون تبدیلش کنید به بیسیک
    روشی که استفاده می کنید اشتباهه و اینتراپت حتما باید به انتها برسه
    [code=c]
    global k=0;
    int0
    {k=1-k;}

    int main() {
    //your code- part1
    while (1)
    {
    while(k)
    {//your code- part2}
    while(k==0)
    {//your code- part3}
    }[/code]
    توضیح کد: میاد دوتا حلقه که قراره انجام بشن رو در یک حلقه بینهایت قرار میده
    اون دوتا حلقه داخلی یک شرط متناقض دارن که همواره یکیش درسته و یک حلقه درحال اجراست
    و با آمدن اینتراپت اون شرطه تاگل میشه و حلقه اجرایی عوض میشه
    موفق باشید

    دیدگاه


      #3
      پاسخ : اینتراپت

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

      دیدگاه


        #4
        پاسخ : اینتراپت

        حق با شماست- اینطوری نمیشه
        یک چیزی به ذهنم میرسه ولی شاید صحیح نباشه و عمل نکنه
        اینکه بیبینیم دستور reti چیکار میکنه و خودمون اون کار رو نرم افزاری انجام بدیم
        تاجایی که میدونم در مورد avr، وقتی اینتراپت میاد بیت i رو صفر میکنه و آدرس فعلی رو در stack میریزه و سراغ بردار اینتراپت میره و بعد پرش و اجرا
        و هنگام رسیدن به reti بیت i رو یک میکنه و آدرس جایی که بود رو از stack برمیداره میریزه تو pc
        حالا اگر بخواد از اینتراپت جایی بپره- قبل از دستور goto label و در isr
        ابتدا بیت i رو ست کنه تا بازهم اینتراپت اجرا بشه
        و سپس دوبار دستور pop اجرا بشه تا استک پوینتر دوتا کم بشه و استک پر نشه ولی از مقادیر خوانده شده که حاوی آدرس برگشته استفاده نکنه- چون آدرس برگشت جای دیگست
        و بعد بپره
        شاید این روش صحیح نباشه و جواب نده اما تستش ضرر نداره

        شاید امکان اضافه کردن شرط در برخی دستورات داخل حلقه فراهم باشه تا هنگام برگشت از اینتراپت دیگه اجرا نشن و نیاز به دردسر های بالا نباشه
        شاید هم راه های بهتری باشه

        دیدگاه


          #5
          پاسخ : اینتراپت

          i که میفرمایید بیتی یا بایتیه و چهجوری باید یک کردش منطورم دستور برنامه هست و همینطور دستور pop
          عجب روزگاریست...! هیچکس به سکوت آدم نمیرسد،همه منتظرند به داد آدم برسند...!

          دیدگاه


            #6
            پاسخ : اینتراپت

            اسمبلی نوشتن در بسکام رو یاد ندارم
            بیت i بیت هفتم از رجیستر sreg است و برای ست و ریست کردنش دستور اسمبلی وجود داره (sei و cli)
            دستور pop هم اسمبلیه (مثلا pop R20)
            ببینید چطور میشه دستورات اسمبلی وارد بسکام کرد
            شاید هم بسکام برای این دستورات اسمبلی دستور خاصی در نظر گرفته باشه

            دیدگاه


              #7
              پاسخ : اینتراپت

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

              دیدگاه


                #8
                پاسخ : اینتراپت

                کد:
                $regfile = "m32def.dat"
                $crystal = 8000000
                
                CONFIG PORTB.0=OUTPUT
                
                Config Int0 = Rising
                Enable Interrupts
                Enable Int0
                On Int0 Q
                
                dim select_loop as Bit
                
                do
                  if select_loop=0 then portb.0=0
                  if select_loop=1 then portb.0=1
                loop
                
                end                  'end program
                
                  Q:
                   TOGGLE SELECT_LOOP
                  RETURN
                این شاید کارت رو راه بندازه
                من تو این برنامه ، توی زیرروال وقفه یه فلگ رو تغییر می دم با استفاده از این فلگ می تونم تو متن اصلی برنامه کاری رو که می خوام انجام بدم که اینجا TOGGLE کردن پورت B.0 هستش ولی شما می تونی به جاش از دستورات GOTO یا CALL و یا ... استفاده کنی
                لازم به ذکر هست این روشی که من پیشنهاد کردم درسته از وقفه استفاده شده ولی معایب روش POLLING یا اجرای برنامه به روش سرکشی رو داره :icon_razz:
                خداوند بی نهایت است اما به قدر نیاز تو فرود می آید ، به قدر آرزوی تو گسترده می شود و به قدر ایمان تو کارگشاست.
                [hr]

                دیدگاه


                  #9
                  پاسخ : پاسخ : اینتراپت

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

                  دیدگاه

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