اطلاعیه

Collapse
No announcement yet.

مشکل در وقفه خارجی صفر

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

    مشکل در وقفه خارجی صفر

    سلام بر همگی
    من برنامه ای نوشتم که وقتی وقفه خارجی صفر اتفاق میفته، یک led رو یک ثانیه روشن و یک ثانیه خاموش کنه. ولی تو پروتئوس که تست کردم کار نمیکنه. میتونین راهنماییم کنین که مشکل برنامه من چیه؟
    کد:
    #include <mega32.h>
    #include <delay.h>
    
    void main(){
    
    DDRB=0xFF;
    PORTB=0x00;
    
    GICR|=0x40;
    MCUCR=0x03;
    MCUCSR=0x00;
    GICR=40;
    #asm("sei")
    
    while(1);
    }
    
    interrupt [2] void ext_int0(void)
    {
    #asm("cli");
    PORTB=0x01;
    delay_ms(1000);
    PORTB=0x00;
    delay_ms(1000);
    #asm("sei");
    }
    برای ایجاد لبه بالارونده روی پایه INT0 ، یه مقاومت pull down گذاشتم و یک کلید که بین Vcc و پایه INT0 قرار داره. وقتی کلید رو فشار میدم هیچ اتفاقی نمیفته. ممنون میشم اگه راهنماییم کنین.

    #2
    پاسخ : مشکل در وقفه خارجی صفر

    با سلام اینا تست کن
    کد:
    [left]
    
    #include <mega32.h>
    #include <delay.h>
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    // Place your code here
    {
    #asm("cli");
    PORTB=0x01;
    delay_ms(1000);
    PORTB=0x00;
    delay_ms(1000);
    #asm("sei");
    }
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    DDRB=0xFF;
    PORTB=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    // INT2: Off
    GICR|=0x40;
    MCUCR=0x02;
    MCUCSR=0x00;
    GIFR=0x40;
    
    ACSR=0x80;
    SFIOR=0x00;
    
    #asm("sei")
    
    while (1)
       {
       // Place your code here
    
       };
    }
    
    
    [/left]

    دیدگاه


      #3
      پاسخ : مشکل در وقفه خارجی صفر

      نوشته اصلی توسط زوار
      با سلام اینا تست کن
      کد:
      [left]
      
      #include <mega32.h>
      #include <delay.h>
      // External Interrupt 0 service routine
      interrupt [EXT_INT0] void ext_int0_isr(void)
      {
      // Place your code here
      {
      #asm("cli");
      PORTB=0x01;
      delay_ms(1000);
      PORTB=0x00;
      delay_ms(1000);
      #asm("sei");
      }
      }
      
      // Declare your global variables here
      
      void main(void)
      {
      
      // Port B initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
      DDRB=0xFF;
      PORTB=0x00;
      
      // External Interrupt(s) initialization
      // INT0: On
      // INT0 Mode: Falling Edge
      // INT1: Off
      // INT2: Off
      GICR|=0x40;
      MCUCR=0x02;
      MCUCSR=0x00;
      GIFR=0x40;
      
      ACSR=0x80;
      SFIOR=0x00;
      
      #asm("sei")
      
      while (1)
         {
         // Place your code here
      
         };
      }
      
      
      [/left]
      دوست عزیز از توجهت ممنونم. تست میکنم خبر میدم. فقط یه سوال، تفاوت این دو کد در دو دستور زیره:
      ACSR=0x80;
      SFIOR=0x00
      میتونین توضیح بدین اینا چی هستن؟

      بازم ممنونم

      دیدگاه


        #4
        پاسخ : مشکل در وقفه خارجی صفر

        کسی نیست راهنماییم کنه مشکل چیه؟ من فایل پروتئوس و برنامه ای که نوشتم رو میذارم اگه لطف کنین یه نگاهی بندازید که مشکل من چیه ممنون میشم.
        http://www.4shared.com/rar/8izRrB7H/Test.html
        اگه زود راهنماییم کنین ممنون میشم

        دیدگاه


          #5
          پاسخ : مشکل در وقفه خارجی صفر

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

          وقفه ی خارجی صفر که میخواین ازش استفاده کنید رو به صورت لبه ی نزولی (Falling Edge) را ه اندازی کنید و هم زمان اون پایه ای که قراره کلید بهش وصل بشه رو به صورت ورودی و مقاومت پول پش رو فعال کنید.

          با این کار شما تنها نیاز به این دارین که یه سر کلید رو به پایه ی وقفه وصل و سر دیگه ی کلید رو به زمین وصل کنید. و هیچ چیز اضافی دیگه ای نیاز نداره.

          کل برنامه ی پروژه ی شما به صورت زیر میشه:

          کد:
          #include <mega32.h>
          #include <delay.h>
          
          interrupt [EXT_INT0] void ext_int0_isr(void)
          {
           PORTB.0=1
           delay_ms(1000);
           PORTB.0=0
          }
          
          void main(void)
          {
          DDRB.0=1     
          
          // External Interrupt(s) initialization
          // INT0: On
          // INT0 Mode: Falling Edge
          // INT1: Off
          // INT2: Off
          GICR|=0x40;
          MCUCR=0x02;
          MCUCSR=0x00;
          GIFR=0x40;
          
          // Analog Comparator initialization
          // Analog Comparator: Off
          // Analog Comparator Input Capture by Timer/Counter 1: Off
          ACSR=0x80;
          #asm("sei")
          while (1)
             {
             }
          }

          دقت کن که فرکانس کلاک میکرو رو 8 مگا هرتز قرار دادم پس شما باید حتما در قسمت (Configure) کدویژن و همین طور در قسمت پروتئوس این فرکانس رو قرار بدی.

          اینم شکل پروتئوس:


          [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
          [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

          دیدگاه

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