اطلاعیه

Collapse
No announcement yet.

مشکل در استفاده همزمان از دو وقفه خارجی

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

    مشکل در استفاده همزمان از دو وقفه خارجی

    با سلام
    من از دو وقفه خارجی به صورت همزمان استفاده کردم که درعمل فقط ایتراپت صفر جواب میده اما تو پرتئوس هر دو جواب میده :eek:
    اولش با کریستال 8 مگ کار میکردم جواب نمیداد گفتم شاید کم میاره و cpu زمان کافی برای انجام دستورات نداره اما 16 مگ هم گذاشتم جواب نداد که نداد
    پیش فرض با Atmel Studio کار میکنم اما ویژن رو هم گذاشتم.
    (این فقط یک برنامه دمو هستش )
    سورس
    http://uplod.ir/4kb7cfruuj33/New_folder_(4).rar.htm

    http://www.uplooder.net/cgi-bin/dl.c...4b2d6c87730505
    با تشکر

    کد:
    #include <mega8.h>
    #include <alcd.h>
    #include <delay.h>
    #include <stdio.h>
    int i=0,j=0;
    char str1[20],str2[20];
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    i=i+1;
    }
    
    // External Interrupt 1 service routine
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    j=j+1;
    
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    GICR|=0xC0;
    MCUCR=0x00;
    GIFR=0xC0;
    
    lcd_init(16);
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {
       delay_ms(1000);
        sprintf(str1,"%d",i);
       lcd_gotoxy(0,0);
       lcd_puts(str1);
       sprintf(str2,"%d",j);
       lcd_gotoxy(5,0);
       lcd_puts(str2);
       i=0;
       j=0;
    
       }
    }

    GCC:
    کد:
    #ifndef F_CPU
    	#define F_CPU 16000000UL
    #endif
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "myutils.h"
    #include "lcd.h" 
    int i=0,j=0;
    ISR(INT0_vect,ISR_BLOCK)
    {
    	i=i+1;
    }
    ISR(INT1_vect,ISR_BLOCK)
    {
    	j=j+1;
    }
    int main(void)
    {
    GICR=0xC0;
    MCUCR=0x00;
    GIFR=0xC0;
    sei();	
    	InitLCD(LS_ULINE);
    	LCDClear();
      while(1)
      {
    		_delay_ms(1000);
        LCDWriteIntXY(0,0,i,2)
    	  LCDWriteIntXY(5,0,j,2)
    	  i=0;
    	  j=0;
      }
    }
    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

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

    بیا بالا :bye
    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

    دیدگاه


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

      توی چند تا پروژه همزمان از دو وقفه خارجی استفاده کردم این مشکل رو نداشت احتمالا به خاطر اینه که توی while بین دو تا دستور sprintf یه delay نذاشتی.اگر نشد احتمالا سر پایه int1 دکمه ای که گذاشتی کار نمیکنه.

      دیدگاه


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

        سلام
        به اینتراپت ها فن وصله
        چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

        دیدگاه


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

          فن دقیقا چه جوری عمل میکنه؟توی چه حالتی پایه اینتراپت خارجی رو تغییر میده؟

          دیدگاه


            #6
            پاسخ : مشکل در استفاده همزمان از دو وقفه خارجی

            با توجه به کدی که قرار دادم
            اینتراپت حساس به سطح صفر هستش
            و فن خروجی دیجیتال داره (0 و 1)
            با تشکر
            چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

            دیدگاه


              #7
              پاسخ : مشکل در استفاده همزمان از دو وقفه خارجی

              نوشته اصلی توسط صادق ابراهیمی

              کد:
              #include <mega8.h>
              #include <alcd.h>
              #include <delay.h>
              #include <stdio.h>
              int i=0,j=0;
              char str1[20],str2[20];
              // External Interrupt 0 service routine
              interrupt [EXT_INT0] void ext_int0_isr(void)
              {
              i=i+1;
              }
              
              // External Interrupt 1 service routine
              interrupt [EXT_INT1] void ext_int1_isr(void)
              {
              j=j+1;
              
              }
              
              // Declare your global variables here
              
              void main(void)
              {
              
              GICR|=0xC0;
              MCUCR=0x00;
              GIFR=0xC0;
              
              lcd_init(16);
              
              // Global enable interrupts
              #asm("sei")
              
              while (1)
                 {
                 delay_ms(1000);
                  sprintf(str1,"%d",i);
                 lcd_gotoxy(0,0);
                 lcd_puts(str1);
                 sprintf(str2,"%d",j);
                 lcd_gotoxy(5,0);
                 lcd_puts(str2);
                 i=0;
                 j=0;
              
                 }
              }
              سلام
              من برنامتو خط به خط چک کردم، ولی فایلتو نگرفتم
              نمیدونم خروجی که تو lcd میاد چیه! ولی اینطور که تو برنامت نوشتی باید همیشه 0 نشون بده و برا یه لحظه 1 بشه آره؟؟
              اگه اینطوریه دلیلش او دوتا خط آخر هست که i و j رو صفر کردی!!!!!
              اون دوتا خط رو پاک کن چون هر بار که برنامه اجرا بشه متغیرات صفر میشن!

              دیدگاه


                #8
                پاسخ : مشکل در استفاده همزمان از دو وقفه خارجی

                قبل از اون دوتا خطی که متغیرات رو صفر میکنی یه delay بذار تا فرصت کنی رو یه lcd ببینی چی میاد.

                دیدگاه


                  #9
                  پاسخ : مشکل در استفاده همزمان از دو وقفه خارجی

                  با تشکر از دوستان
                  مشکلم حل شد
                  اون دوتا که داره صفر میشه دلیل داره وجزئی از برنامه هست
                  چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                  دیدگاه


                    #10
                    پاسخ : مشکل در استفاده همزمان از دو وقفه خارجی

                    حالا مشکل کجای کار بود؟

                    دیدگاه


                      #11
                      پاسخ : مشکل در استفاده همزمان از دو وقفه خارجی

                      کد:
                      MCUCR=0x0A;
                      چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                      دیدگاه

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