Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

Bài tập ĐIỀU KHIỂN INTRRUPT (ngắt ngoài_INT và Ngắt thay đổi PORTB_ RB) có lời

giải (cho các ví dụ)


Lý thuyết
Các thanh ghi liên quan: tự bổ sung
-
-
-
-
-
- Các thanh ghi cho PORTB liên quan đến điện tở kéo lên, ngắt INT hoặc RB.

Cấu hình và kích hoạt tính năng ngắt ngoài


Bước 1: Chọn cạnh ngắt (cạnh xuống hoặc cạnh lên)
 INTEDG = 0/1
Bước 2: Xóa cờ báo ngắt ngoài
 INTF = 0
Bước 3: Cho phép ngắt toàn cục hoạt động
 GIE = 1
Bước 4: Cho phép ngắt ngoài (cục bộ) hoạt động
 INTE = 1

Cấu hình và kích hoạt tính năng ngắt Port B


Bước 1: Xóa cờ báo ngắt Port B
 RBIF = 0
Bước 2: Cho phép ngắt toàn cục hoạt động
 GIE = 1
Bước 3: Cho phép ngắt Port B (cục bộ) hoạt động
 RBIE = 1
Bước 4: Cho phép ngắt Port B được thực hiện tại chân nào của Port B(RB0–RB7) hoạt động
 IOCBx = 1
• Trong đó x = 0 – 7, x là số thứ tự của các chân được chọn trong Port B.
Bước 5: Cập nhật trạng thái của Port B (đọc từ Port B hoặc ghi vào Port B)
 PORTB hoặc PORTB = ?

Ví dụ 1: Dựa vào sơ đồ, viết chương trình điều khiển như sau:
- LED D5 sáng/tắt liên tục với thời gian thay đổi trạng thái là 2s.

1
- LED D4 chỉ thay đổi trạng thái (sáng/tắt) sau mỗi lần nhấn-nhả SW4. Sử dụng phương pháp
Polling để xác định trạng thái SW4.
Sơ đồ nguyên lý

Hướng dẫn Chương trình (XC8):


Nguyên lý hoạt động: sử dụng phương pháp void main (void)
Polling (không dùng ngắt) kiểm soát nút nhấn {
Các thanh ghi: ANSEL = ANSELH = 0x00;
Lưu đồ giải thuật TRISE1 = TRISE2 = 0;
TRISB0 = 1;
nRBPU = 0; WPUB0 = 1;
while (1)
{
RE2 = 1;
__delay_ms (2000);
if (RB0 == 0)
{
while (RB0 == 0);
RE1 = ! RE1;
}
RE2 = 0;
__delay_ms (2000);
if (RB0 == 0)
{
while (RB0 == 0);
RE1 = ! RE1;
}
}
}

Ví dụ 2: Dựa vào sơ đồ, viết chương trình điều khiển như sau:
- LED D5 sáng/tắt liên tục với thời gian thay đổi trạng thái là 2s.

2
- LED D4 chỉ thay đổi trạng thái (sáng/tắt) sau mỗi lần nhấn-nhả SW4. Phải sử dụng tính năng ngắt
ngoài để xác định trạng thái SW4.
Sơ đồ nguyên lý

Hướng dẫn
Nguyên lý hoạt động: sử dụng
ngắt ngoài (INT) trên chân RB0 để kiểm soát nút nhấn SW4
Các thanh ghi:
Lưu đồ giải thuật có hai Chương trình (XC8):
Chương trình chính và CTcon cho ngắt void main (void)
{
ANSEL = ANSELH = 0x00;
TRISE1 = TRISE2 = 0;
TRISB0 = 1;
nRBPU = 0; WPUB0 = 1;

INTEDG = 1;
INTF = 0;
GIE = 1; INTE = 1;
while (1)
{
RE2 = 1; __ delay_ms (2000);
RE2 = 0;
__delay_ms (2000);
}
}
void interrupt ISR (void) // đặt trước chương trình main
{
INTF = 0;
RE1 = ! RE1;
}

Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển như sau:
-LED D5 sáng/tắt liên tục với thời gian thay đổi trạng thái là 2s.
-LED D4 chỉ thay đổi trạng thái (sáng/tắt) sau mỗi lần nhấn-nhả SW4. Phải sử dụng tính năng
ngắt Port B để xác định trạng thái SW4.
Hướng dẫn

3
Nguyên lý hoạt động: sử dụng ngắt PORTB (RB) trên chân RB0 để kiểm soát nút nhấn SW4
Các thanh ghi:
Lưu đồ giải thuật có hai Chương trình (XC8):
Chương trình chính và CTcon cho ngắt portB void main (void)
{
ANSEL = ANSELH = 0x00;
TRISE1 = TRISE2 = 0;
TRISB0 = 1;
nRBPU = 0; WPUB0 = 1;

RBIF = 0;
GIE = 1; RBIE = 1;
OCWB0=1;
PORTB;
while (1)
{
RE2 = 1;
__ delay_ms (2000);
RE2 = 0; __delay_ms (2000);
}
}
void interrupt ISR (void) // đặt trước chương trình main
{
PORTB;
RBIF = 0;
If(RB0==1) RE1 = ! RE1;
}

Và xem các ví dụ khác trong bài giảng và giáo trình

4
BÀI TẬP ỨNG DỤNG NGĂT
Bài tập 1: Dựa vào sơ đồ mô phỏng, vẽ lưu đồ giải thuật và viết chương trình điều khiển
8 LED sau mỗi lần nhấn – nhả của nút nhấn bằng cách sử dụng tính năng ngắt như sau:
- Ban đầu: LED tắt hết
- SW ON: LED sáng đuổi từ D1 – D8 liên tục với tDELAY = 0,5s
- SW OFF: LED sáng tắt liên tục với tDELAY = 0,1s

Bài tập 2: Dựa vào sơ đồ mô phỏng, vẽ lưu đồ giải thuật và viết chương trình điều khiển
LED sau mỗi lần nhấn – nhả của nút nhấn bằng cách sử dụng tính năng ngắt như sau:
- Ban đầu: LED hiển thị số 0
- SW UP: LED tăng (+1) số đếm (giới hạn số đếm: 0 – 9)
- SW DOWN: LED giãm (-1) số đếm (giới hạn số đếm: 0 – 9)

Bài tập 3: Dựa vào sơ đồ mô phỏng, vẽ lưu đồ giải thuật và viết chương trình điều khiển
LED sau mỗi lần nhấn – nhả của nút nhấn bằng cách sử dụng tính năng ngắt như sau:
- Ban đầu: LED hiển thị số 00
- SW UP: LED tăng dần (+1) liên tục số đếm hiện tại (giới hạn số đếm: 0 – 23)
- SW DOWN: LED giãm dần (-1) liên tục số đếm hiện tại (giới hạn số đếm: 0 – 23)

You might also like