Hoạt động ngắt trong vi điều khiển xảy ra khi xuất hiện sự kiện ngắt như: tràn timer, xuất hiện mức thấp hoặc cạnh xuống tại chân RB0, PORTB thay đổi giá trị, nhận/truyền 1 byte trong
Trang 1Bài 03
TIMERS & INTERRUPTS
Trang 2 Hoạt động timer trong vi điều khiển: gồm một nguồn cấp xung
clock, một bộ đếm nhị phân và một bit báo trạng thái tràn bộ
Trang 31 Timer 0: 8 bit
Trang 5 Các lệnh liên quan timer 0:
Trang 6 Ví dụ 01: cho tần số thạch anh là 4 MHz, tính thời gian tràn của timer 0
Trang 72 Timer 1: 16 bit
Trang 9 Các lệnh liên quan timer 1:
Trang 10 Ví dụ 01: cho tần số thạch anh là 4 MHz, tính thời gian tràn của timer 1
Trang 113 Timer 2: 8 bit
Trang 13 Các lệnh liên quan timer 2:
Setup_timer2(T2_DIV_BY_1,99,1)
Timer 2 báo tràn bô đếm sau 100 μS
Trang 14 Hoạt động ngắt trong vi điều khiển xảy ra khi xuất hiện sự kiện ngắt như: tràn timer, xuất hiện mức thấp (hoặc cạnh xuống) tại chân RB0, PORTB thay đổi giá trị, nhận/truyền 1 byte trong USART,…
II Interrupts (ngắt):
14
Trang 15 Hoạt động của một chương trình ứng dụng có sử dụng sự kiện ngắt
NỘI DUNG CHƯƠNG TRÌNH CHÍNH
CÓ SỬ DỤNG NGẮT (Gọi chương trình con)
Trang 16 Hoạt động của một chương trình ứng dụng có sử dụng sự kiện ngắt
NỘI DUNG CHƯƠNG TRÌNH CHÍNH
Trang 17 Ví dụ 01: Cho sơ đồ mạch
U2 PIC16F877A1
2 3 4 5 6 7
8 9 10
13 14
15 16 17 18
19 20 21
22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39
40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2
RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
RST
VDD
C6 33P
C2 4.7uF - 10uF
VDD
R23 270
VDD C11 33P
R21 10K
R22 10K
D2 LED
R1 10K
C3 1uF
Y 1 8M
VDD
D1 LED
R24 270 VDD
Trang 18Dùng ngắt timer 0 kiểm tra 2 phím nhấn, sử dụng:
Trang 19enable_interrupts(INT_RTCC);// cho phép ngắt timer 0
setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL);// cấu hình timer 0
while(1);
}
Trang 208 9 10
11 12
13 14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
d c
a
LED3 LED7S
7 6 4 2 1 9 10 5
3 8
a b c d e f g
Q3
A1013
LED4 LED7S
7 6 4 2 1 9 10 5
3 8
a b c d e f g
7 6 4 2 1 9 10 5
3 8
a b c d e f g
f d
f
Y 1 8M
7 6 4 2 1 9 10 5
3 8
a b c d e f g
20
Trang 21Yêu cầu 01: hiển thị chữ “HELP” trên 4 LED với thời gian delay 3 ms mỗi LED
Trang 22Yêu cầu 02: Dùng ngắt timer 1 để quét LED, thời gian delay mỗi led 3 ms Sử dụng:
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)
Trang 24If (pos ==0) {output_d(0xff);Output_b(0x91); output_low(PIN_D3);}
If (pos ==1) {output_d(0xff);Output_b(0x61); output_low(PIN_D2);}
If (pos ==2) {output_d(0xff);Output_b(0xe3); output_low(PIN_D1);}
If (pos ==3) {output_d(0xff);Output_b(0x31); output_low(PIN_D0);} pos++;
Trang 25BÀI TẬP
Cho sơ đồ mạch:
Q2 A1013
LMP
R1 10K
1
2 3 4 5 6 7
8 9 10
1 1
13 14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
R22 10K
LMP
Trang 26BÀI TẬP
1 Dùng ngắt timer 1 để kiểm tra phím, thời gian quét phím 200 ms Sử dụng:
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)Viết chương trình thực hiện: hiển thị chữ “Set value:” trên dòng 1 tại (x,y) =(5,1) và hiển thị biến set_val (khởi động = 0) trên dòng 2 tại (x,y) = (8,2); và nếu:
Nội dung thay đổi của set_val được cập nhật tức thời trên dòng 2 LCDtại vị trí (x,y) = (8,2)
2 Dùng ngắt timer 0 kiểm tra 2 phím nhấn, thời gian quét phím 200 ms, sử dụng:Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL)
Viết chương trình hiển thị chữ “DONG HO” tại (5,1) và hiển thịgiờ:phút: giây (bắt đầu từ 00:00:00) tại (4,2) Dùng SW1 để chỉnh giờ (0 - 23) và
Trang 27VDD
D3
a d
7 6 4 2 1 9 10 5
3 8
a b c d e f g
g
LED2 LED7S
7 6 4 2 1 9 10 5
3 8
a b c d e f g
D3
f p
7 6 4 2 1 9 10 5
3 8
a b c d e f g
1
2 3 4 5 6 7
8 9 10
11 12
13 14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
7 6 4 2 1 9 10 5
3 8
a b c d e f g
g
C2 4.7uF - 10uF
Trang 28BÀI TẬP
3 Dùng ngắt timer 0 để quét led, thời gian delay mỗi led là 2 ms Sử dụng:
Setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL)Viết chương trình thực hiện: hiển thị chữ “StoP” trên 4 LED Tính thời gian ngắt timer 0
4 Dùng ngắt timer 0 để quét led, thời gian delay mỗi led là 2 ms Sử dụng:
Setup_timer_0(RTCC_DIV_64|RTCC_INTERNAL)
5 Dùng ngắt timer 1 để quét led, thời gian delay mỗi led là 3 ms Sử dụng:
Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)
50 lần đồng thời hiển thị số lần trên LED1 đến LED4 theo dạng: “Ct.XX”
28
Trang 297 6 4 2 1 9 10 5
3 8
a b c d e f g
7 6 4 2 1 9 10 5
3 8
a b c d e f g
8 9 10
11 12
13 14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
7 6 4 2 1 9 10 5
3 8
a b c d e f g
g
LED2 LED7S
7 6 4 2 1 9 10 5
3 8
a b c d e f g
f
R22 10K
Trang 30BÀI TẬP
6 Dùng ngắt timer 0 để quét led, thời gian delay mỗi led là 2 ms Sử dụng:
Setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL)Viết chương trình thực hiện hiển thị số đếm trên 4 LED, giá trị ban đầu là 0, và:
7*
thời gian delay 400 ms
8*
tăng/giảm nhanh với thời gian delay 100 ms (bình thường phím tăng giảm với thời gian 400 ms)
30
Trang 31BÀI TẬP
Cho sơ đồ mạch:
R3
R 0
Y1 8M
C2 4.7uF - 10uF
6
R1 10K
R5
R C
VDD
R16 10K
LED1 LED7S
7 6 4 2 1 9 10 5
3 8
a b c d e f g
1
2 3 4 5 6 7
8 9 10
11 12
13 14
15 16 17 18
19 20 21 22 23
24 25 26
27 28 29 30
33 34 35 36 37 38 39 40
MCLR/Vpp
RA0/AN0 RA1/AN1 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
F
Trang 32BÀI TẬP
9 Viết chương trình đọc bàn phím HEX và hiển thị giá trị HEX trên led 7 đoạn
Trang 33a LED1 LED7S
7 4 1 10 5
3 8
a c d f g
VDD
S2
Y 1 8M
Q1
c
R26 270
e
R1 10K
p
LED4 LED7S
7 4 1 10 5
3 8
a c d f g
R7
R
R14 10K
c
R16 10K
g
F
b
LED2 LED7S
7 4 1 10 5
3 8
a c d f g
p C C S4
6
f
1 2 4 5 7
8 10
11 12
13 14 15 17
19 21 23
25
27 28 30
33 35 37 39 40
MCLR/Vpp
RA0/AN0 RA2/AN2/Vref - RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS
RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
RD0/PSP0 RD2/PSP2 RD3/PSP3 RC4/SDA
RC5/SDO RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD6/PSP6 RD7/PSP7
d
R13 10K
7 4 1 10 5
3 8
a c d f g
p C C g
R8
100X8
R2
R S6
R6
R
S2
R27 270
p
Q4
A1013 S5
S7
5
c
D12 LED
p S8
R10 4K7
Trang 34BÀI TẬP
10 Cho phép nhập vào các số 0000 đến 9999 từ bàn phím và hiển thị trên 4 led
7 đoạn Nếu số nhập vào > 100, led D11 sáng; số > 500: cả 2 led D11 và D12 sáng Chọn nút “F” là nút xóa (CLEAR) số nhập vào
Quét phím và led 7 đoạn dùng ngắt timer1Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)