اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام دوستان من برنامه زیر رو بر روی میکرو ریختم این برنامه قراره تعداد پالس هایی که به پایه وقفه صفر میاد و محاسبه کنه و هرچند ثانیه اونو نمایش بده اما یک مشکل اینه که برنامه ای که در زیر برنامه وقفه تایمر ریخته شده وابستگی مستقیم با اینتراپت وقفه خارجی داره و تا وقفه خارجی فعال نشه وارد زیر برنامه وقفه تایمر نمیشه دلیلش چیه؟!!!!! :eek: :eek: :eek:
    کد:
    
    
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    dor++;
    }
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // Timer1 overflow interrupt service routine
    
    
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    
    lcd_putsf("loading");
    delay_ms(1000);
    lcd_clear();
     adc0=read_adc(0);
     adc0=adc0/2; 
    
    sprintf(lcd,"r=%u , t=%u",dor,adc0);
    lcd_puts(lcd);
     delay_ms(1000);
     lcd_clear();
     kd=read_adc(3);
     ki=read_adc(2);
     kp=read_adc(1);
     sprintf(lcd,"%u,%u,%u",kd,ki,kp);
     lcd_puts(lcd);
     delay_ms(1000);
         lcd_clear();
     eror=adc0-20;
    if (adc0<25)
    {
    
    OCR1AL=0;
    }
    if(adc0>25)
    {
     uu=eror*20;
    OCR1AL=uu;
     }   
    
     dor=0;
    }
    
    
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A 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 
    PORTA=0x00;
    DDRA=0x00;
    
    // 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 
    PORTB=0x00;
    DDRB=0x00;
    
    // Port C 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 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=0 State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x20;
    
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 3.906 kHz
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x04;
    TCNT0=0x00;
    OCR0=0x00;
    
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 3.906 kHz
    // Mode: Fast PWM top=0x00FF
    // OC1A output: Non-Inv.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: On
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x81;
    TCCR1B=0x0C;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Low level
    // INT1: Off
    // INT2: Off
    GICR|=0x40;
    MCUCR=0x00;
    MCUCSR=0x00;
    GIFR=0x40;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x04;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 4800
    UCSRA=0x00;
    UCSRB=0x18;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x0C;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: AREF pin
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x83;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTB Bit 0
    // RD - PORTB Bit 2
    // EN - PORTB Bit 3
    // D4 - PORTB Bit 4
    // D5 - PORTB Bit 5
    // D6 - PORTB Bit 6
    // D7 - PORTB Bit 7
    // Characters/line: 8
    lcd_init(8);
    TIMSK=0x01;
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {
      
    
       }
    }

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

    شما اولویت وقفه ها رو رعایت نکرده اید، وقفه ها بر اساس اولویت آنها که در دیتا شیت هم در قسمت "Interrupt Vectors" بیان شده، کار می کنند.
    به صورت کلی چون وقفه خارجی INT0 همیشه در حال تحریک شدنه، نمیزاره که برنامه بره توی وقفه تایمر.
    شما با توجه به جدول اولویت وقفه ها از وقفه خارجی INT2 استفاده کن، درست میشه.
    فقط یه نکته دیگه، وقتی رفتی توی وقفه تایمر، وقفه خارجی رو غیر فعال کن و آخر تابع وقفه تایمر، دوباره فعالش کن.

    دیدگاه


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

      با سلام

      دوست عزیز خطوط نوشته شده در وقفه تایمر کاملا اشتباهه. منظورم از اشتباه این نیست که کار نمی کنه یا خطا میده خیر بلکه منظروم اینه نوشتن اون همه کد و گذاشتن تاخیر به اون سنگینی در روال وقفه ها و علل خصوص تایمر کاملا غلطه. فکر نمی کنم نیازی باشه تابع نمایش توی وقه تایمر باشه.

      موفق باشید
      چرا ناراحتی پاتریک!
      + امروز ی بچه دیدم سرچهارراه گل میفروخت
      - از دیدنش ناراحت شدی؟
      + نه
      پس چی ناراحتت کرده
      + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
      ------------------------------------------------------------------------------------------------------
      تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
      ------------------------------------------------------------------------------------------------------
      محصولات

      دیدگاه


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

        نوشته اصلی توسط webyou
        شما اولویت وقفه ها رو رعایت نکرده اید، وقفه ها بر اساس اولویت آنها که در دیتا شیت هم در قسمت "Interrupt Vectors" بیان شده، کار می کنند.
        به صورت کلی چون وقفه خارجی INT0 همیشه در حال تحریک شدنه، نمیزاره که برنامه بره توی وقفه تایمر.
        شما با توجه به جدول اولویت وقفه ها از وقفه خارجی INT2 استفاده کن، درست میشه.
        فقط یه نکته دیگه، وقتی رفتی توی وقفه تایمر، وقفه خارجی رو غیر فعال کن و آخر تابع وقفه تایمر، دوباره فعالش کن.
        وقفه خارجی از وقفه تایمر جدا مگه نیست؟
        وقفه خارجی اگر تحریک نشه باید وارد وقفه تایمر بشه درست میگم؟
        ولی با وجود اینکه اصلا وقفه خارجی تحریک نمیشه ولی وارد برنامه وقفه تایمر هم نمیشه به الویت وقفه ها ربط داره؟
        منظورتون از این جمله چیه؟
        به صورت کلی چون وقفه خارجی INT0 همیشه در حال تحریک شدنه، نمیزاره که برنامه بره توی وقفه تایمر.
        میشه بیشتر توضیح بدید؟
        چون وقفه خارجی و من تحریک نمیکنم
        خود میکرو منظورتون اینه تحریکش میکنه؟

        دیدگاه


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

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

          دوست عزیز خطوط نوشته شده در وقفه تایمر کاملا اشتباهه. منظورم از اشتباه این نیست که کار نمی کنه یا خطا میده خیر بلکه منظروم اینه نوشتن اون همه کد و گذاشتن تاخیر به اون سنگینی در روال وقفه ها و علل خصوص تایمر کاملا غلطه. فکر نمی کنم نیازی باشه تابع نمایش توی وقه تایمر باشه.

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

          دیدگاه


            #6
            پاسخ : مشکل عجیب در وقفه خارجی

            با سلام
            دستوراتی که روتین تایمر استفاده کردید خیلی سنگینه و اصلا نباید نمایش lcd و delay توروتین وقفه باشه دستورات lcd را در حلقه اصلی بنویسید و با چک کردن فلگها مقادیر را نمایش بدید

            دیدگاه


              #7
              پاسخ : مشکل عجیب در وقفه خارجی

              نوشته اصلی توسط زوار
              با سلام
              دستوراتی که روتین تایمر استفاده کردید خیلی سنگینه و اصلا نباید نمایش lcd و delay توروتین وقفه باشه دستورات lcd را در حلقه اصلی بنویسید و با چک کردن فلگها مقادیر را نمایش بدید
              اگه وقفه خارجی رو کلا حذف کنم به راحتی نشون میده.اما به محض اینکه اینتراپت وقفه خارجی صفر فعال باشه نشون نمیده،من قبول دارم برنامه وقفه سنگینه اما مشکلم اینه برنامه رو هم سبک کردم ولی مشکل داره هنوز.سوالم اینه وقفه خارجی به وقفه تایمر چرا مربوطه؟

              دیدگاه


                #8
                پاسخ : پاسخ : مشکل عجیب در وقفه خارجی

                نوشته اصلی توسط masror_d
                وقفه خارجی از وقفه تایمر جدا مگه نیست؟
                وقفه خارجی اگر تحریک نشه باید وارد وقفه تایمر بشه درست میگم؟
                ولی با وجود اینکه اصلا وقفه خارجی تحریک نمیشه ولی وارد برنامه وقفه تایمر هم نمیشه به الویت وقفه ها ربط داره؟
                منظورتون از این جمله چیه؟
                به صورت کلی چون وقفه خارجی INT0 همیشه در حال تحریک شدنه، نمیزاره که برنامه بره توی وقفه تایمر.
                میشه بیشتر توضیح بدید؟
                چون وقفه خارجی و من تحریک نمیکنم
                خود میکرو منظورتون اینه تحریکش میکنه؟
                وقفه ها از هم جدا هستن، ولی برای اجرا شدنشون، اولویت هست.
                بله اگه وقفه خارجی تحریک نشه باید وارد وقفه تایمر بشه.
                برنامه ای که نوشتید، مگه پالس رو نمیشماره؟خوب چون همیشه وقفه صفر داره تحریک میشه، نمیره توی وقفه تایمر.
                به صورت کلی ما چند نوع وقفه داریم، وقفه ریست، وقفه تایمر، وقفه خارجی و ...
                که اگه به جدول وقفه ها نگاه کنی، وقفه ریست از همه اولویت بالاتری داره، که یعنی هرکجا این وقفه اعمال شد بدون توجه به این که برنامه کجاست، میکرو ریست میشه.
                حالا فکر کن مثلا چند تا وقفه با هم اتفاق بی افتند، اگه اولویت نباشه به چه ترتیبی اجرا بشن؟!!!!؟!؟!؟!؟!؟!!!!(اصلا نمیشه نتیجه رو پیش بینی کرد)
                حالا فکر کن اگه یه جدول باشه که اگر وقفه ها با هم اتفاق افتادن، بر اساس اون به ترتیب کار کنن، چی میشه؟(دقیقا میشه نتیجه رو پیش بینی کرد)
                اما مشکل برنامه شما اینجا بوده که چون وقفه خارجی همیشه در حال تحریک شدنه(با توجه به توضیحی که خودتون دادید و گفتید که قراره پالس بشماره)،اولویت اجرای وقفه خارجی نمیزاره که برنامه بره توی وقفه تایمر.
                حالا شما یه کاری بکن، از وقفه شماره 2 برای خواندن تعداد پالس ها استفاده بکن و نتیجش رو بگو.

                دیدگاه


                  #9
                  پاسخ : مشکل عجیب در وقفه خارجی

                  من متن اول رو فقط جهت اطلاع خودتون نوشتم...

                  ببینید شما می بایست اول در حلقه وایل یک برنامه جهت نمایش تغییرات یک متغیر بنویسید. به این صورت که با هر بار اجرا شدن وقفه متغیر افزایش یا کاهش (یا تغییری که در نظر دارین) را دارد یا خیر.

                  برنامه رو باید مرحله مرحله تست کنید تا به ایراد کارتون پی ببرید. و بهتره همین کارو انجام بدین تا خودتون قضیه رو پیدا کنید...
                  چرا ناراحتی پاتریک!
                  + امروز ی بچه دیدم سرچهارراه گل میفروخت
                  - از دیدنش ناراحت شدی؟
                  + نه
                  پس چی ناراحتت کرده
                  + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                  ------------------------------------------------------------------------------------------------------
                  تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                  ------------------------------------------------------------------------------------------------------
                  محصولات

                  دیدگاه


                    #10
                    پاسخ : پاسخ : مشکل عجیب در وقفه خارجی

                    نوشته اصلی توسط masror_d
                    اگه وقفه خارجی رو کلا حذف کنم به راحتی نشون میده.اما به محض اینکه اینتراپت وقفه خارجی صفر فعال باشه نشون نمیده،من قبول دارم برنامه وقفه سنگینه اما مشکلم اینه برنامه رو هم سبک کردم ولی مشکل داره هنوز.سوالم اینه وقفه خارجی به وقفه تایمر چرا مربوطه؟
                    پالسی که به وقفه خارجی میاد فرکانسش چقدره

                    دیدگاه


                      #11
                      پاسخ : پاسخ : مشکل عجیب در وقفه خارجی

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

                      دیدگاه


                        #12
                        پاسخ : پاسخ : مشکل عجیب در وقفه خارجی

                        نوشته اصلی توسط masror_d
                        خیلی کنده.میشه گفت که دست خودمه هنوز وقفه رو فعال نکردم سیستم هم فعال نیست یک وقفه میاد سیستم فعال میشه
                        INT0 Mode: Low level
                        تو برنامه اتون را اگر کامنت درست باشه وقفه حساس به سطحه، وقفه را حساس به لبه تغییر بدید ببینید درست میشه

                        دیدگاه


                          #13
                          پاسخ : پاسخ : مشکل عجیب در وقفه خارجی

                          نوشته اصلی توسط زوار
                          INT0 Mode: Low level
                          تو برنامه اتون را اگر کامنت درست باشه وقفه حساس به سطحه، وقفه را حساس به لبه تغییر بدید ببینید درست میشه
                          کلا هیچی دیگه تو صفحه نمیاد

                          دیدگاه


                            #14
                            پاسخ : مشکل عجیب در وقفه خارجی

                            پول اپ و پول داون رو رعایت کردین ؟

                            برادر سایت پر از اموزش و مساله بهتره یکی از اونا رو بخونید و نظری بهشون داشته باشین.
                            شخصا وقت این رو ندارم کل کد رو نگاه کنم و ببینم چیکار کردین و غیره...
                            بهتره قبل از اینکه اینجا منتظر جواب من و سایر دوستان باشین خودتون دست به کار شین و به شیوه های مختلف مدار رو تست کنید...
                            چرا ناراحتی پاتریک!
                            + امروز ی بچه دیدم سرچهارراه گل میفروخت
                            - از دیدنش ناراحت شدی؟
                            + نه
                            پس چی ناراحتت کرده
                            + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                            ------------------------------------------------------------------------------------------------------
                            تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                            ------------------------------------------------------------------------------------------------------
                            محصولات

                            دیدگاه

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