اطلاعیه

Collapse
No announcement yet.

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

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

    #16
    پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

    نوشته اصلی توسط m52r65
    من اگر میخواستم تا آخر حلقه صبر کنم که مشکلی پیش نمیومد . هر حلقه من ممکنه 20 یا 30 ثانیه طول بکشه.ولی من طبق صحبت های پیشین باید اون حلقه رو force close کنم
    بستگی به دستوراتی که تو اون تابع دارین هم می شه.
    اگه فقط تو یه حلقه گیر کرده و در حال چرخیدن هست شدنی است و منتظر فرمان یا اطلاعات از خارج میکرو نباشد.
    باید نمونه کد را بگذارید تا براتون قرار بدم.
    دوست عزیز اگه مفید بود روی تشکر بزن

    دیدگاه


      #17
      پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

      نوشته اصلی توسط m52r65
      من دقیقا متوجه منظورتون نشدم.
      اگر لطف کنید و همین مطلب رو به صورت کد بیان کنید ممنون میشم
      int count=0;
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Place your code here
      count++;
      if(count==4) count=0;
      }

      while (1)
      {
      // Place your code here
      while(count==1){
      // do work 1
      }
      while(count==2){
      // do work 2
      }
      while(count==3){
      // do work 3
      }
      while(count==4){
      // do work 4
      }
      }
      التماس دعا

      دیدگاه


        #18
        پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

        نوشته اصلی توسط ali.ra
        int count=0;
        interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        // Place your code here
        count++;
        if(count==4) count=0;
        }

        while (1)
        {
        // Place your code here
        while(count==1){
        // do work 1
        }
        while(count==2){
        // do work 2
        }
        while(count==3){
        // do work 3
        }
        while(count==4){
        // do work 4
        }
        }
        ممنون از جواب خوبتون
        فرض کنید متغیر count تو مقدار سه هستش و طبق برنامه شما داره کار 3 رو انجام میده و فرض کنیم که کار 3 مثلا چشمک زدن یک ال ای دی به تعداد 30 بار با فرکانس 1 هرتز هستش ،پس حداقل کار 3 مقدار سی ثانیه رو میطلبه.
        تو همین حین که مثلا در دفعه 12 م هستش وقفه ی صفر رخ میده و طبق برنامه شما مقدار count یکی زیاد میشه و میشه 4 و از داخل روتین وقفه میاد بیرون.
        خب میکرو پس از این از آدرس استک پوش شده آدرس ادامه رو پاپ میکنه یعنی تا زمانی که 18 بار دیگه چشمک نزنه که کار 4 رو انجام نمیده.
        در صورتی که من میخواستم به صورت فورس اون کار قبلی رو تعطیل کنه وبره کار جدید.
        برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

        دیدگاه


          #19
          پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

          نوشته اصلی توسط artison
          من راهی که به نظرم می رسه (که شاید اصولی نباشه) هر وقت دیتا روی پورت سریال آمد ، وضعیتی که قرار بعد از دریافت سریال انجام بشه (مثلا رفتن به مود 2 برنامه ) توی یک متغیر eeprom ذخیره بشه و بعدش میکرو ریست بشه (ریست شدن میتونه با فعال کردن تایمر watchdog بعد از دریافت سریال انجام بشه ) در ابتدای main هم watchdog غیر فعال بشه
          ممنونم.
          پیشنهاد خوبیه.
          امتحانش میکنم.
          برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

          دیدگاه


            #20
            پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

            نوشته اصلی توسط m52r65
            ممنون از جواب خوبتون
            فرض کنید متغیر count تو مقدار سه هستش و طبق برنامه شما داره کار 3 رو انجام میده و فرض کنیم که کار 3 مثلا چشمک زدن یک ال ای دی به تعداد 30 بار با فرکانس 1 هرتز هستش ،پس حداقل کار 3 مقدار سی ثانیه رو میطلبه.
            تو همین حین که مثلا در دفعه 12 م هستش وقفه ی صفر رخ میده و طبق برنامه شما مقدار count یکی زیاد میشه و میشه 4 و از داخل روتین وقفه میاد بیرون.
            خب میکرو پس از این از آدرس استک پوش شده آدرس ادامه رو پاپ میکنه یعنی تا زمانی که 18 بار دیگه چشمک نزنه که کار 4 رو انجام نمیده.
            در صورتی که من میخواستم به صورت فورس اون کار قبلی رو تعطیل کنه وبره کار جدید.
            اگه اسمبلی بلدید می شه خط فرمان رو عوض کرد ...
            ولی چیزی که شما نیاز دارین یک سیستم عامل هستش ولی توصیه که من دارم اینه که داخل این while ها لوپ نسازید مثلا قراره led چشمک بزنه
            int j=0;
            while(i==3 && j<20){
            PORTB.0=1;
            delay_ms(100);
            PORTB.0=0;
            j++;
            }
            التماس دعا

            دیدگاه


              #21
              پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

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

              دیدگاه


                #22
                پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                نوشته اصلی توسط saeiddiod
                اگه فقط از یک حلقه استفاده کنی و delay تو اجرای دستورات نداشته باشی میتونی گستردگی برنامه رو بالا ببری.
                میتونی شرط خروج از حلقه رو داخل اینتراپت بنویسی تا بعد از خارج شدن از اینتراپت طبق شرطی که گذاشتی به حلقه مورد نظر بری
                دوستمون نمی خواد که آخر حلقه بره بیرون- می خواد بدون تامل و بصورت فورس- سریع - شتابان بره بیرون.(یاد به کجا چنین شتابان افتادم) :icon_razz:
                دوست عزیز اگه مفید بود روی تشکر بزن

                دیدگاه


                  #23
                  پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                  نوشته اصلی توسط saeiddiod
                  اگه فقط از یک حلقه استفاده کنی و delay تو اجرای دستورات نداشته باشی میتونی گستردگی برنامه رو بالا ببری.
                  میتونی شرط خروج از حلقه رو داخل اینتراپت بنویسی تا بعد از خارج شدن از اینتراپت طبق شرطی که گذاشتی به حلقه مورد نظر بری
                  ممنون میشه یه کم واضح تر ویا با کد بگید.... دقیقا متوجه نمیشم
                  برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

                  دیدگاه

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