Interrupt Chapter 10 Sepehr Naimi www Nicer Land

  • Slides: 29
Download presentation
Interrupt Chapter 10 Sepehr Naimi www. Nicer. Land. com

Interrupt Chapter 10 Sepehr Naimi www. Nicer. Land. com

Contents n n n n n Polling Vs. interrupt Interrupt unit Steps in executing

Contents n n n n n Polling Vs. interrupt Interrupt unit Steps in executing an interrupt Edge trigger Vs. Level trigger in external interrupts Timer interrupt Interrupt priority Interrupt inside an interrupt Task switching and resource conflict C programming 2

Polling Vs. Interrupt n Polling n Ties down the CPU n Interrupt n n

Polling Vs. Interrupt n Polling n Ties down the CPU n Interrupt n n n while (true) { if(PIND. 2 == 0) //do something; } Efficient CPU use Has priority Can be masked main( ) { Do your common task } whenever PIND. 2 is 0 then do something 3

Interrupt Controllers 4

Interrupt Controllers 4

Interrupt control unit in AVR 5

Interrupt control unit in AVR 5

Interrupt vectors in ATmega 328 Interrupt Address (hex) Reset 0000 External Interrupt Request 0

Interrupt vectors in ATmega 328 Interrupt Address (hex) Reset 0000 External Interrupt Request 0 0002 External Interrupt Request 1 0004 Pin Change Interrupt Request 0006 Pin Change Interrupt Request 0008 Pin Change Interrupt Request 000 A Watchdog Time-out Interrupt 000 C Timer/Counter 2 Compare Match A 000 E Timer/Counter 2 Compare Match B 0010 Timer/Counter 2 Overflow 0012 Timer/Counter 1 Capture Event 0014 Timer/Counter 1 Compare Match A 0016 Timer/Counter 1 Compare Match B 0018 Timer/Counter 1 Overflow 001 A Timer/Counter 0 Compare Match A 001 C 6

External Interrupts 7

External Interrupts 7

External Interrupts 8

External Interrupts 8

Edge trigger Vs. Level trigger in external interrupts EICRA: EICRA = 0 x 02;

Edge trigger Vs. Level trigger in external interrupts EICRA: EICRA = 0 x 02; //INT 0 on falling edges 9

External Interrupt Sample Code n 1 2 3 4 5 6 7 8 9

External Interrupt Sample Code n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Write a program that whenever INT 0 goes low, it toggles PB 5 once. . ORG 0 ; location for reset 18 EX 0_ISR: IN R 21, PORTB JMP MAIN 19 LDI R 22, (1<<5) ; for toggling PB 5. ORG 0 x 02 ; loc. for external INT 0 20 INT 0 EOR R 21, R 22 JMP EX 0_ISR 21 ISR OUT PORTB, R 21 MAIN: 22 RETI LDI R 20, HIGH(RAMEND) 23 OUT SPH, R 20 24 LDI R 20, LOW(RAMEND) 25 OUT SPL, R 20 ; initialize stack LDI R 20, 0 x 2 ; make INT 0 falling STS EICRA, R 20 SBI DDRB, 5 ; PORTB. 5 = output SBI PORTD, 2 ; pull-up activated LDI R 20, 1<<INT 0 ; enable INT 0 Ex. INT 0. OUT EIMSK, R 20 enable SEI ; enable interrupts HERE: JMP HERE 10

Steps in executing an interrupt PC 6 1 28 PC 5 PD 0 2

Steps in executing an interrupt PC 6 1 28 PC 5 PD 0 2 27 PC 4 PD 1 3 26 PC 3 (INT 0) PD 2 4 25 PC 2 (INT 1) PD 3 5 24 PC 1 PD 4 6 23 PC 0 VCC 7 22 GND 8 21 PB 7 PB 6 9 20 AVCC PB 7 10 19 PB 5 PD 5 11 18 PB 4 PD 6 12 17 PB 3 PD 7 13 16 PB 2 PB 0 14 15 PB 1 0002 ATmega 328 PC: 0016 0015 0014 0013 0012 000 D 0009 000 A 000 B 000 C 0006 0008 000 F 0004 000 E 0007 0005 0000 Code Address 0000 0002 0004 0005 0006 0007 0008 0009 000 A 000 B 000 C 000 D 000 E 000 F 0010 0012 0013 0014 0015 0016 SP . ORG 0 JMP MAIN. ORG 0 x 02 JMP EX 0_ISR MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20 LDI R 20, 0 x 2 ; make INT 0 falling STS EICRA, R 20 SBI PORTD, 2 ; pull-up activated LDI R 20, 1<<INT 0 ; enable INT 0 OUT EIMSK, R 20 SEI ; enable interrupts SBI DDRB, 5 ; PORTB. 5 = output HERE: INC R 25 JMP HERE EX 0_ISR: IN R 21, PORTB LDI R 22, (1<<5) ; for toggling PB 5 EOR R 21, R 22 OUT PORTB, R 21 RETI Stack 11

Timer Interrupts 12

Timer Interrupts 12

Timer Interrupts 13

Timer Interrupts 13

Using Timer 0 overflow interrupt n 1 2 3 4 5 6 7 8

Using Timer 0 overflow interrupt n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 This program uses Timer 0 to generate a square wave on pin PORTB. 5, while at the same time data is being transferred from PORTC to PORTD. . ORG 0 x 0 ; location for reset 19 SBI DDRB, 5 ; PB 5 as an output JMP MAIN 20 LDI R 20, 0 x 00. ORG 0 x 20 ; location for Timer 0 ov. 21 OUT DDRC, R 20 ; make PORTC input JMP T 0_OV_ISR ; jump to ISR for T 0 22 LDI R 20, 0 x. FF ; -main program for initialization 23 OUT PORTC, R 20 ; enable pull-up MAIN: LDI R 20, HIGH(RAMEND) 24 OUT DDRD, R 20 ; make PORTD output OUT SPH, R 20 25 HERE: IN R 20, PINC ; read from PORTC LDI R 20, LOW(RAMEND) 26 OUT PORTD, R 20 ; give it to PORTD OUT SPL, R 20 ; initialize stack 27 JMP HERE LDI R 20, -32 ; value for 2 us 28 T 0_OV_ISR: OUT TCNT 0, R 20 ; load Timer 029 IN R 16, PORTB ; read PORTB LDI R 20, 0 x 00 ISR 30 LDI R 17, (1<<5) ; for toggling PB 5 Timer Init. EOR R 16, R 17 OUT TCCR 0 A, R 20 31 LDI R 20, 0 x 01 32 OUT PORTB, R 16 ; toggle PB 5 OUT TCCR 0 B, R 20 ; Normal, no scaler 33 LDI R 16, -32 ; timer value for 2 us LDI R 20, (1<<TOIE 0) 34 OUT TCNT 0, R 16; load Timer 0 with -32 RETI Timer Int. ; return from interrupt STS TIMSK 0, R 20 ; enable Timer 0 Ov. 35 SEI ; set I (enable Ints) enable 14

Timer 0 Compare Match Interrupt n using Timer 0 and CTC mode generate a

Timer 0 Compare Match Interrupt n using Timer 0 and CTC mode generate a square wave on pin PORTB. 5, while at the same time data is being transferred from PORTC to PORTD. . ORG 0 x 0 ; location for reset JMP MAIN. ORG 0 x 1 C ; ISR location for Timer 0 compare match A JMP T 0_CM_ISR ; main program MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20; set up stack SBI DDRB, 5; PB 5 as an output LDI R 20, 239 OUT OCR 0 A, R 20 ; load Timer 0 with 239 LDI R 20, (1<<WGM 01) OUT TCCR 0 A, R 20 LDI R 20, 0 x 01 OUT TCCR 0 B, R 20 ; start Timer 0, CTC mode, no scaler LDI R 20, (1<<OCIE 0 A) STS TIMSK 0, R 20 ; enable Timer 0 compare match interrupt SEI ; set I (enable interrupts globally) LDI R 20, 0 x 00 OUT DDRC, R 20 ; make PORTC input LDI R 20, 0 x. FF OUT DDRD, R 20 ; make PORTD output Time (µs) ; -------- Infinite loop HERE: IN R 20, PINC ; read from PORTC OUT PORTD, R 20 ; and send it to PORTD JMP HERE ; --ISR for Timer 0 (executed every 40 µs) T 0_CM_ISR: IN R 16, PORTB ; read PORTB LDI R 17, 1<<5 ; 00100000 for toggling PB 5 EOR R 16, R 17 OUT PORTB, R 16 ; toggle PB 5 RETI ; return from interrupt 15

Pin Change Interrupts 16

Pin Change Interrupts 16

Pin Change Mask Registers 17

Pin Change Mask Registers 17

Pin Change Interrupt 18

Pin Change Interrupt 18

Pin Change Int. Sample Code n 1 2 3 4 5 6 7 8

Pin Change Int. Sample Code n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 The PB 0, PB 2, and PB 3 pins are connected to switches. Write a program that makes PORTB. 5 high whenever any of the switches changes state. . ORG 0 ; location for reset JMP MAIN. ORG 0 x 06 ; loc. for PCINT 0 JMP PCINT 0_ISR MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20 SBI DDRB, 5 CBI PORTB, 5 ; enable pull-up resistors OUT PORTB, R 20 ; enable PB 0, PB 2, and PB 3 PCINTs LDI R 20, 0 b 00001101 STS PCMSK 0, R 20 16 ; enable PORTB LDI 17 STS 18 SEI 19 JMP 20 HERE: 21 22 PCINT 0_ISR: SBI 23 RETI 24 25 26 27 28 29 30 change interrupt R 20, (1<<PCIE 0) PCICR, R 20 HERE PORTB, 5 19

Interrupt priority Interrupt Address (hex) Reset 0000 External Interrupt Request 0 0002 External Interrupt

Interrupt priority Interrupt Address (hex) Reset 0000 External Interrupt Request 0 0002 External Interrupt Request 1 0004 Pin Change Interrupt Request 0006 Pin Change Interrupt Request 0008 Pin Change Interrupt Request 000 A Watchdog Time-out Interrupt 000 C Timer/Counter 2 Compare Match A 000 E Timer/Counter 2 Compare Match B 0010 Timer/Counter 2 Overflow 0012 Timer/Counter 1 Capture Event 0014 Timer/Counter 1 Compare Match A 0016 Timer/Counter 1 Compare Match B 0018 Timer/Counter 1 Overflow 001 A Timer/Counter 0 Compare Match A 001 C Timer/Counter 0 Compare Match B 001 E Timer/Counter 0 Overflow 0020 SPI Serial Transfer Complete 0022 USART Rx Complete 0024 USART Data Register Empty 0026 USART Tx Complete 0028 ADC Conversion Complete 002 A EEPROM ready 002 C Analog Comparator 002 E Highest priority Lowest priority 20

Interrupt inside an interrupt n n The I flag is cleared when the AVR

Interrupt inside an interrupt n n The I flag is cleared when the AVR begins to execute an ISR. So, interrupts are disabled. The I flag is set when RETI is executed. 21

Task switching and resource conflict n 1 2 3 4 5 6 7 8

Task switching and resource conflict n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Does the following program work? . ORG 0 x 0 ; location for reset JMP MAIN. ORG 0 x 1 C ; Timer 0 compare match JMP T 0_CM_ISR ; -----main program---------------MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20 ; set up stack LDI R 20, 159 OUT OCR 0 A, R 20 LDI R 20, (1<<WGM 01) OUT TCCR 0 A, R 20 LDI R 20, 0 x 01 OUT TCCR 0 B, R 20 LDI R 20, (1<<OCIE 0 A) STS TIMSK 0, R 20 18 SEI 19 LDI R 20, 0 x. FF 20 OUT DDRC, R 20 21 OUT DDRD, R 20 22 HERE: OUT PORTC, R 20 23 INC R 20 24 JMP HERE 25 ; -------------ISR for Timer 0 26 T 0_CM_ISR: 27 IN R 20, PIND 28 INC R 20 29 OUT PORTD, R 20 30 RETI 22

Solution 1: different registers n 1 2 3 4 5 6 7 8 9

Solution 1: different registers n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Use different registers for different tasks. . ORG 0 x 0 ; location for reset JMP MAIN. ORG 0 x 1 C ; Timer 0 compare match JMP T 0_CM_ISR ; -----main program---------------MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20 ; set up stack LDI R 20, 159 OUT OCR 0 A, R 20 LDI R 20, (1<<WGM 01) OUT TCCR 0 A, R 20 LDI R 20, 0 x 01 OUT TCCR 0 B, R 20 LDI R 20, (1<<OCIE 0 A) STS TIMSK 0, R 20 18 SEI 19 LDI R 20, 0 x. FF 20 OUT DDRC, R 20 21 OUT DDRD, R 20 22 23 LDI R 20, 0 24 HERE: OUT PORTC, R 20 25 INC R 20 26 JMP HERE 27 ; -------------ISR for Timer 0 28 T 0_CM_ISR: 29 IN R 21, PIND 30 INC R 21 31 OUT PORTD, R 21 32 RETI 23

Solution 2: Context saving n 1 2 3 4 5 6 7 8 9

Solution 2: Context saving n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Save the contents of registers on the stack before execution of each task, and reload the registers at the end of the task. . ORG 0 x 0 ; location for reset JMP MAIN. ORG 0 x 1 C ; Timer 0 compare match JMP T 0_CM_ISR ; -----main program---------------MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20 ; set up stack LDI R 20, 159 OUT OCR 0 A, R 20 LDI R 20, (1<<WGM 01) OUT TCCR 0 A, R 20 LDI R 20, 0 x 01 OUT TCCR 0 B, R 20 LDI R 20, (1<<OCIE 0 A) STS TIMSK 0, R 20 18 SEI 19 LDI R 20, 0 x. FF 20 OUT DDRC, R 20 21 OUT DDRD, R 20 22 LDI R 20, 0 23 HERE: OUT PORTC, R 20 24 INC R 20 25 JMP HERE 26 ; -------------ISR for Timer 0 27 T 0_CM_ISR: 28 PUSH R 20 ; save R 20 29 IN R 20, PIND 30 INC R 20 31 OUT PORTD, R 20 32 POP R 20 ; restore R 20 33 RETI 34 24

Solution 3: Context saving using software stack n 1 2 3 4 5 6

Solution 3: Context saving using software stack n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Make a stack for yourself and use it to save the contents of registers. . ORG 0 x 0 ; location for reset JMP MAIN. ORG 0 x 1 C ; Timer 0 compare match JMP T 0_CM_ISR ; -----main program---------------MAIN: LDI R 20, HIGH(RAMEND) OUT SPH, R 20 LDI R 20, LOW(RAMEND) OUT SPL, R 20 ; set up stack LDI YH, HIGH($100) LDI YL, LOW($100) LDI OUT R 20, 159 OCR 0 A, R 20, (1<<WGM 01) TCCR 0 A, R 20, 0 x 01 TCCR 0 B, R 20 19 LDI R 20, (1<<OCIE 0 A) 20 STS TIMSK 0, R 20 21 SEI 22 LDI R 20, 0 x. FF 23 OUT DDRC, R 20 24 OUT DDRD, R 20 25 LDI R 20, 0 26 HERE: OUT PORTC, R 20 27 INC R 20 28 JMP HERE 29 ; -------------ISR for Timer 0 30 T 0_CM_ISR: 31 ST Y+, R 20 ; save R 20 32 IN R 20, PIND 33 INC R 20 34 OUT PORTD, R 20 35 LD R 20, -Y ; restore R 20 36 RETI 25

Saving SREG n We should save SREG, when we change flags in the ISR.

Saving SREG n We should save SREG, when we change flags in the ISR. PUSH IN PUSH. . . POP OUT POP R 20, SREG R 20 SREG, R 20 26

C programming n Interrupt Name Using Timer 0 generate a square wave on pin

C programming n Interrupt Name Using Timer 0 generate a square wave on pin PORTB. 5, Vector while at the same time transferring data External from PORTC to PORTD. Interrupt Request 0 INT 0_vect External Interrupt Request 1 INT 1_vect USART Tx Complete USART_TX_vect #include "avr/io. h" Pin Change Interrupt Request PCINT 0_vect #include "avr/interrupt. h" Pin Change Interrupt Request PCINT 1_vect int main () Pin Change Interrupt Request PCINT 2_vect { DDRB |= (1<<5); //DDRB. 5 = output Watchdog Time-out Interrupt WDT_vect TCNT 0 = -32; //timer. Timer/Counter 2 value for Compare 2 µs Match A TIMER 2_COMPA_vect TCCR 0 A = 0 x 00; Timer/Counter 2 Compare Match B TIMER 2_COMPB_vect TCCR 0 B = 0 x 01; //Normal mode, int clk, TIMER 2_OVF_vect no prescaler Timer/Counter 2 Overflow TIMSK 0 = (1<<TOIE 0); //enable Timer 0 interrupt sei ( ); //set overflow I Timer/Counter 1 Capture Event TIMER 1_CAPT_vect cli ( ); interrupts //clear I sei (); //enable Timer/Counter 1 Compare Match A TIMER 1_COMPA_vect DDRC = 0 x 00; //make PORTC input Timer/Counter 1 Compare Match B TIMER 1_COMPB_vect DDRD = 0 x. FF; //make PORTD output Overflow TIMER 1_OVF_vect while (1) //wait Timer/Counter 1 here PORTD = PINC; Timer/Counter 0 Compare Match A TIMER 0_COMPA_vect } Timer/Counter 0 Compare Match B TIMER 0_COMPB_vect ISR (TIMER 0_OVF_vect) //ISR for Timer 0 overflow Timer/Counter 0 Overflow TIMER 0_OVF_vect { SPI Serial Transfer Complete SPI_STC_vect TCNT 0 = -32; USART Rx Complete USART_RX_vect PORTB ^= 0 x 20; //toggle PORTB. 5 USART Data Register Empty USART_UDRE_vect } 27

C programming Example 2 n Using Timer 1 and CTC mode write a program

C programming Example 2 n Using Timer 1 and CTC mode write a program that toggles pin PORTB. 5 every second, while at the same time transferring data from PORTC to PORTD. Assume XTAL = 16 MHz. #include <avr/io. h> #include <avr/interrupt. h> int main () { DDRB |= (1<<5); //make DDRB. 5 output OCR 1 A = 15624; TCCR 1 A = 0 x 00; //CTC mode, internal clk, prescaler=1024 TCCR 1 B = 0 x 0 D; TIMSK 1 = (1<<OCIE 1 A); //enable Timer 1 compare match A int. sei (); //enable interrupts DDRC = 0 x 00; DDRD = 0 x. FF; while (1) PORTD = PINC; } ISR (TIMER 1_COMPA_vect) { PORTB ^= (1<<5); } //make PORTC input //make PORTD output //wait here //ISR for Timer 1 compare match A //toggle PORTB. 5 28

C programming Example 3 n Assume that the INT 0 pin is connected to

C programming Example 3 n Assume that the INT 0 pin is connected to a switch that is normally high. Write a program that toggles PORTB. 5, whenever INT 0 pin goes low. #include <avr/io. h> #include <avr/interrupt. h> int main () { DDRB = 1<<5; PORTD = 1<<2; EICRA = 0 x 2; EIMSK = (1<<INT 0); sei (); while (1); //PB 5 as an output //pull-up activated //make INT 0 falling edge triggered //enable external interrupt 0 //enable interrupts //wait here } ISR (INT 0_vect) { PORTB ^= (1<<5); } //ISR for external interrupt 0 //toggle PORTB. 5 29