اطلاعیه

Collapse
No announcement yet.

نحوه بکار بردن وقفه های تودر تو چگونه است؟

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

    نحوه بکار بردن وقفه های تودر تو چگونه است؟

    سلام..
    در اموزش های اقای کی نژاد یکسری سورس های اماده کدویژن هست و بنده برای برنامه ای از این سورس ها استفاده کردم(AVR_Counter0) .البته با تغییر و پروژه کار نمیکرد..خیلی دنبال ایراد کار گشتم تا تصمیم گرفتم خود سورس اصلی رو پروگرم کنم اما باز هم کار نمیکرد..حدود 4 ساعت کد ها رو عوض کردم و تغییر دادم حتی میکرو و سگمنت ها رو عوض کردم اما هیچ عکس العملی از میکرو دیده نمیشد..
    اخرش فهمیدم حذف کردن دستور اسمبلی
    کد:
    #asm ("sei");
    در داخل وقفه تایمر 0 باعث شد برنامه بدرستی کار کنه..
    حالا هم میخواستم ببینم من چه تنظیمی رو برای میکرو انجام ندادم؟
    و اینکه بکار بردن وقفه های تو در تو چطوری هست و بکار بردن دستور بالا چطوری صحیح هست؟
    درضمن من از میکرو mega16a استفاده کردم و فرکانس 8 ...
    این کد برنامه اصلی هست:
    کد:
    #include <mega32.h>
    #include <delay.h>
    #define nokey_code 12
    
    // 7 segment codes
    flash unsigned char display_codes[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
    
    //keyboard codes
    flash unsigned char keyboard_codes[]={0x76,0x6E,0x5E,0x3E,0x75,0x6D,0x5D,0x3D,0x73,0x6B,0x5B,0x3B};
    
    volatile unsigned char digits[]={0,0,0,0,0,0},leds=0; // initial values for display ( ------ )
    volatile unsigned char key_code=nokey_code;
    volatile unsigned long counter=0;
    
    void main()
    {
     unsigned char i;
     unsigned long counter_copy;
     DDRC=(1<<DDC7)|(1<<DDC6)|(1<<DDC5)|(1<<DDC4)|(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
     PORTA=(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4)|(1<<PORTA3)|(1<<PORTA2)|(1<<PORTA1)|(1<<PORTA0);
     DDRA=(1<<DDA6)|(1<<DDA5)|(1<<DDA4)|(1<<DDA3)|(1<<DDA2)|(1<<DDA1)|(1<<DDA0);
    
     //initialize external interrupt
     PORTD=(1<<PORTD2);
     MCUCR=(1<<ISC01);
     GICR=(1<<INT0);
     //initialize timer
     OCR0=124;
     TCCR0=(1<<WGM01)|(1<< CS01)|(1<<CS00);
     TIMSK=(1<<OCIE0);
     #asm("sei");
    
     while(1)
     {
     if (key_code!=nokey_code)
     {
      leds=1; // Turn on LED if any key pressed
      counter=0; // Reset counter
     }
     else leds=0;
    
     counter_copy=counter;
     for (i=0;i<6;i++)
     {
      digits[i]=counter_copy%10;
      counter_copy/=10;
     }
     }
    }
    
    //------------------------------------------------------------------------------------------------------------------
    
    interrupt [EXT_INT0] void external_INT0_isr(void)
    {
     if(++counter==1000000)counter=0;
    }
    //------------------------------------------------------------------------------------------------------------------
    
    interrupt [TIM0_COMP] void timer0_compare_isr(void)
    {
     static unsigned char select=0;
     static unsigned char x20=0;
     unsigned char temp , i;
     #asm("sei");
     // Turn off all 7segments and LEDs
     PORTA|=(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4)|(1<<PORTA3)|(1<<PORTA2)|(1<<PORTA1)|(1<<PORTA0);
     if (select)PORTC =display_codes[digits[select-1]];
     else PORTC=leds;
     PORTA &=~(1<<select);
     if(++select==7)select=0;
     if (++x20==20)
     {
     x20=0;
     DDRB=(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
     PORTB=(1<<PORTB6)|(1<<PORTB5)|(1<<PORTB4)|(1<<PORTB3);
     delay_us(5); // delay for signal stablization
     temp=(PINB & 0X78);
     DDRB=(1<<DDB6)|(1<<DDB5)|(1<<DDB4)|(1<<DDB3);
     PORTB=(1<<PORTB2)|(1<<PORTB1)|(1<<PORTB0);
     delay_us(5); // delay for signal stablization
     temp |=(PINB & 0X07);
     for(i=0;i<12;i++)
     {
      if(temp==keyboard_codes[i])
      {
      key_code=i;
      break;
      }
      else key_code=nokey_code;
     }
     }
    }
لطفا صبر کنید...
X