اطلاعیه

Collapse
No announcement yet.

مختل شدن حلقه بی نهایت

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

    مختل شدن حلقه بی نهایت

    پیشاپیش ممنون از بذل توجه و راهنماییتون

    سلام
    من یک کتابخانه کدلرن نوشتم که به درستی کار میکنه
    اما
    همونطور که در خطوط زیر میبینید در قسمتی از برنامه من تایمر روشن می کنم و در خط بعد تازمانی که متغییر مربوطه صفر باشه میکرو هیچ کاری انجام نمیده (در واقع تازمانی که دکمه ریموت فشار داده نشده)
    و بعد از این که دکمه ریموت فشار داده میشه شرط حلقه نقض میشه و خط سوم اجرا میشه یعنی تایمر خاموش میشه و بعدش سایر خطوط اجرا میشن
    ومشکل من اینجاست که نمیخوام حلقه بینهاینت مختل بشه و دنبال کدی هستم تا جایگزین این حلقه ی خط دوم کنم


    TCCR2=0x01;
    while (READ_REM==0);
    TCCR2=0x00;

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

    نوشته اصلی توسط eng4313 نمایش پست ها
    پیشاپیش ممنون از بذل توجه و راهنماییتون

    سلام
    من یک کتابخانه کدلرن نوشتم که به درستی کار میکنه
    اما
    همونطور که در خطوط زیر میبینید در قسمتی از برنامه من تایمر روشن می کنم و در خط بعد تازمانی که متغییر مربوطه صفر باشه میکرو هیچ کاری انجام نمیده (در واقع تازمانی که دکمه ریموت فشار داده نشده)
    و بعد از این که دکمه ریموت فشار داده میشه شرط حلقه نقض میشه و خط سوم اجرا میشه یعنی تایمر خاموش میشه و بعدش سایر خطوط اجرا میشن
    ومشکل من اینجاست که نمیخوام حلقه بینهاینت مختل بشه و دنبال کدی هستم تا جایگزین این حلقه ی خط دوم کنم


    TCCR2=0x01;
    while (READ_REM==0);
    TCCR2=0x00;
    سلام
    اگر باقی خطوط برنامه و این قسمت تداخلی با هم نداشته باشن و اجرا شدنشون بهم ربطی نداشته باشه، خیلی ساده میتونید while رو بردارید و یک if مناسب جایگزینش کنید.
    در کل همچین مواردی به نوع برنامه بستی داره و نمیشه خیلی دقیق با این اطلاعات کم براش راه حل ارائه کرد.

    دیدگاه


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

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      اگر باقی خطوط برنامه و این قسمت تداخلی با هم نداشته باشن و اجرا شدنشون بهم ربطی نداشته باشه، خیلی ساده میتونید while رو بردارید و یک if مناسب جایگزینش کنید.
      در کل همچین مواردی به نوع برنامه بستی داره و نمیشه خیلی دقیق با این اطلاعات کم براش راه حل ارائه کرد.
      ////////////////////////////////////////////////////////////////////////////

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

      void read (void)
      {
      TCCR2=0x00;
      READ_REM=0;
      RF_DH=0;
      RF_DL=0;
      RF_STR=0;
      TCNT2=0;
      TCCR2=0x01;
      while (READ_REM==0);
      TCCR2=0x00;
      }

      شما فرمودین که میشه بایک if مناسب جایگزینش کرد ولی چطوری ؟
      اگر ممکنه مثالی بزنید
      جدیدترین ویرایش توسط eng4313; ۱۶:۰۸ ۱۳۹۹/۰۵/۲۵.

      دیدگاه


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

        نوشته اصلی توسط eng4313 نمایش پست ها
        ////////////////////////////////////////////////////////////////////////////

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

        void read (void)
        {
        TCCR2=0x00;
        READ_REM=0;
        RF_DH=0;
        RF_DL=0;
        RF_STR=0;
        TCNT2=0;
        TCCR2=0x01;
        while (READ_REM==0);
        TCCR2=0x00;
        }

        شما فرمودین که میشه بایک if مناسب جایگزینش کرد ولی چطوری ؟
        اگر ممکنه مثالی بزنید
        خوب با این ساختاری که شما استفاده میکنید فکر نمیکنم راه حلی که من مد نظرمه شدنی باشه و باید ساختارتونو تغییر بدید. اگر اشتباه نکنم تایمر2 رو روشن میکنید و منتظر میمونید مقدار READ_REM توسط سرویس وقفه تغییر پیدا کنه و بعد دوباره تایمر رو خاموش میکنید. حتما لازمه این روشن و خاموش شدن تایمر انجام بشه؟ توی سرویس وقفه تایمر، چه عملیاتی انجام میشه؟

        ضمنا سعی کنید برای قرار دادن کد از تگ cpp یا تگ code استفاده کنید که کدها بهم ریخته نمایش داده نشن. تگ ها توی نوار بالایی ویرایشگر متن انجمن قرار گرفتن که میتونید استفاده کنید.

        دیدگاه


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

          سلام.
          چیزی که به ذهن من میرسه اینه که شما تایمر 0 رو مثلا توی زمان 1 میلی تنظیم کنید که هر 1 میلی ثانیه وقفه بده، کد ها داخل while اصلی رو توی روتین وقفه تایمر 0 کپی کنید یا برعکس، اون while دومی رو اونجا بزارین.
          توی کانال یوتیوب من قراراه طراحی انواع بردهای الکترونیکی مثل بردهای تک لایه، دو لایه یا به طور کلی بردهای چند لایه، بردهای مبتنی بر میکروکنترلر، بردهای صنعتی، بردهای الکترونیک قدرت و بردهای فرکانس بالارو یاد بگیریم.
          همینطور کدنویسی انواع میکروکنترلرهای 8 بینی مثل میکروکنترلرهای خانواده AVR-STM8، میکروکنترلرهای میبتی بر معماری ARM مثل STM32 و پردازنده های مخصوص اینترنت اشیاء مثل ESP32-ESP8266 و DSPها یاد میگیریم.
          https://www.youtube.com/@aKaReZa75​

          دیدگاه

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