اطلاعیه

Collapse
No announcement yet.

غیر فعال نشدن وقفه خارجی صفر در طول برنامه (مشکل عجیب)

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

    غیر فعال نشدن وقفه خارجی صفر در طول برنامه (مشکل عجیب)

    سلام
    برنامه ای دارم که دارای 3 وقفه فعال هست با میکروکنترلر ATmega8A
    2 وقفه خارجی و 1 وقفه سرریز تایمر
    در حالت عادی کلیت برنامه و وقفه ها به خوبی کار میکنن و اگر نخوام وسواس به خرج بدم برنامه تموم شده حسابه ولی ...
    بهتره در بخشی از برنامه وقفه 0 غیر فعال باشه تا دستگاه بهتر کار کنه
    اما مشکل کجاست؟؟؟
    من وقتی وقفه خاری 1 رو هر جای برنامه غیر فعال و یا فعال کنم به خوبی عمل میکنه و این برای وقفه سرریز تایمر هم صدق میکنه
    اما این رویه برای وقفه شماره 0 اصلا کار نمیکنه
    یعنی اگر اول برنامه و تو تابع main فعال کردم دیگه تا ابد کار میکنه و هر چی دستور GICR |=(0<<INT0): بنویسم هیچی به هیچی
    نمیشه وقفه ها رو کلی غیر فعال کرد به هی عنوان
    فقط موندم چرا این وقفه غیر فعال نمیشه اصلا
    میتونم با کد نویسی و گذاشتن یه متغر فلگ دستورات تابعش رو اجرا کنم یا نکنم اما همینکه وقفه اتفاق میوفته بده
    ممکنه از میکروکنترلر باشه؟؟؟؟

    #2
    پاسخ : غیر فعال نشدن وقفه خارجی صفر در طول برنامه (مشکل عجیب)

    نوشته اصلی توسط saeid_k68 نمایش پست ها
    سلام
    برنامه ای دارم که دارای 3 وقفه فعال هست با میکروکنترلر ATmega8A
    2 وقفه خارجی و 1 وقفه سرریز تایمر
    در حالت عادی کلیت برنامه و وقفه ها به خوبی کار میکنن و اگر نخوام وسواس به خرج بدم برنامه تموم شده حسابه ولی ...
    بهتره در بخشی از برنامه وقفه 0 غیر فعال باشه تا دستگاه بهتر کار کنه
    اما مشکل کجاست؟؟؟
    من وقتی وقفه خاری 1 رو هر جای برنامه غیر فعال و یا فعال کنم به خوبی عمل میکنه و این برای وقفه سرریز تایمر هم صدق میکنه
    اما این رویه برای وقفه شماره 0 اصلا کار نمیکنه
    یعنی اگر اول برنامه و تو تابع main فعال کردم دیگه تا ابد کار میکنه و هر چی دستور GICR |=(0<<INT0): بنویسم هیچی به هیچی
    نمیشه وقفه ها رو کلی غیر فعال کرد به هی عنوان
    فقط موندم چرا این وقفه غیر فعال نمیشه اصلا
    میتونم با کد نویسی و گذاشتن یه متغر فلگ دستورات تابعش رو اجرا کنم یا نکنم اما همینکه وقفه اتفاق میوفته بده
    ممکنه از میکروکنترلر باشه؟؟؟؟
    سلام.
    برای صفر کردن بیت INT0 از رجیستر GICR بایداون عبارت رو and کنید نه or!
    توی کانال یوتیوب من قراراه طراحی انواع بردهای الکترونیکی مثل بردهای تک لایه، دو لایه یا به طور کلی بردهای چند لایه، بردهای مبتنی بر میکروکنترلر، بردهای صنعتی، بردهای الکترونیک قدرت و بردهای فرکانس بالارو یاد بگیریم.
    همینطور کدنویسی انواع میکروکنترلرهای 8 بینی مثل میکروکنترلرهای خانواده AVR-STM8، میکروکنترلرهای میبتی بر معماری ARM مثل STM32 و پردازنده های مخصوص اینترنت اشیاء مثل ESP32-ESP8266 و DSPها یاد میگیریم.
    https://www.youtube.com/@aKaReZa75​

    دیدگاه


      #3
      پاسخ : غیر فعال نشدن وقفه خارجی صفر در طول برنامه (مشکل عجیب)

      نوشته اصلی توسط saeid_k68 نمایش پست ها
      سلام
      برنامه ای دارم که دارای 3 وقفه فعال هست با میکروکنترلر ATmega8A
      2 وقفه خارجی و 1 وقفه سرریز تایمر
      در حالت عادی کلیت برنامه و وقفه ها به خوبی کار میکنن و اگر نخوام وسواس به خرج بدم برنامه تموم شده حسابه ولی ...
      بهتره در بخشی از برنامه وقفه 0 غیر فعال باشه تا دستگاه بهتر کار کنه
      اما مشکل کجاست؟؟؟
      من وقتی وقفه خاری 1 رو هر جای برنامه غیر فعال و یا فعال کنم به خوبی عمل میکنه و این برای وقفه سرریز تایمر هم صدق میکنه
      اما این رویه برای وقفه شماره 0 اصلا کار نمیکنه
      یعنی اگر اول برنامه و تو تابع main فعال کردم دیگه تا ابد کار میکنه و هر چی دستور GICR |=(0<<INT0): بنویسم هیچی به هیچی
      نمیشه وقفه ها رو کلی غیر فعال کرد به هی عنوان
      فقط موندم چرا این وقفه غیر فعال نمیشه اصلا
      میتونم با کد نویسی و گذاشتن یه متغر فلگ دستورات تابعش رو اجرا کنم یا نکنم اما همینکه وقفه اتفاق میوفته بده
      ممکنه از میکروکنترلر باشه؟؟؟؟
      سلام
      همونطوری که جناب akaReza گفتن باید به این شکل یک بیت رو صفر کنید:

      GICR &= ~(1<<INT0);

      دیدگاه


        #4
        پاسخ : غیر فعال نشدن وقفه خارجی صفر در طول برنامه (مشکل عجیب)

        نوشته اصلی توسط akaReza نمایش پست ها
        سلام.
        برای صفر کردن بیت INT0 از رجیستر GICR بایداون عبارت رو and کنید نه or!
        بابت راهنمایی هر دو عزیز بسیار ممنونم
        اما سوال دید اینکه اگر دستور صحیح اینه که قطعا هست چرا من با دستور اشتباهم وقفه 1 رو میتونم غیر فعال کنم در طول برنامه؟

        دلیل: ادغام دو پست برای جلوگیری از اسپم

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        همونطوری که جناب akaReza گفتن باید به این شکل یک بیت رو صفر کنید:

        GICR &= ~(1<<INT0);
        از شما هم ممنونم

        دیدگاه


          #5
          پاسخ : غیر فعال نشدن وقفه خارجی صفر در طول برنامه (مشکل عجیب)

          نوشته اصلی توسط saeid_k68 نمایش پست ها
          بابت راهنمایی هر دو عزیز بسیار ممنونم
          اما سوال دید اینکه اگر دستور صحیح اینه که قطعا هست چرا من با دستور اشتباهم وقفه 1 رو میتونم غیر فعال کنم در طول برنامه؟

          دلیل: ادغام دو پست برای جلوگیری از اسپم



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

          دیدگاه

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