0% found this document useful (0 votes)
13 views80 pages

ATmega Chap9 Interrupt

Uploaded by

tranhoang230202
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views80 pages

ATmega Chap9 Interrupt

Uploaded by

tranhoang230202
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 80

The ATmega324 Microcontroller

Chapter 9
Interrupts

Nguyen Trung Hieu


Ho Chi Minh City University of Technology
Nguyễn Trung Hiếu
Outline
• What is an Interrupt?
• External Interrupt
• Timer Interrupt
• USART Interrupt

Nguyễn Trung Hiếu 2


What Is an Interrupt?

(Source: http://www.6502.org/tutorials/interrupts.html)

• An interrupt = Occurrence of a condition (an event)


• Deal with the event while another program is executing
• Do many things “simultaneously”
Nguyễn Trung Hiếu
Interrupts

Hardware
Event
When an interrupt occurs, the main program temporarily suspends
execution and branches to the interrupt service routine (ISR),
perform the operation, and terminates with a “return from
interrupt” instruction (RETI).
Nguyễn Trung Hiếu
ISR vs. Subroutine
• Similarity: CPU executes another program and then returns to
the original program.
• Difference: It is NOT known when the main program suspends
execution.

ISR_NAME: SUBROUTINE_NAME:
… …
… …
RETI RET

Nguyễn Trung Hiếu


Interrupt Sources
• 3 External Interrupts + 4 Pin Change Interrupts
• 10 Timer Interrupts (3 Timer0 + 4 Timer 1 + 3 Timer2)
• 6 USART Interrupt (3 USART0 + 3 USART1)
• 1 SPI Interrupt + 1 TWI (I2C) Interrupt
• 1 ADC Interrupt + 1 AC Interrupt
• 1 EEPROM Interrupt + 1 Program Memory Interrupt
• 1 Watchdog Timer Interrupt

Nguyễn Trung Hiếu


When an Interrupt occurs?
An interrupt = Occurrence of a condition (an event)

No Interrupt Source Definition


1 TIMER0_OVF Timer0 Overflow
2 TIMER0_COMPA Timer0 Compare Match A
3 TIMER0_COMPB Timer0 Compare Match B
4 TIMER2_OVF Timer2 Overflow
5 TIMER2_COMPA Timer2 Compare Match A
6 TIMER2_COMPB Timer2 Compare Match B
7 TIMER1_OVF Timer1 Overflow
8 TIMER1_COMPA Timer1 Compare Match A
9 TIMER1_COMPB Timer1 Compare Match B
10 TIMER1_CAPT Timer1 Capture Event
Nguyễn Trung Hiếu
When an Interrupt occurs?
An interrupt = Occurrence of a condition (an event)

11 USART0_RX USART0 Rx Complete


12 USART0_TX USART0 Tx Complete
13 USART0_UDRE USART0 Transmit Buffer Empty
14 USART1_RX USART1 Rx Complete
15 USART1_TX USART1 Tx Complete
16 USART1_UDRE USART1 Transmit Buffer Empty
17 SPI_STC SPI Transfer Complete
18 TWI TWI(I2C) Transfer Complete
19 ADC ADC Conversion Complete
20 ANALOG_COMP Analog Comparator
Nguyễn Trung Hiếu
When an Interrupt occurs?
21 INT0 External Interrupt Request on pin INT0
22 INT1 External Interrupt Request on pin INT1
23 INT2 External Interrupt Request on pin INT2
24 PCINT0 Change Level on pin PCINT0..PCINT7(PA0..PA7)
25 PCINT1 Change Level on pin PCINT8..PCINT15(PB0..PB7)
26 PCINT2 Change Level on pin PCINT16..PCINT23(PC0..PC7)
27 PCINT3 Change Level on pin PCINT24..PCINT31(PD0..PD7)
28 EE_READY EEPROM Write Done
29 WDT Watchdog Time-out Interrupt
30 RESET Reset JTAG
Reset Watchdog Timer
Reset Vcc lower threshold
Reset External
Reset Power-on
31 SPM SPM(Store Program Memory)
Interrupt Flags
When an event occurs → the corresponding interrupt flag is set
→ Interrupt occurs

No Interrupt Source Interrupt Flags Register Position


1 TIMER0_OVF TOV0 TIFR0 0
2 TIMER0_COMPA OCF0A TIFR0 1
3 TIMER0_COMPB OCF0B TIFR0 2
4 TIMER2_OVF TOV2 TIFR2 0
5 TIMER2_COMPA OCF2A TIFR2 1
6 TIMER2_COMPB OCF2B TIFR2 2
7 TIMER1_OVF TOV1 TIFR1 0
8 TIMER1_COMPA OCF1A TIFR1 1
9 TIMER1_COMPB OCF2B TIFR1 2
10 TIMER1_CAPT ICF1 TIFR1 5
Nguyễn Trung Hiếu
Interrupt Flags
When an event occurs → the corresponding interrupt flag is set
→ Interrupt occurs

11 USART0 Rx Complete RXC0 UCSR0A 7


12 USART0 Tx Complete TXC0 USCR0A 6
13 USART0 Transmit Buffer Empty UDRE0 USCR0A 5
14 USART1 Rx Complete RXC1 UCSR1A 7
15 USART1 Tx Complete TXC1 USCR1A 6
16 USART1 Transmit Buffer Empty UDRE1 USCR1A 5
17 SPI Transfer Complete SPIF0 SPSR0 7
18 TWI(I2C) Transfer Complete TWINT(*) TWCR 7
19 ADC Conversion Complete ADIF ADCSRA 4
20 Analog Comparator ACI ACSR 4
Nguyễn Trung Hiếu
21 INT0 INTF0 EIFR 0
22 INT1 INTF1 EIFR 1
23 INT2 INTF2 EIFR 2
24 PCINT0 PCIF0 PCIFR0 0
25 PCINT1 PCIF1 PCIFR0 1
26 PCINT2 PCIF2 PCIFR0 2
27 PCINT3 PCIF3 PCIFR0 3
28 EE_READY EEPE(**) EECR 1
29 WDT WDIF WDTCSR 7
30 RESET JTRF MCUSR 4
WDRF MCUSR 3
BORF MCUSR 2
EXTRF MCUSR 1
PORF MCUSR 0
31 SPM SPMEN SPMCSR 0
(***)
Interrupt control unit in AVR

Nguyễn Trung Hiếu


Enabling and Disabling Interrupts

I T H S V N Z C

I: Global Interrupt Enable

1 = Enable

0 = Disable

Must be set before using any interrupt source

Nguyễn Trung Hiếu


Enabling and Disabling Interrupts
Interrupt Source Enable Bit Register Bit
INT0 INT0 EIMSK 0
INT1 INT1 EIMSK 1
INT2 INT2 EIMSK 2
PCINT0 PCIE0 PCICR 0
PCINT1 PCIE1 PCICR 1
PCINT2 PCIE2 PCICR 2
PCINT3 PCIE3 PCICR 3
WDT WDIE WDTCSR 6
TIMER2_COMPA OCIE2A TIMSK2 1
TIMER2_COMPB OCIE2B TIMSK2 2
TIMER2_OVF TOIE2 TIMSK2 0

Nguyễn Trung Hiếu


Enabling and Disabling Interrupts
TIMER1_CAPT ICIE1 TIMSK1 5
TIMER1_COMPA OCIE1A TIMSK1 1
TIMER1_COMPB OCIE1B TIMSK1 2
TIMER1_OVF TOIE1 TIMSK1 0
TIMER0_COMPA OCIE0A TIMSK0 1
TIMER0_COMPB OCIE0B TIMSK0 2
TIMER0_OVF TOIE0 TIMSK0 0
SPI_STC SPIE0 SPCR0 7
USART0_RX RXCIE0 UCSR0B 7
USART0_UDRE UDRIE0 UCSR0B 5
USART0_TX TXCIE0 UCSR0B 6
ANALOG_COMP ACIE ACSR 3
ADC ADIE ADCSRA 3
Nguyễn Trung Hiếu
Enabling and Disabling Interrupts

EE_READY EERIE EECR 3


TWI TWIE TWCR 0
SPM_READY SPMIE SPMCSR 7
USART1_RX RXCIE1 UCSR1B 7
USART1_UDRE UDRIE1 UCSR1B 5
USART1_TX TXCIE1 UCSR1B 6

Register highlighted in red has I/O adress

Nguyễn Trung Hiếu


Enabling and Disabling Interrupts
Example 1: Timer 1 Overflow interrupt is enabled as follow:
SEI
LDI R16,(1<<TOIE1)
STS TIMSK1,R16

Example 2: External INT0 and USART0 Transmit done interrupts


are enabled as follow:
SEI
LDI R16,(1<<INT0)
OUT EIMSK,R16
LDI R16,(1<<TXCIE0)
STS UCSR0B,R16

Nguyễn Trung Hiếu


Interrupt Operation

Nguyễn Trung Hiếu


Interrupt Operation

Code Memory
Nguyễn Trung Hiếu
Interrupt Vectors
• When an interrupt is accepted, the value loaded into PC is
called interrupt vector. It is the address of the start of the
ISR.
No Vector Address Interrupt Source
1 $0000(*) RESET
2 $0002 INT0
3 $0004 INT1
4 $0006 INT2
5 $0008 PCINT0
6 $000A PCINT1
7 $000C PCINT2
8 $000ENguyễn Trung Hiếu PCINT3
Interrupt Vectors
9 $0010 WDT
10 $0012 TIMER2_COMPA
11 $0014 TIMER2_COMPB
12 $0016 TIMER2_OVF
13 $0018 TIMER1_CAPT
14 $001A TIMER1_COMPA
15 $001C TIMER1_COMPB
16 $001E TIMER1_OVF
17 $0020 TIMER0_COMPA
18 $0022 TIMER0_COMPB
19 $0024 TIMER0_OVF
20 $0026 SPI_STC
Nguyễn Trung Hiếu
Interrupt Vectors
21 $0028 USART0_RX
22 $002A USART0_UDRE
23 $002C USART0_TX
24 $002E ANALOG_COMP
25 $0030 ADC
26 $0032 EE_READY
27 $0034 TWI
28 $0036 SPM_READY
29 $0038 USART1_RX
30 $003A USART1_UDRE
31 $003C USART1_TX
Nguyễn Trung Hiếu
Structure Program with ISR
.ORG 0
RJMP MAIN ISR_INT0:
.ORG $02 …
RJMP ISR_INT0 RETI
.ORG $1E
RJMP ISR_TIMER1_OVF
… ISR_TIMER1_OVF:

.ORG $40 RETI
MAIN:

LOOP: RJMP LOOP


Nguyễn Trung Hiếu
Processing Interrupts
• When an interrupt (an event) occurs:
❑The corresponding interrupt flag is set
❑The current instruction completes execution.
❑The PC is saved on the stack.
❑The PC is loaded with the interrupt vector, which is the
address of the start of the ISR.
❑The interrupt flag is automatically cleared, except TWINT
❑The ISR executes and takes action in response to the interrupt.
• The ISR finishes with a RETI (return from interrupt) instruction.
❑This retrieves the old value of the PC from the stack and
execution of the main program continues.

Nguyễn Trung Hiếu


An Example
• Assume that Timer0 Overflow interrupt was enabled.
• When TCNT0 increase from $FF to 0→ TOV0 is set (automatically by
hardware)
• The current PC is saved on the stack
• PC  0024H (and the main program is interrupted)
• The instruction at address 0024H (i.e. the first instruction of the ISR for
Timer0 Overflow) executes.
• When the ISR is done, the RETI instruction retrieves the old value of the
PC from the stack and the main program continues.

Nguyễn Trung Hiếu


An Example
Given the following program:

.ORG 0 TIMER1_COMPB_ISR:
RJMP MAIN …
.ORG 0X001C RETI
RJMP TIMER1_COMPB_ISR

.ORG 0X0040
MAIN: …
When command (1) is executing,
… OCF1B is set. Describe how the
START: LDI R16,1 program runs from this time?
IN R17,PORTB (1)
EOR R17,R16
OUT PORTB,R17
RJMP START Nguyễn Trung Hiếu
Interrupt Priority
• The lower the address the higher is the priority level.
• RESET has the highest priority, and next is INT0 – the
External Interrupt Request 0, …, USART1_TX has the lowest
priority
• When an interrupt occurs, the Global Interrupt Enable (I-
bit) is cleared and all interrupts are disabled. The I-bit is
automatically set when a Return from Interrupt instruction –
RETI – is executed.

28
Interrupt Priority

• If one or more interrupt conditions occur while the I-bit is cleared,


the corresponding Interrupt Flag(s) will be set and remembered
until the I-bit is set, and will then be executed by order of priority.
• When the AVR exits from an interrupt, it will always return to the
main program and execute one more instruction before any
pending interrupt is served
• The user software can set I-bit to enable nested interrupts. All
enabled interrupts can then interrupt the current interrupt
routine.

29
An Example
Given the following program:
.ORG 0 TIMER1_COMPB_ISR:
RJMP MAIN …
.ORG 0X001C RETI
RJMP TIMER1_COMPB_ISR
.ORG 0X002A USART0_UDRE:
RJMP USART0_UDRE …
RETI
.ORG 0X0040
MAIN: …
When command (1) is executing,
… OCF1B and UDRE is set.
START: LDI R16,1 Describe how the program runs
IN R17,PORTB (1) from this time?
EOR R17,R16
OUT PORTB,R17
RJMP START Nguyễn Trung Hiếu
An Example
Given the following program:
.ORG 0 TIMER1_COMPB_ISR:
RJMP MAIN SEI
.ORG 0X001C …
RJMP TIMER1_COMPB_ISR RETI
.ORG 0X002A USART0_UDRE:
RJMP USART0_UDRE …
RETI
.ORG 0X0040
MAIN: … When command (1) is executing,
… OCF1B is set.
START: LDI R16,1 When TIMER1_COMPB_ISR is
IN R17,PORTB (1) executing, UDRE is set.
Describe how the program runs from
EOR R17,R16 this time?
OUT PORTB,R17
RJMP START Nguyễn Trung Hiếu
Lost Data When Execute ISR

• The Status Register is not automatically stored when entering an


interrupt routine, nor restored when returning from an interrupt
routine. This must be handled by software.
Example:
TIMER1_COMPB_ISR:
PUSH R16
IN R16,SREG
PUSH R16

POP R16
OUT SREG,R16
POP R16
RETI
32
Outline
• What is an Interrupt?
• External Interrupt
• Timer Interrupt
• USART Interrupt

Nguyễn Trung Hiếu 33


External Interrupt

Interrupt Description Enable Register Bit


Source Bit
INT0 External Interrupt Request on pin INT0 INT0 EIMSK 0
INT1 External Interrupt Request on pin INT1 INT1 EIMSK 1
INT2 External Interrupt Request on pin INT2 INT2 EIMSK 2
PCINT0 Change Level on pin PCINT0..PCINT7(PA0..PA7) PCIE0 PCICR 0
PCINT1 Change Level on pin PCINT8..PCINT15(PB0..PB7) PCIE1 PCICR 1
PCINT2 Change Level on pin PCINT16..PCINT23(PC0..PC7) PCIE2 PCICR 2
PCINT3 Change Level on pin PCINT24..PCINT31(PD0..PD7) PCIE3 PCICR 3

Nguyễn Trung Hiếu


External Interrupt

Nguyễn Trung Hiếu


External Interrupt
EICRA:
- SRAM address: $69

Nguyễn Trung Hiếu


Pin Change Interrupt

Nguyễn Trung Hiếu


External Interrupt
A push-button is connected to pin PD2 (INT0). Write a program that
toggles pin PA0 when pushing the button down.

Nguyễn Trung Hiếu


.ORG 0 External Interrupt
RJMP MAIN
.ORG $02 INT0_ISR:
PUSH R16
RJMP INT0_ISR
PUSH R17
.ORG $40 IN R17,SREG
MAIN:LDI R16,HIGH(RAMEND) PUSH R17
OUT SPH,R16 LDI R16,0X01
LDI R16,LOW(RAMEND) IN R17,PORTA
EOR R17,R16
OUT SPL,R16
OUT PORTA,R17
SBI PORTD,2 POP R17
SBI DDRA,0 OUT SREG,R17
CBI PORTA,0 POP R17
LDI R16,(1<<ISC01) POP R16
RETI
STS EICRA,R16
SBI EIMSK,INT0
SEI
Nguyễn Trung Hiếu
HERE: RJMP HERE
Practice Problem 1
A push-button is connected to pin PB2 (INT2). Write a program that
creates one 10-ms pulse at pin PA0 when pushing the button down.

Nguyễn Trung Hiếu


.ORG 0 Practice Problem 1
RJMP MAIN
.ORG $06 INT2_ISR:
PUSH R16
RJMP INT2_ISR
PUSH R17
.ORG $40 IN R17,SREG
MAIN:LDI R16,HIGH(RAMEND) PUSH R17
OUT SPH,R16 SBI PORTA,0
LDI R16,LOW(RAMEND) RCALL DELAY10MS
CBI PORTA,0
OUT SPL,R16
POP R17
SBI PORTB,2 OUT SREG,R17
SBI DDRA,0 POP R17
CBI PORTA,0 POP R16
LDI R16,(1<<ISC21) RETI
STS EICRA,R16
SBI EIMSK,INT2
SEI
Nguyễn Trung Hiếu
HERE: RJMP HERE
Practice Problem 1
DELAY10MS:
LDI R16,HIGH(-10000)
STS TCNT1H,R16
LDI R16,LOW(-10000)
STS TCNT1L,R16
LDI R16,$02
STS TCCR1A,R16
LDI R16,$02
STS TCCR1B,R16
LOOP: SBIS TIFR1,TOV1
RJMP LOOP
SBI TIFR1,TOV1
LDI R16,$02
STS TCCR1B,R16
RET

Nguyễn Trung Hiếu


Practice Problem 2
A push-button is connected to pin PD3 (INT1). Write a program that
creates a wave (1 KHz, 50%) at pin PA7 when pushing the button
down odd times. In case of even pressing, PA7 is cleared.

MAIN:
INT1_ISR: Write Read
If R20 is odd, generates
When button push, R20 pulse at PA7.
increase R20
If R20 is even, PA7 = 0

Nguyễn Trung Hiếu


Practice Problem 2
MAIN

INT1_ISR
Configure I/O
Interrupt

SAVE SREG
R21  R20

R20  R20 + 1 R21&01= 1


N
Y
LOAD SREG PA7  1
PA7  0

DELAY500US
END ISR
PA7  0

Nguyễn Trung Hiếu


DELAY500US
Practice Problem 2
.ORG 0 Read R20
RJMP MAIN
.ORG $04 START:MOV R21,R20
RJMP INT1_ISR ANDI R21,01
.ORG $40 CPI R21,$01
MAIN:LDI R16,HIGH(RAMEND) BRNE PUSH_EVEN
OUT SPH,R16 SBI PORTA,7
LDI R16,LOW(RAMEND) RCALL DELAY500US
OUT SPL,R16 CBI PORTA,7
SBI PORTD,3 RCALL DELAY500US
SBI DDRA,7 RJMP START
CBI PORTA,7 PUSH_EVEN:
LDI R16,(1<<ISC11) CBI PORTA,7
STS EICRA,R16 RJMP START
SBI EIMSK,INT1
SEI Nguyễn Trung Hiếu
Practice Problem 2
INT1_ISR: DELAY500US:
PUSH R17 LDI R16,HIGH(-500)
IN R17,SREG STS TCNT1H,R16
PUSH R17 LDI R16,LOW(-500)
INC R20 STS TCNT1L,R16
POP R17 LDI R16,$02
OUT SREG,R17 STS TCCR1A,R16
POP R17 LDI R16,$02
RETI STS TCCR1B,R16
LOOP: SBIS TIFR1,TOV1
RJMP LOOP
SBI TIFR1,TOV1
LDI R16,$00
STS TCCR1B,R16
RET

Nguyễn Trung Hiếu


Outline
• What is an Interrupt?
• External Interrupt
• Timer Interrupt
• USART Interrupt

Nguyễn Trung Hiếu 47


Timer Interrupt Mode Normal & CTC
Write a program using Timer0 mode Normal and interrupt to create a
10 kHz square wave on PA0. Assume that use Internal RC 8MHz and
bit CLKDIV=1.
f = 10 kHz
T = 100 μs
tH tL
tH = tL = 50 μs
T
Choose Clock Selector: clkI/O / 8
TCCR0A  $00
→ CS[2:0] = 010 TCCR0B  $02
clkTimer = 1MHz → 1 count = 1/1MHz = 1 μs
→ tDelay = 50 μs = 50 count

→ Use Timer0 to count from -50 to 0


• Initial count TCNT0 = - 50
Timer Interrupt Mode Normal & CTC
.ORG 0 ISR_T0_OVF:
RJMP MAIN PUSH R17
.ORG $24 IN R17,SREG
RJMP ISR_T0_OVF PUSH R17
Stop LDI R16,$00
.ORG $40 Timer OUT TCCR0B,R16
MAIN: SBI DDRA,0
LDI R16,-50 IN R16,PORTA
OUT TCNT0,R16 EOR R16,R18
LDI R16,$00 OUT PORTA,R16
OUT TCCR0A,R16
LDI R16,$02 LDI R16,-50
Init value
OUT TCCR0B,R16 OUT TCNT0,R16
Start timer
LDI R16,$02
again
LDI R16,(1<<TOIE0) OUT TCCR0B,R16
STS TIMSK0,R16 POP R17
SEI OUT SREG,R17
POP R17
LDI R18,$01 RETI
LOOP: RJMP LOOP Nguyễn Trung Hiếu
Timer Interrupt Mode Normal & CTC
Write a program using Timer0 mode CTC and interrupt to create a 10
kHz square wave on PA0. Assume that use Internal RC 8MHz and bit
CLKDIV=1.
f = 10 kHz
T = 100 μs
tH tL
tH = tL = 50 μs
T
Choose Clock Selector: clkI/O / 8
TCCR0A  $02
→ CS[2:0] = 010 TCCR0B  $02
clkTimer = 1MHz → 1 count = 1/1MHz = 1 μs
→ tDelay = 50 μs = 50 count
→ Use Timer0 to count from 0 to 49
• Initial count TCNT0 = 0
• OCR0A = 49
Timer Interrupt Mode Normal & CTC
.ORG 0 ISR_T0_COMPA:
RJMP MAIN PUSH R17
.ORG $20 IN R17,SREG
RJMP ISR_T0_COMPA PUSH R17

.ORG $40 IN R16,PORTA


MAIN: SBI DDRA,0 EOR R16,R18
LDI R16,00 OUT PORTA,R16
OUT TCNT0,R16
LDI R16,49 POP R17
OUT OCR0A,R16 OUT SREG,R17
LDI R16,$02 POP R17
OUT TCCR0A,R16 RETI
LDI R16,$02
OUT TCCR0B,R16
LDI R16,(1<<OCIE0A)
STS TIMSK0,R16
SEI
DON’T NEED TO REINIT TIMER AGAIN
LDI R18,$01
Nguyễn Trung Hiếu
LOOP: RJMP LOOP
Timer Interrupt Mode Normal & CTC
.ORG 0
.ORG $40
RJMP MAIN
MAIN: SBI DDRA,0
.ORG $20
LDI R16,00
IN R16,PORTA
OUT TCNT0,R16
EOR R16,R18
LDI R16,49
OUT PORTA,R16
OUT OCR0A,R16
RETI
LDI R16,$02
OUT TCCR0A,R16
LDI R16,$02
OUT TCCR0B,R16
If the ISR is short and Compare Match B
LDI R16,(1<<OCIE0A)
is not used, can put ISR here
STS TIMSK0,R16
SEI

LDI R18,$01
LOOP: RJMP LOOP

Nguyễn Trung Hiếu


(Remember) Maximum Delay with 1 loop
Calculate the maximum delay can be created with 1 loop.
Assume that clkI/O = 8MHz. The Timer 0 or 2 is used.

clk I/O/1 clk I/O/8 clk I/O/32 clk I/O/64 clk I/O/128 clk I/O/256 clk I/O/1024

clkTimer 8 1 1/4 1/8 1/16 1/32 1/128


(MHz)

Ttimer 0.125 1 4 8 16 32 128


(µs)

Max 32 256 1024 2048 4096 8192 32768


time
(µs)

Timer0 Timer0
don’t haveNguyễn Trung Hiếu
don’t have 53
(Remember) Maximum Delay with 1 loop
Calculate the maximum delay can be created with 1 loop.
Assume that clkI/O = 8MHz. The Timer 1 is used.
16 bit → 65536 count
clk I/O/1 clk I/O/8 clk I/O/64 clk I/O/256 clk I/O/1024

clkTimer 8 1 1/8 1/32 1/128


(MHz)

Ttimer 0.125 1 8 32 128


(µs)

Max 8 192 65 536 524 288 2 097 152 8 388 608


time
(µs)

Nguyễn Trung Hiếu 54


Practice Problem 1
Write a program using Timer and interrupt to create a 100 Hz square
wave on PA0. Assume that use Internal RC 8MHz and bit CLKDIV=1.
Use Timer0
f = 100 Hz
Mode CTC
T = 10000 μs
tH tL
tH = tL = 5000 μs
T

Choose Clock Selector: clkI/O / 64 TCCR0A  $02


→ CS[2:0] = 011 TCCR0B  $03

clkTimer = 1/8 MHz → 1 count = 8 μs


→ tDelay = 5000 μs = 625 count = 5.125 count
→ Use Timer0 to count from 0 to 124
• Initial count TCNT0 = 0, OCR0A = 124
• Repeat 5 times Nguyễn Trung Hiếu
.ORG 0
Practice Problem 1
RJMP MAIN ISR_T0_COMPA:
.ORG $20 PUSH R17
RJMP ISR_T0_COMPA IN R17,SREG
PUSH R17
.ORG $40
MAIN: SBI DDRA,0 Repeat 5 times DEC R20
LDI R16,00 BRNE NEXT
OUT TCNT0,R16 LDI R20,$5
LDI R16,124 IN R16,PORTA
OUT OCR0A,R16 EOR R16,R18
LDI R16,$02 OUT PORTA,R16
OUT TCCR0A,R16
LDI R16,$03 NEXT: POP R17
OUT TCCR0B,R16 OUT SREG,R17
LDI R16,(1<<OCIE0A) POP R17
STS TIMSK0,R16 RETI
SEI

LDI R18,$01
LDI R20,$5
Nguyễn Trung Hiếu
LOOP: RJMP LOOP
Practice Problem 1
Write a program using Timer and interrupt to create a 100 Hz square
wave on PA0. Assume that use Internal RC 8MHz and bit CLKDIV=1.
Use Timer1
f = 100 Hz
Mode CTC
T = 10000 μs
tH tL
tH = tL = 5000 μs
T

Choose Clock Selector: clkI/O / 64 TCCR1A  0000 0000


→ CS[2:0] = 011 TCCR1B  0000 1011

clkTimer = 1/8 MHz → 1 count = 8 μs


→ tDelay = 5000 μs = 625 count
→ Use Timer1 to count from 0 to 624
• Initial count TCNT1H:TCNT1L = 0
OCR1AH:OCR1AL = 624
.ORG 0
Practice Problem 1
RJMP MAIN LDI R18,$01
.ORG $1A LOOP: RJMP LOOP
RJMP ISR_T1_COMPA

.ORG $40
MAIN: SBI DDRA,0 ISR_T1_COMPA:
LDI R16,00 PUSH R17
STS TCNT1H,R16 IN R17,SREG
STS TCNT1L,R16 PUSH R17
LDI R16,HIGH(624) IN R16,PORTA
STS OCR1AH,R16 EOR R16,R18
LDI R16,LOW(624) OUT PORTA,R16
STS OCR1AL,R16
LDI R16,$00 POP R17
STS TCCR1A,R16 OUT SREG,R17
LDI R16,$0B POP R17
STS TCCR1B,R16 RETI
LDI R16,(1<<OCIE1A)
STS TIMSK1,R16
Nguyễn Trung Hiếu
SEI
Practice Problem 2
Write a program using Timer and interrupt to send data from PortA to
PortC every 1 ms. Assume that use Internal RC 8MHz and bit CLKDIV=1.

Use Timer1
Mode CTC
Choose Clock Selector: clkI/O / 8 TCCR1A  0000 0000
TCCR1B  0000 1010
→ CS[2:0] = 010
clkTimer = 1 MHz → 1 count = 1 μs
→ tDelay = 1000 μs = 1000 count
→ Use Timer1 to count from 0 to 999
• Initial count TCNT1H:TCNT1L = 0
OCR1AH:OCR1AL = 999

Nguyễn Trung Hiếu


Practice Problem 2
.ORG 0 LDI R16,$00
RJMP MAIN STS TCCR1A,R16
.ORG $1A LDI R16,$0A
RJMP ISR_T1_COMPA STS TCCR1B,R16
LDI R16,(1<<OCIE1A)
.ORG $40 STS TIMSK1,R16
MAIN: LDI R16,$00 SEI
OUT DDRA,R16 LOOP: RJMP LOOP
LDI R16,$FF
OUT DDRC,R16 ISR_T1_COMPA:
LDI R16,00 PUSH R17
STS TCNT1H,R16 IN R17,SREG
STS TCNT1L,R16 PUSH R17

LDI R16,HIGH(999) IN R16,PINA


STS OCR1AH,R16 OUT PORTC,R16
LDI R16,LOW(999)
STS OCR1AL,R16 POP R17
OUT SREG,R17
POP R17
Nguyễn Trung Hiếu
RETI
Practice Problem 3
Write a program using Timer and interrupt to send data from A to
UART (8 bit, 9600 baud) every 1 ms. Assume that use Internal RC
8MHz and bit CLKDIV=1.

Nguyễn Trung Hiếu


Practice Problem 3
.ORG 0 LDI R16,$00
RJMP MAIN STS TCCR1A,R16
.ORG $1A LDI R16,$0A
RJMP ISR_T1_COMPA STS TCCR1B,R16
LDI R16,(1<<OCIE1A)
.ORG $40 STS TIMSK1,R16
MAIN: RCALL USART_INIT SEI
LDI R16,00 LOOP: RJMP LOOP
STS TCNT1H,R16
ISR_T1_COMPA:
STS TCNT1L,R16
PUSH R17
IN R17,SREG
LDI R16,HIGH(999)
PUSH R17
STS OCR1AH,R16
LDI R16,LOW(999)
LDI R16,’A’
STS OCR1AL,R16
RCALL USART_TRANS

POP R17
OUT SREG,R17
POP R17
Nguyễn Trung Hiếu RETI
Practice Problem 3
USART_INIT:
LDI R16,(1<<TXEN0) ;Enable Transmitter
STS UCSR0B, R16
LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ;8-bit data
STS UCSR0C, R16 ;no parity, 1 stop bit
LDI R16,0x00
STS UBRR0H,R16
LDI R16,51 ;baud rate = 9600 and Fosc = 8 MHz
STS UBRR0L,R16
RET

USART_TRANS:
LDS R17,UCSR0A
SBRS R17,UDRE0
RJMP UART_TRANS
STS UDR0,R16
RET
Nguyễn Trung Hiếu
Practice Problem 4
Write a program using Timer and interrupt to create the pulse in this
figure to PA0. Assume that use Internal RC 8MHz and bit CLKDIV=1.

Nguyễn Trung Hiếu


Practice Problem 5
Trong 1 loại kỹ thuật điều chế tín hiệu:
- Bit 1 tương đương với 1 xung có chu kỳ 1ms và D = 25%
- Bit 0 tương đương với 1 xung có chu kỳ 1ms và D = 60%
Viết chương trình xuất 8 bit nằm trong thanh ghi R7 thành chuỗi
xung ra chân PA0 theo nguyên tắc đã cho.
(Lưu ý: Bit MSB truyền đi trước)
Ví dụ: Trong thanh ghi R7 chứa 1001 0101 thì chuỗi xung phát có
dạng như hình

Nguyễn Trung Hiếu


Timer Interrupt to Generate Pulses
Write a program using Timer and interrupt to generate a 3-phase
pulse sequence of 50Hz frequency as shown in the figure. Assume
that use Internal RC 8MHz and bit CLKDIV=1.

PC3

PC4

PC5

Nguyễn Trung Hiếu


Timer Interrupt to Generate Pulses

Mode Normal
Choose Clock Selector: clkI/O / 8
→ CS[2:0] = 010
clkTimer = 1 MHz → 1 count = 1 μs

Nguyễn Trung Hiếu


Timer Interrupt to Generate Pulses
LDI R16,HIGH(-3334)
.ORG 0
STS OCR1AH,R16
RJMP MAIN
LDI R16,LOW(-3334)
.ORG $1A
STS OCR1AL,R16
RJMP ISR_T1_COMPA
.ORG $1C
LDI R16,HIGH(-6667)
RJMP ISR_T1_COMPB
STS OCR1BH,R16
.ORG $1E
LDI R16,LOW(-6667)
RJMP ISR_T1_OVF
STS OCR1BL,R16
.ORG $40
MAIN: … LDI R16,$00
LDI R16,HIGH(-10000) STS TCCR1A,R16
STS TCNT1H,R16 LDI R16,$02
LDI R16,LOW(-10000) STS TCCR1B,R16
LDI R16,
STS TCNT1L,R16
(1<<OCIE1A)|(1<<OCEI1B)|(1<<TOIE1)
LDI R16,HIGH(-3334) STS TIMSK1,R16
STS OCR1AH,R16 SEI
LDI R16,LOW(-3334) LOOP: RJMP LOOP
STS OCR1AL,R16 ….
Nguyễn Trung Hiếu
Practice Problem 1
Write a program using Timer and interrupt to generate a 2 pulses
sequence of 100Hz frequency as shown in the figure. Assume that
use Internal RC 8MHz and bit CLKDIV=1.

PA0

PA1

Nguyễn Trung Hiếu


Practice Problem 2
Write a program using Timer and interrupt to generate a 2 pulses
sequence of 100Hz frequency as shown in the figure. Assume that
use Internal RC 8MHz and bit CLKDIV=1.

Nguyễn Trung Hiếu


Practice Problem 2

Timer2 in mode CTC


TCNT2 counts from 0 to OCR2A

Timer2 changes to mode Normal


TCNT2 counts from revalue to $FF

Nguyễn Trung Hiếu


Outline
• What is an Interrupt?
• External Interrupt
• Timer Interrupt
• USART Interrupt

Nguyễn Trung Hiếu 72


Flag in UART
This interrupt needs to be ban after transmission !!!
UDRE: 1 – the transmit buffer is empty (transmit done)
0 – the transmit buffer is not empty (write to buffer)

TXC: 1 – transmission done (shift done and buffer empty)


0 – cleared by software (write 1 to this position)

RXC: 1 - there are unread data in the receive buffer


(reception done)
0 - the receive buffer is empty (read from buffer)

73
Character Output Using Interrupts
Assume a 10-byte string of 8-bit data is stored in SRAM from the location $100.
Write a program using interrupts to continually transmit this string to the USART0
(19200 baud, 1 stop bit, no parity).

Nguyễn Trung Hiếu


Character Output Using Interrupts
USART0_UDRE_ISR:
.ORG 0
PUSH R17
RJMP MAIN
IN R17,SREG
.ORG 0X002A
PUSH R17
RJMP USART0_UDRE_ISR
LD R17,X+
.ORG 0X40
STS UDR0,R17
RCALL INIT_USART0 CPI XL,$0A
LDI XH,HIGH($100)
BRNE EXIT_UDR
LDI XL,HIGH($100)
LDS R17,UCSR0B
SEI
CBR R17,(1<<UDRIE0)
HERE: RJMP HERE
STS UCSR0B,R17
EXIT_UDR:
POP R17
OUT SREG,R17
POP R17
RETI

Nguyễn Trung Hiếu


Character Output Using Interrupts
INIT_USART0:
LDI R16,(1<<TXEN0)|(1<<UDRIE) ;Enable Transmitter, UDRE interrupt
STS UCSR0B, R16
LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ;8-bit data
STS UCSR0C, R16 ;no parity, 1 stop bit
LDI R16,0x00
STS UBRR0H,R16
LDI R16,51 ;baud rate = 9600 and Fosc = 8 MHz
STS UBRR0L,R16
RET

Nguyễn Trung Hiếu


Outline
• What is an Interrupt?
• External Interrupt
• Timer Interrupt
• USART Interrupt
• Practical exercise

Nguyễn Trung Hiếu 77


Furnace Controller
Using interrupts, design a furnace controller that keeps a building at 20oC ± 1oC.
Temperature sensors are connected to INT0 and INT1 and provide HOT and COLD
signals. The furnace ON/OFF solenoid is connected to PA0.

HOT = 0 if T > 21oC


COLD = 0 if T < 19oC

PA0= 1 : Furnace ON
PA0 = 0 : Furnace OFF

Nguyễn Trung Hiếu


Intrusion Warning System
Design an intrusion warning system using interrupts that sounds a 400 Hz tone for
1 second (using loudspeaker connected to PA0) whenever a door sensor connected
INT0 makes a high-to-low transition.

Nguyễn Trung Hiếu


References

• I. Scott Mackenzie, The 8051 Microcontroller


• Các tài liệu trên Internet không trích dẫn hoặc không ghi tác
giả

Nguyễn Trung Hiếu

You might also like