Presentation is loading. Please wait.

Presentation is loading. Please wait.

Interrupt Control Unit Lecturer: Reza Arjmandi Autumn 2015 Lecture 10, 11: Introduction Interrupt Concept, interrupt control unit and External Interrupt.

Similar presentations


Presentation on theme: "Interrupt Control Unit Lecturer: Reza Arjmandi Autumn 2015 Lecture 10, 11: Introduction Interrupt Concept, interrupt control unit and External Interrupt."— Presentation transcript:

1 Interrupt Control Unit Lecturer: Reza Arjmandi Autumn 2015 Lecture 10, 11: Introduction Interrupt Concept, interrupt control unit and External Interrupt

2 AVR Microcontroller-General Structure AVR CPU BUS Flash Memory SRAM EEPROM Counter USART TWI ADC MCU Control and Timing I/O Ports Interface I/O Ports Interface Watchdog Timer SPI ISP Interrupt Unit PORTDPORTCPORTBPORTA Internal Calibrated Oscillator Crystal Oscillator ATMEGA32 Block Diagram: DataSheet Page4

3 Polling #include DDRD_Bit2=0; PORTD_Bit2=1;//enable internal pull-up resistor DDRA=0xFF; DDRB=0xFF; void main(void) { LCDinit();//initialize LCD while(1) { if(PIND_Bit2==0) { LCDstring(“Danger!!”); … } LCDstring(“PlayMusic); PORTB_Bit0=1; __delay_cycles(500000); PORTB_Bit1=1; __delay_cycles(500000); PORTB_Bit2=1; __delay_cycles(500000); PORTB_Bit3=1; } Polling while(PIND_Bit2!=0); ?

4 Interrupt #include void main(void) { LCDinit(); while(1) { LCDstring(“PlayMusic); PORTB_Bit0=1; __delay_cycles(500000); PORTB_Bit1=1; __delay_cycles(500000); PORTB_Bit2=1; __delay_cycles(500000); PORTB_Bit3=1; } __interrupt void Function(void) { … LCDstring(“Danger!!”); … } Clicked Interrupt Source ISR(Interrupt Service Routine) در زمان رخداد یک وقفه، برنامه ‌ ی در حال اجرا متوقف شده و زیر برنامه ‌ ی وقفه (ISR) شروع به اجرای برنامه ‌ ی خود میکند و پس از پایان زیر برنامه ‌ ی مورد نظر اجرای برنامه ‌ ی اصلی ادامه می یابد

5 Interrupt-Mechanism برنامه اصلی ادامه برنامه اصلی ISR وقفه بازگشت از وقفه

6 Interrupt-Stack Memory 10100101 11011001 10001010 … 111010101 111011010 111100111 … ROM(Flash) 0x0000 0x0001 0x0002 0x0003 0x0004 … 0xFFFF PC= #include void main(void) { LCDinit(); while(1) { LCDstring(“PlayMusic); PORTB_Bit0=1; __delay_cycles(500000); PORTB_Bit1=1; __delay_cycles(500000); PORTB_Bit2=1; __delay_cycles(500000); PORTB_Bit3=1; } __interrupt void Function(void) { … LCDstring(“Danger!!”); … } 0xFFF1 0xFFF2 0xFFF3 Interrupt Source Stack(In SRAM) IRQ Main ISR PC= 0x0003 PC= Interrupt Vector PC= CPU

7 Interrupt-Source Internall OR IRQ CPU Timer/ Counter ADC IRQ External منابع وقفه (Interrupt Sources): اتفاقاتی هستند که در صورت وقوع، به طور خودکار به اطلاع CPU می رسند، این منابع مشخص ومعین میباشند قبلا توسط سازنده میکرو کنترولر طراحی شده و کاربر آن را نمیتواند تغییر دهد بردار وقفه (Interrupt Vector): هنگام رخداد یک وقفه، آدرسی که در شمارنده برنامه قرار میگیرد را « بردار وقفه » میگویند. این آدرس، همان آدرس شروع ISR مربوط به برنامه ‌ ی وقفه است

8 Interrupt-Source شماره بردار آدرس منبع وقفهنام بردار وقفه در IAR توضیح 1$000RESETRESET_vect External Pin, Power-on Reset, Brown out Reset, Watch dog Reset And JTAG AVR Reset 2$002INT0INT0_vect External Interrupt Request 0 3$004INT1INT1_vect External Interrupt Request 1 4$006TIMER2 COMPTIMER2_COMP_vect Timer/Counter2 Compare Match 5$008TIMER 2 OVFTIMER2_OVF_vect Timer/Counter2 Overflow 6$00ATIMER1 CAPTTIMER1_CAPT_vect Timer/Counter1 Capture Event 7$00CTIMER1 COMPATIMER1_COMPA_vect Timer/Counter1 Compare Match A 8$00ETIMER1 COMPBTIMER1_COMPB_vect Timer/Counter1 Compare Match B 9$010TIMER1 OVFTIMER1_OVF_vect Timer/Counter1 Overflow 10$012TIMER0 OVFTIMER0_OVF_vect Timer/Counter0 Overflow 11$014SPI,STCSPI_STC_vect Serial Transfer Complete 12$016USART,RXCUSART_RXC_vect USART Rx Complete 13$018USART,UDREUSART_UDRE_vect USART Data Register Empty 14$01AUSART, TXCUSART_TXC_vect USART TX Complete 15$01CADCADC_vect ADC Conversion Complete 16$01EEEPROM ReadyEE_RDY_vect EEPROM Ready 17$020Analog ComparatorANA_COMP_vect Analog Comparator Interrupt 18$022TWITWI_vec Two-wire serial Interface 19$024INT2INT2_vect External Interrupt Request 2 20$026TIMER0 COMPTIMER0_COMP_vect Timer/Counter0 Compare Match 21$028SPM ReadySPM_RDY_vect Store Program Memory Ready Example: File: iom16.h #define RESET_vect (0x00) #define INT0_vect (0x04) #define INT1_vect (0x08) #define TIMER2_COMP_vect (0x0C) #define TIMER2_OVF_vect (0x10) #define TIMER1_CAPT_vect (0x14) #define TIMER1_COMPA_vect (0x18) … نکته ! در صورت درخواست همزمان دو یا چند وقفه ابتدا به اولویت بالاتر پاسخ داده میشود وپس از آن به بقیه وقفه ‌ ها بر حسب اولویت رسیدگی میشود. نکته ! در میکروکنترولرهای AVR منابع وقفه، با توجه به نوع میکروکنترولر متفاوت است. به عنوان نمونه در ATMEGA8 9 منبع وقفه و در ATMEGA16 21 منبع وقفه موجود است

9 Interrupt-Flag Bits بیت فعال ساز اختصاصی : برای فعال سازی هر یک از 21 منبع وقفه یک بیت اختصاصی در رجیستر های مربوطه وجود دارد بیت فعال ساز عمومی : در میکروکنترولرهای AVR یک بیت فعال سازی عمومی (Global Interrupt Enable) به نام i وجود دارد. i=0  تمام وقفه ها غیرفعال ( حتی اگر بیت فعال سازی اختصاصی شان فعال باشد ) i=1  تمامی وقفه ها میتوانند توسط بیت اختصاصی شان فعال شوند بیت i یک بیت مهم در برنامه نویسی وقفه میباشد و یک دستور اسمبلی خاص برای کار وتغییر با آن وجود داد : نکته ! وقتی CPU وارد ISR میشود، بصورت خودکار i=0 شده و بعد از انجام شدن آن ISR مجددا بصورت خودکار i=1 میشود #include … void main(void) { asm(“sei”); //sei: Set i=1 … asm(“cli”); //cli: clear i, i=0 } بیت Flag درخواست وقفه : به ازای هر منبع وقفه یک بیت Flag وجود دارد که، یک شدن این بیت به معنای رخ دادن آن وقفه است، و اگر آن وقفه فعال نباشد بیت Flag آن وقفه تا زمانی که پاک نشود یک باقی مانده و با فعال شدن بیت فعال ساز یک IRQ به CPU ارسال میشود و پردازنده ISR مربوط به آن وقفه را اجرا میکند و در ابتدای اجرای ISR بیت Flag صفر میشود. یا SREG_Bit7=1; //Enable Global Interrupt SREG_Bit7=0; //Disable Global Interrupt SREG_I=1;

10 Interrupt-Programming مراحل برنامه نویسی یک وقفه بصورت زیر میباشد : 1- فعال کردن وقفه مورد نظر، بوسیله 1 کردن بیت فعال ساز اختصاصی آن وقفه (Interrupt Enable) 2- فعال کردن بیت فعال سازی عمومی وقفه ‌ ها (Global Interrupt Enable) بوسیله دستور asm(“sei”) 3- نوشتن برنامه ‌ ی وقفه مربوطه (ISR) در محل بردار وقفه مربوطه (Interrupt vector) به صورت زیر : #pragma vector = نام بردار وقفه __interrupt void نام تابع (void) { دستورات زیر برنامه ‌ ی وقفه }

11 External Interrupt OR IRQ نکته ! در هنگام استفاده از پایه ‌ های میکرو به عنوان وقفه خارجی، حتما باید پایه را به صورت ورودی تعریف کنیم، وگرنه هر تغییری در سطح منطقی پایه (High-Low) به عنوان یک درخواست وقفه در نظر گرفته میشود

12 External Interrupt-Register بیت فعال سازی اختصاصی وقفه ‌ های خارجی INT0: بیت فعال ساز وقفه خارجی صفر INT1: بیت فعال سازی وقفه خارجی یک INT2: بیت فعال ساز وقفه خارجی دو Example: #include void main(void) { GICR_Bit5=1; //enable external interrupt2 … } GICR: General Interrupt Control Register

13 External Interrupt-Register بیت تنظیمات مربوط به نحوه تریگر شدن وقفه های خارجی MCUCR: MCU Control Register INT0INT1 ISC01ISC00 شکل تریگر نوع تریگر شدن وقفه صفر Trigger 00 سطح منطقی صفر در پین INT0 Low level 01 هر تغییری در سطح منطقی پین INT0 Toggle 10 لبه ‌ ی پایین رونده در پین INT0 Falling edge 11 لبه ‌ ی بالا رونده در پین INT0 Rising edge OR ISC11ISC10 شکل تریگر نوع تریگر شدن وقفه یک Trigger 00 سطح منطقی صفر در پین INT1 Low level 01 هر تغییری در سطح منطقی پین INT1 Toggle 10 لبه ‌ ی پایین رونده در پین INT1 Falling edge 11 لبه ‌ ی بالا رونده در پین INT1 Rising edge OR

14 Example: #include void main(void) { GICR_INT2=1; //enable external interrupt2 MCUCSR_ISC2=1; //Trigger interrupt2 on rising edge } External Interrupt-Register بیت تنظیمات مربوط به نحوه تریگر شدن وقفه های خارجی MCUCSR: MCU Control AND Status Register INT2 ISC2 شکل تریگر نوع تریگر شدن وقفه دو Trigger 0 لبه ‌ ی پایین رونده در پین INT2 Falling edge 1 لبه ‌ ی بالا رونده در پین INT2 Rising edge

15 External Interrupt-Example1 #include void main(void) { DDRA_Bit2=1; DDRD_Bit2=0; PORTD_Bit2=1; GICR|=(1<<INT0); //Enable External interrupt0 MCUCR|=(1<<ISC01);//Trigger on falling edge asm("sei"); while(1); } #pragma vector=INT0_vect __interrupt void LED(void) { for(unsigned char i=0;i<2;i++) { PORTA_Bit2=1; __delay_cycles(200000); PORTA_Bit2=0; __delay_cycles(200000); } برنامه ‌ ای بنویسید که بوسیله وقفه خارجی صفر، LED روی بیت 2 از پورت A دو بار چشمک بزند و سپس خاموش شود، تحریک وقفه با لبه ‌ ی پایین رونده صورت بگیرد ( مشاهده میشود : به محض فشرده شدن کلید، برنامه وقفه شروع به کار کند )

16 External Interrupt-Example2 برنامه ‌ ای بنویسید که بوسیله وقفه خارجی صفر، LED روی بیت 2 از پورت A دو بار چشمک بزند و سپس خاموش شود، تحریک وقفه با لبه ‌ ی بالا رونده صورت بگیرد ( مشاهده میشود : هنگامی که کلید فشرده میشود، تا زمانی که کلید رها نشود برنامه وقفه شروع به کار نمیکند ) #include void main(void) { DDRA_Bit2=1; DDRD_Bit2=0; PORTD_Bit2=1; GICR|=(1<<INT0); //Enable External interrupt0 MCUCR|=(1<<ISC01)|(1<<ISC00); //Trigger on rising edge asm("sei"); while(1); } #pragma vector=INT0_vect __interrupt void LED(void) { for(unsigned char i=0;i<2;i++) { PORTA_Bit2=1; __delay_cycles(200000); PORTA_Bit2=0; __delay_cycles(200000); }

17 External Interrupt-Example3 برنامه ‌ ای بنویسید که بوسیله وقفه خارجی صفر، LED روی بیت 2 از پورت A دو بار چشمک بزند و سپس خاموش شود، تحریک وقفه با هر دو سطح منطقی صورت گیرد ( مشاهده میشود : هنگامی که کلید فشرده شده و نگه داشته میشود، برنامه وقفه شروع به کار میکند و پس از اینکه کلید رها میشود، مجددا برنامه وقفه شروع به کار میکند ) #include void main(void) { DDRA_Bit2=1; DDRD_Bit2=0; PORTD_Bit2=1; GICR|=(1<<INT0); //Enable External interrupt0 MCUCR|=(1<<ISC00);//Trigger on Toggle asm("sei"); while(1); } #pragma vector=INT0_vect __interrupt void LED(void) { for(unsigned char i=0;i<2;i++) { PORTA_Bit2=1; __delay_cycles(200000); PORTA_Bit2=0; __delay_cycles(200000); }

18 External Interrupt-Example4 مدار آشکار ساز عبور از صفر #include void main(void) { DDRA=0xFF; DDRD&=~(1<<PD2); PORTD|=(1<<PD2); GICR|=(1<<INT0); MCUCR|=(1<<ISC01); //falling edge asm("sei"); while(1); } #pragma vector=INT0_vect __interrupt void zero(void) { for(unsigned char i=0;i<=10;i++) { PORTA=0x01; __delay_cycles(1000); PORTA=0x00; }

19 Interrupt-Example5 ایجاد وقفه های تودرتو با ورود برنامه به ISR ، همزمان بیت فعال ساز عمومی i پاک شده و تا خروج آن صفر باقی میماند در نتیجه امکان پاسخ دهی به وقفه جدید در حین اجرای ISR وجود ندارد. در این وضعیت، نرم افزار میتواند بیت i را یک کند و درنتیجه وقفه تودرتو ایجاد میشود #include void main(void) { DDRD&=~(1<<PD2)|(1<<PD3); PORTD|=(1<<PD2)|(1<<PD3); DDRA|=(1<<PA2)|(1<<PA4); GICR|=(1<<INT0)|(1<<INT1); MCUCR|=(1<<ISC01)|(1<<ISC11); asm("sei"); while(1); } #pragma vector=INT0_vect __interrupt void function1(void) { asm("sei"); for(unsigned char i=0;i<3;i++) { PORTA_Bit2=1; __delay_cycles(1000000); PORTA_Bit2=0; __delay_cycles(1000000); } #pragma vector=INT1_vect __interrupt void Function2(void) { for(unsigned char i=0;i<=3;i++) { PORTA_Bit4=1; __delay_cycles(200000); PORTA_Bit4=0; __delay_cycles(200000); }

20 Interrupt-Example6 پروژه کنترل موتور Stepper: کنترل جهت چرخش و سرعت پله ‌ ای با استفاده از وقفه

21 Interrupt-Example6 #include void delay_ms(unsigned int MS); void CW_Rotate(); void CCW_Rotate(); unsigned char i,j; unsigned int SpeedDelay =100; enum RotateDirection{CW,CCW}; RotateDirection RD=CCW; void main(void) { DDRA=0xFF; DDRD&=~(1<<PD2)|(1<<PD3); //set PD2 and PD3 as input PORTD|=(1<<PD2)|(1<<PD3); //enable internal pull-up resistor DDRB_Bit2=0; //set PB2 as input PORTB_Bit2=1; //enable internal pull-up resistor GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2); //Enable Interrupt 0,1,2 MCUCR|=(1<<ISC01)|(1<<ISC11); MCUCSR&=~(1<<ISC2); asm("sei"); while(1) { switch(RD) { case(CW): CW_Rotate(); break; case(CCW): CCW_Rotate(); break; } #pragma vector=INT0_vect __interrupt void SpeedDown(void) { SpeedDelay+=10; } #pragma vector=INT1_vect __interrupt void SpeedUp(void) { if(SpeedDelay>10) SpeedDelay-=10; } #pragma vector=INT2_vect __interrupt void ChangeDirection(void) { if(RD==CW) RD=CCW; else RD=CW; }

22 Contact us www.e-system.ir Info@e-system.ir


Download ppt "Interrupt Control Unit Lecturer: Reza Arjmandi Autumn 2015 Lecture 10, 11: Introduction Interrupt Concept, interrupt control unit and External Interrupt."

Similar presentations


Ads by Google