NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3507 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 2 از 2

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

  1. #1
    تازه وارد
    تاریخ عضویت
    Sep 2014
    نوشته ها
    4
    تشکر
    7
    تشکر شده 0 بار در 0 پست

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

    سلام.
    برای محاسبه فرکانس سیگنال متصل به میکرو من از وقفه خارجی صفر و وقفه تایمر صفر استفاده کردم و توی قسمت وقفه ان یه شمارش گر گذاشتم که هنگامی که لبه بالارونده سیگنال خارجی رخ داد یکی بشمارد و برای قطع برنامه هنگامی که این شمارش گر برابر با 2 شد وقفه عمومی را قطع کند.
    توی برنامه این شمارشگر برای یه سری از فرکانس ها چند تا از اعداد را نمی شمارد مثلا بعد از 1 میره 4 و یا اینکه پرشی می شمارد مثلا 1، 14، 28 و ....
    چرا این اتفاق رخ می دهد و چه طور میشه رفعش کرد؟
    کد:
    #define xtal 8000000#include <mega16.h>
    #include <delay.h>
    #include <stdio.h>
    #include <lcd.h> 
    unsigned long int counter=0;
    unsigned long int end=0;
    
    
    int off=0;
    #asm
    .equ __lcd_port = 0x1b;
    #endasm   //connect LCD to IC 
    interrupt [EXT_INT0] void external_signal_starting(void)
    {
        TCCR0=0x02;
       // MCUCR=0b00001000; 
        //GICR=0b10000000; 
        PORTB.1^=1;     end=end+1;  
     
    }
    interrupt [TIM0_OVF] void count(void)
    {
        TCNT0=0b10011100; 
        counter=counter+1;
        PORTB.0^=1;
        
    }
    interrupt [EXT_INT1] void external_signal_ending(void) 
    {
        
        //MCUCR=0b00000011; 
        //GICR=0b01000000;
        PORTB.1^=1;
        //off=off+1;   
     
    }
    
    
    
    
    
    
    
    
    void main()
    {
        char buffer[15];
        MCUCR=0b00001011;
        GICR=0b11000000; 
        TCCR0=0x00;
        TCNT0=0b10011100; 
        DDRA=0xff;
        DDRD=0x00;
        DDRB=0xff;
        //PORTB=0xFF;
        TIMSK=0x01; 
        #asm("sei");
        while(1)
        {       
          //  if (off==2)  { GICR=0x00;  TCCR0=0x00;}
            
            if (end=2) #asm("cli");
            
            lcd_gotoxy(0,0);
            sprintf(buffer,"NUMBER %2d",end); 
            lcd_init(16);
            lcd_clear();
            lcd_gotoxy(0,1);
            lcd_puts (buffer);
            
        }
    }
    ویرایش توسط patmatp : 16-09-2014 در ساعت 20:13

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    تازه وارد
    تاریخ عضویت
    Sep 2014
    نوشته ها
    4
    تشکر
    7
    تشکر شده 0 بار در 0 پست

    پیش فرض

    به جای end=end+1; از end++ استفاده کردم مشکل حل شد

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •