اطلاعیه

Collapse
No announcement yet.

در مورد وقفه فوری کمک کنید لطفا

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

    در مورد وقفه فوری کمک کنید لطفا

    سلام.من از سه وقفه خارجی و یه وقفه داخل که همون تایمره (برای کلاک دادن به آی سی دیگه )استفاده کردم .میخوام وقتی یه وقفه خرجی اتفاق بیفته اون دوتا دیگه از کار بیفتن ولی داخلیه به کارش ادامه بده.برای همین نمیشه کلا وقفه رو غیر فعال کنم .شما چی پیشنهاد میکنی؟
    با استفاده از دستورای زیرم خاصم غیر فعال کنم نشد.علتش چیه؟
    GICR|=0x00;
    MCUCR=0x00;
    MCUCSR=0x00;
    avr atmega 16 استفاده کردم.

    #2
    پاسخ : در مورد وقفه فوری کمک کنید لطفا

    برای اینکار بهتره روتین وقفه ها رو تا میتونی کوچیک در نظر بگیری و در ابتدای روتین هم وقفه های خارجی رو غیر فعال کنی و در انتها فعال کنی

    من اکثرا به شیوه زیر عمل میکنم:

    روتین وقفه
    {

    Interrupt = 1;
    }


    main();
    {
    while(1);
    {
    اگر Interrupt یک است
    برو به زیر برنامه();
    }

    }


    زیر برنامه :
    {
    خاموش کردن اینتراپت های خارجی
    // External Interrupt(s) initialization
    // INT0: OFF
    // INT1: OFF
    // INT2: OFF
    GICR|=0x00;
    MCUCR=0x00;
    MCUCSR=0x00;
    GIFR=0x00;

    کارهای دلخواه


    روشن کردن اینتراپت های خارجی
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: On
    // INT1 Mode: Falling Edge
    // INT2: On
    // INT2 Mode: Falling Edge
    GICR|=0xE0;
    MCUCR=0x0A;
    MCUCSR=0x00;
    GIFR=0xE0;

    صفر کردن رجیستر
    Interrupt = 0;

    }

    دیدگاه


      #3
      پاسخ : در مورد وقفه فوری کمک کنید لطفا

      همیشه یادت باشه داخل روتین وقفه ، وقفه ها رو خاموش نکن

      حتی تابعی هم صدا نزن

      فقط یه متغیر رو یک کن و تو روال عادی برنامه اگه اون متغیر یک بود برو تو یه زیر برنامه و اونجا کاراتو انجام بده

      آخر اون زیر برنامه هم اون متغیر رو مجددا صفر کن تا منتظر وقفه جدید بمونه

      تا میتونی روتین وقفه رو کوتاه بگیر

      دیدگاه

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