You are on page 1of 15

Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển

Khoa Điện tử - Viễn thông

BÀI 2. TIMER VÀ NGẮT


1. Mục đích
Qua bài học sinh viên có thể đạt được các kiến thức sau:
- Hiểu biết về cấu trúc của các bộ Timer trong PIC24F và các chế độ hoạt động của
Timer.
- Hiểu về cơ chế hoạt động của ngắt trong PIC24F.
- Xây dựng các ứng dụng cơ bản sử dụng Timer và ngắt.

2. Tóm tắt nội dung lý thuyết


2.1. Giới thiệu
Vi điều khiển PIC24FJ128GA010 gồm năm bộ Timer: Timer1, Timer2, Timer3, Timer4
và Timer5. Mỗi Timer là một timer/counter 16-bits gồm nhiều thanh ghi có khả năng đọc và
ghi. Các thanh ghi của Timer là:
• TMRx: Thanh ghi đếm Timer 16 bit.
• PRx: Thanh ghi chu kì Timer 16 bit.
• TxCON: Thanh ghi điều khiển Timer 16 bit.
Từng Timer có các bits điều khiển ngắt riêng biệt:
• Interrupt Enable Control bit (TxIE): bit điều khiển cho phép ngắt hoạt động.
• Interrupt Flag Status bit (TxIF): bit cờ trạng thái của ngắt.
• Interrupt Proority Control bits (TxIP<2:0>): bit điều khiển ngắt.
2.2. Phân loại
Năm bộ Timer của PIC24FJ128GA010 được chia thành ba loại: loại A, loại B và loại
C.

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 1
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

2.2.1. Timer Loại A

Hình 2.1. Cấu trúc của Timer loại A.

Timer1 chính là Timer thuộc loại A. Hình 2.1 thể hiện cấu trúc của Timer loại A. Tính
năng độc đáo của Timer loại A cho phép nó được sử dụng như một timekeeping hoặc như
một clock hệ thống phụ (secondary system clock source).
Thanh ghi điều khiển TxCON của Timer loại A:

Hình 2.2. Thanh ghi TxCON của Timer loại A.

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 2
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

Bảng 2.1. Bảng mô tả thanh ghi TxCON của Timer A.

Bit Tên Chức năng


15 TON: Timerx On bit 1 = Timer bắt đầu hoạt động
0 = Timer ngừng hoạt động.
13 TSIDL: Stop in Idle Mode bit 1 = Timer ngừng hoạt động khi thiết bị ở chế độ Idle.
0 = Timer tiếp tục hoạt động ở chế độ Idle.
6 TGATE: Timerx Gated Time Khi TCS = 1: bit nay bị bỏ qua.
Accumulation Enable bit Khi TCS = 0:
▪ 1 = cho phép gated time accumulation.
▪ 0 = không cho phép gated time accumulation.
5-4 TCKPS<1:0> Timerx Input 11 = 1:256 prescale value
Clock Prescale Selecct bits. 10 = 1:64 prescale value
01 = 1:8 prescale value
00 = 1:1 prescale value
2 TSYNC: Timerx Enternal Khi TCS = 0: Bit này bị bỏ qua.
Clock Input Synchronization Khi TCS = 1:
Select bit. ▪ 1 = Đồng bộ với clock bên ngoài vào1.
▪ 0 = Không đồng bộ với clock bên ngoài cấp.
1 TCS: Timerx Clock Source 1 = Clock ngoài từ chân TxCK.
Select bit 0 = Clock trong (Fosc/2).
2.2.2. Timer loại B

Hình 2.3. Cấu trúc của timer loại B.

Timer2 và Timer4 là Timer thuộc loại B. Hình 2.3 thể hiện cấu trúc bên trong của
Timer loại B. Timer loại B có thể ghép với Timer loại C tạo thành Timer 32 bits.
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 3
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

Thanh ghi điều khiển TxCON của Timer loại B.

Hình 2.4. Thanh ghi TxCON của Timer loại B.

Bảng 2.2. Bảng mô tả thanh ghi TxCON của Timer loại B.

Bit Tên Chức năng


15 TON: Timerx On bit Khi T32 = 1 (ghép với Timer loại C để tạo thành
Timer 32 bits).
▪ 1 = Bắt đầu hoạt động cặp Timer
TMRx:TMRy.
▪ 0 = Ngừng hoạt động cặp Timer
TMRx:TMRy.
Khi T32 = 0 (ở chế độ Timer 16 bits)
▪ 1 = Bắt đầu hoạt động Timer 16 bits.
▪ 0 = Ngừng hoạt động Timer 16 bits.
13 TSIDL: Stop in Idle Mode bit 1 = Timer ngừng hoạt động khi thiết bị ở chế độ
Idle.
0 = Timer tiếp tục hoạt động ở chế độ Idle.
6 TGATE: Timerx Gated Khi TCS = 1: bit này bị bỏ qua.
Timer Accumulation Enable Khi TCS = 0:
bit ▪ 1 = Cho phép gated time accumulation.
▪ 0 = Không cho phép gated time
accumulation.
5-4 TCKPS<1:0>: Timerx Input 11 = 1:256 prescale value
Clock Prescale Select bits 10 = 1:64 prescale value
01 = 1:8 prescale value
00 = 1:1 prescale value
3 T32: 32-Bit Timerx Mode 1 = TMRx và TMRy được cấu hình như Timer 32
Select bit bits.
0 = TMRx va TMRy được cấu hình như các Timer
16 bits độc lập.
1 TCS: Timerx Clock Source 1 = Clock ngoài từ chân TxCK.
Select bit 0 = Clock trong (FOSC/2).

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 4
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

2.2.3. Timer loại C

Hình 2.5. Cấu trúc của Timer loại C.

Timer3 và Timer5 là Timer loại C. Timer loại C có thể ghép với Timer loại B tạo thành
Timer 32 bits. Ngoài ra, Timer loại C còn có thể tạo trigger cho quá trình ADC.
Thanh ghi điều khiển TyCON của Timer loại C:

Hình 2.6. Thanh ghi TyCON của Timer loại C.

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 5
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

Bảng 2.3.Bảng mô tả thanh ghi TyCON của Timer C.

Bit Tên Chức năng


15 TON: Timery On bit 1 = Timer bắt đầu hoạt động.
0 = Timer ngừng hoạt động.
13 TSIDL: Stop in Idle Mode bit 1 = Timer ngừng hoạt động khi thiết bị ở chế độ
Idle.
0 = Timer tiếp tục hoạt động ở chế độ Idle.
6 TGATE: Timerx Gated Time Khi TCS = 1: bit này bị bỏ qua.
Accumulation Enable bit. Khi TCS = 0:
▪ 1 = Cho phép gated time accumulation.
▪ 0 = Không cho phép gated time
accumulation.
5-4 TCKSP<1:0>: Timerx Input 11 = 1:256 prescale value.
Clock Prescale Select bits 10 = 1:64 prescale value.
01 = 1:8 prescale value.
00 = 1:1 prescale value.
1 TCS: Timerx Clock 1 = Clock ngoài từ chân TxCK.
Source Select bit 0 = Clock trong (FOSC/2).
Lưu ý: Khi chế độ 32 bits được kích hoạt (TxCON<3> = 1), các bits này không tác
động đến hoạt động của Timer; tất cả chức năng được thiết lập thông qua các bit trong thanh
ghi TxCON của các Timer loại B.
2.3. Các chế độ hoạt động
Mỗi bộ Timer có thể hoạt động theo một trong các chế độ sau đây:
▪ Timer
▪ Bộ đếm đồng bộ (Synchronous counter)
▪ Gated timer
▪ Bộ đếm không đồng bộ (Asynchrous counter)
Chế độ hoạt động trên được cấu hình thông qua các bit sau:
▪ TCS (TxCON<1>): Timer Clock Sourc Control bit.
▪ TSYNC (TxCON<2>): Timer Synchronization Control bit.
▪ TGATE (TxCON<6>): Timer Gate Control bit.
2.3.1. Chế độ Timer (Timer mode)
a. Hoạt động
Tất cả các loại Timer đều có thể hoạt động ở chế độ định thời. Trong chế độ này, xung
ngõ vào cho bộ đếm được cung cấp bởi xung của hệ thống (Fosc/2). Khi hoạt động, bộ đếm
sẽ tăng một lần trong n chu kỳ lệnh nếu prescale thiết lập là 1:n.
Công thức tính thời gian định thời: 𝑇𝑑𝑒𝑙𝑎𝑦 = (𝑃𝑅𝑥 × 𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒) ÷ 𝐹(𝐻𝑧)
Trong đó Tdelay: thời gian định thời; PRx là thanh ghi chu kì và F là tần số của bộ
Timer đang dùng, Ví dụ:
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 6
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

Tdelay = 1s với Prescale = 64 và F = Fosc/2 = 4 Mhz thì PRx= 62500.


b. Thiết lập
Chế độ định thời được lựa chọn bằng cách xóa bit TCS (TxCON<1>).
c. Chương trình mẫu
/ * Ví dụ sau sẽ cho phép Timer1 sinh ra ngắt, nạp thanh ghi chu kì cho Timer1 và bắt đầu Timer1.
Khi Timer1 đếm đến giá trị lưu trong thanh ghi chu kì, ngắt sẽ được sinh ra.
Chu trình ngắt (ISR) phải xóa cờ ngắt.
*/
void Timer1_Init(void){
T1CON = 0x00;
/ / Dừng Timer1 và reset lại thanh ghi điều khiển.
TMR1 = 0x00;
/ / Xoá nội dung của Timer1
PR1 = 0xFFFF;
/ / Thiết lập thanh ghi chu kì với giá trị 0xFFFF
IPC0bits.T1IP = 0x01;
/ / Thiết lập ngắt cho Timer1 với độ ưu tiên là 1
IFS0bits.T1IF = 0;
/ / Xóa cờ ngắt của Timer1
IEC0bits.T1IE = 1;
/ / Cho phép Timer1 sinh ra ngắt
T1CONbits.TON = 1;
/ / Bắt đầu Timer1
}
/* Timer1 ISR * /
void __ attribute__ ((__interrupt__, auto_psv)) _T1Interrupt (void){
/* …* /
IFS0bits.T1IF = 0;
/ / Xóa cờ ngắt
}

2.3.2. Chế độ đếm đồng bộ sử dụng clock ngoài (Synchronous Counter


Mode Using External Clock Input)
a. Hoạt động
Clock của timer được cấp từ bên ngoài và bộ đếm trong timer sẽ tăng một lần tại mỗi
cạnh lên của pin TxCK. Clock này được đồng bộ với nguồn clock của hệ thống.
b. Thiếp lập
- Bit TCS được thiết lập bằng 1.
- Đối với Timer loại A: bit TSYNC phải được thiết lập bằng 1.
- Đối vớiTimer loại B và C: clock ngoài luôn được đồng bộ.
c. Chương trình mẫu
/ * Ví dụ sau sẽ cho phép Timer1 sinh ra ngắt, nạp thanh ghi chu kì cho Timer1 và bắt đầu Timer1 với
xung clock ngoài được thiết lập prescaler là 1:08
Khi Timer1 đếm đến giá trị lưu trong thanh ghi chu kì, ngắt sẽ được sinh ra.
Chu trình ngắt (ISR) phải xóa cờ ngắt.
*/
void Timer1_Init(void){
T1CON = 0x00; / / Dừng Timer1 và reset lại thanh ghi điều khiển.
TMR1 = 0x00; / / Xoá nội dung của Timer1
PR1 = 0x8CFF; / / Thiết lập thanh ghi chu kì với giá trị 0x8CFF
IPC0bits.T1IP = 0x01; / / Thiết lập ngắt cho Timer1 với độ ưu tiên là 1
IFS0bits.T1IF = 0; / / Xóa cờ ngắt của Timer1

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 7
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

IEC0bits.T1IE = 1; / / Cho phép Timer1 sinh ra ngắt


T1CON = 0x8016; / / Bắt đầu Timer1 với thiết lập prescaler là 1:08 và
/ / nguồn clock từ bên ngoài được đồng bộ
}/
* Timer1 ISR * /
void __ attribute__ ((__interrupt__, auto_psv)) _T1Interrupt (void){
/* … * /
IFS0bits.T1IF = 0;
/ / Xóa cờ ngắt
}

2.3.3. Chế độ đếm bất đồng bộ sử dụng clock ngoài (Asynchronous


Counter Mode Using External Clock Input)
a. Hoạt động
Timer loại A có khả năng hoạt động ở chế độ đếm không đồng bộ, sử dụng một nguồn
clock bên ngoài kết nối với pin TxCK. Clock này không được đồng bộ với nguồn clock của
hệ thống.
b. Thiết lập
- Bit TCS được thiết lập bằng 1.
- Bit TSYNC phải được thiết lập bằng 0.
c. Chương trình mẫu
/ * Ví dụ sau sẽ cho phép Timer1 sinh ra ngắt, nạp thanh ghi chu kì cho Timer1 và bắt đầu Timer1 với
xung clock bất đồng bộ bên ngoài với thiết lập prescaler là 1:08
Khi Timer1 đếm đến giá trị lưu trong thanh ghi chu kì, ngắt sẽ được sinh ra.
Chu trình ngắt (ISR) phải xóa cờ ngắt.
*/
void Timer1_Init(void){
/ / Dừng Timer1 và reset lại thanh ghi điều khiển.
T1CON = 0x00;
/ / Xoá nội dung của Timer1
TMR1 = 0x00;
/ / Thiết lập thanh ghi chu kì với giá trị 0x8CFF
PR1 = 0x8CFF;
/ / Thiết lập ngắt cho Timer1 với độ ưu tiên là 1
IPC0bits.T1IP = 0x01;
/ / Xóa cờ ngắt của Timer1
IFS0bits.T1IF = 0;
/ / Cho phép Timer1 sinh ra ngắt
IEC0bits.T1IE = 1;
/ / Bắt đầu Timer1 với thiết lập prescaler là 1:08 và
T1CON = 0x8012;
/ / nguồn clock từ bên ngoài không được đồng bộ
}
/* Timer1 ISR * /
void __ attribute__ ((__interrupt__, auto_psv)) _T1Interrupt (void){
/* … * /
IFS0bits.T1IF = 0; / / Xóa cờ ngắt
}
2.3.4. Chế độ Gated Time (Gated Time Accumulation Mode)
a. Hoạt động
Trong chế độ này, Timer được cung cấp xung clock hệ thống (Fosc/2) và đếm lên khi
chân TxCK ở mức cao. Timer sẽ tiếp tục đếm cho đến khi chân TxCK xuống mức thấp

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 8
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

hoặc Timer đạt đến giá trị lưu trong thanh ghi chu kì. Khi chân TxCK xuống mức thấp,
ngắt có thể được sinh ra.
b. Thiết lập
Bit TCS được thiết lập bằng 0.
Bit TGATE (TxCON<6>) được thiết lập bằng 1.
c. Chương trình mẫu
/ * Ví dụ sau sẽ cho phép Timer2 sinh ra ngắt, nạp thanh ghi chu kì cho Timer2 và bắt đầu Timer2 với
xung clock hệ thống và chế độ gated time ở pin TxCK
Khi pin TxCK chuyển từ 1 xuống 0, ngắt sẽ được sinh ra.
Chu trình ngắt (ISR) phải xóa cờ ngắt.
*/
void Timer2_Init(void){
T2CON = 0x00;
/ / Dừng Timer2 và reset lại thanh ghi điều khiển.
TMR2 = 0x00;
/ / Xoá nội dung của Timer2
PR2 = 0xFFFF;
/ / Thiết lập thanh ghi chu kì với giá trị 0xFFFF
IPC1bits.T2IP = 0x01;
/ / Thiết lập ngắt cho Timer2 với độ ưu tiên là 1
IFS0bits.T2IF = 0;
/ / Xóa cờ ngắt của Timer2
IEC0bits.T2IE = 1;
/ / Cho phép Timer2 sinh ra ngắt
T2CONbits.TGATE = 1;
/ / Chế độ gated time
T2CONbits.TON = 1;
/ / Bắt đầu Timer2
}
/* Timer2 ISR * /
void __ attribute__ ((__interrupt__, auto_psv)) _T2Interrupt (void){
/* … * /
IFS0bits.T2IF = 0; / / Xóa cờ ngắt
}
2.4. Giới thiệu tóm tắt ngắt trong PIC24F
Ngắt trong PIC24 là một sự kiên xảy ra bên ngoài hoặc bên trong mà có thể tác động
nhanh đên CPU, làm cho CPU có thể ngưng công việc hiện tại và thực hiện công việc xử lý
sự kiện ngắt. PIC24 cho phép 118 nguồn ngắt khác nhau, mỗi nguồn ngắt được định nghĩa
duy nhất một đoạn code nhất định để phụ vụ gọi là “Interrupt Service Routine - ISR” và được
gắn kết trực tiếp thông qua một con trỏ hay một vector. Các ngắt có thể hoàn toàn không đồng
bộ với luồng thực thi của chương trình chính. Chúng có thể được kích hoạt tại bất kỳ thời
điểm nào và theo một trật tự không thể đoán trước. Đáp ứng nhanh với các ngắt là điều cần
thiết để cho phép phản ứng kịp thời với sự kiện kích hoạt và nhanh chóng quay trở lại luồng
thực hiện chương trình chính.
PIC24 có các ngắt bên ngoài như sau:
▪ 5 ngắt thông qua chân thiết bị ngoại vi.
▪ 22 ngắt dùng cho chân ngoại vi được kết nối với module Change Notification.
▪ 5 ngắt dùng cho module Capture modules.
▪ 5 ngắt dùng cho module Compare modules.
▪ 2 ngắt dùng cho UART.
▪ 4 ngắt dùng cho giao tiếp SPI và I2C.
▪ 1 ngắt dùng cho Parallel Master Port.
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 9
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

Ngắt nội có các loại như sau:


▪ 5 ngắt dùng cho Timer 16 bit.
▪ 1 ngắt dùng cho ADC.
▪ 1 ngắt dùng cho Comparators module.
▪ 1 ngắt dùng cho Real-time Clock và Calender.
▪ 1 ngắt dùng cho CRC generator.
Bảng 7.2 trong PIC24F family datasheet định nghĩa chi tiết các vector ngắt.
Các nguồn ngắt trong PIC24 có thể được cấu hình có các độ ưu tiên từ 0 đến 7, trong đó
độ ưu tiên càng cao thì sẽ được ưu tiên xử lý trước.

Hình 2.7. Các thanh ghi dùng trong cấu hình Interrupt.

Hình 2.7 thể hiện bảng các thanh ghi dùng trong cấu hình Interrupt.

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 10
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

2.4.1. Thanh ghi INTCON1

Hình 2.8. Thanh ghi INTCON1.

Bit Tên Chức năng


15 NSTDIS: Interrupt Nesting 1 = Cho phép interrupt nesting.
Disable bit 0 = Không cho phép interrupt nesting.
4 MATHERR: Arithmetic Error 1 = Overflow trap đã xảy ra.
Trap Status bit 0 = Overflow trap chưa xảy ra.
3 ADDRERR: Address Error 1 = Lỗi địa chỉ trap đã xảy ra.
Trap Status bit 0 = Lỗi địa chỉ chưa xảy ra.
2 STKERR: Stack Error Trap 1 = Lỗi stack đã xảy ra.
Status bit 0 = Lỗi stack chưa xảy ra.
1 OSCFAIL: Oscillator Failure 1 = Lỗi bộ dao động đã xảy ra.
Trap Status bit 0 = Lỗi bộ dao động chưa xảy ra.
2.4.2. Thanh ghi INTCON2

Hình 2.9. Thanh ghi INTCON2.

Bit Tên Chức năng


15 ALTIVT: Enable Alternate 1 = Sử dụng bảng vector thay thế.
Interrupt Vector Table bit 0 = Sử dụng bảng vector chuẩn (mặc định).
14 DISI: DISI Instruction Status 1 = Kích hoạt câu lệnh DISI.
bit 0 = Không kích hoạt câu lệnh DISI.
4 INT4EP: External Interrupt 4 1 = Interrupt khi có cạnh xuống.
Edge Detect Polarity Select bit 0 = Interrupt khi có cạnh lên.
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 11
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

3 INT3EP: External Interrupt 3 1 = Interrupt khi có cạnh xuống.


Edge Detect Polarity Select bit 0 = Interrupt khi có cạnh lên.
2 INT2EP: External Interrupt 2 1 = Interrupt khi có cạnh xuống.
Edge Detect Polarity Select bit 0 = Interrupt khi có cạnh lên.
1 INT1EP: External Interrupt 1 1 = Interrupt khi có cạnh xuống.
Edge Detect Polarity Select bit 0 = Interrupt khi có cạnh lên.
0 INT0EP: External Interrupt 0 1 = Interrupt khi có cạnh xuống.
Edge Detect Polarity Select bit 0 = Interrupt khi có cạnh lên.
2.4.3. Thanh ghi cờ ngắt IFSx
Cho biết trạng thái của cờ ngắt, nếu bit trong thanh ghi bằng “1” thì ngắt xảy ra, nếu
bằng “0” thì ngắt chưa xảy ra.
2.4.4. Thanh ghi cho phép ngắt IECx
Cho phép ngắt nếu bit là “1”, ngược lại không cho phép ngắt khi bit là “0” .
2.4.5. Thanh ghi độ ưu tiên ngắt IPCx
Cấu hình độ ưu tiên cho từng nguồn ngắt tương ứng với bảng thanh ghi trong hình
2.7.
2.5. Ngắt Timer
Timer 16 bit có khả năng sinh ra ngắt (bit TxIF set lên 1) nếu được cho phép và
một trong những sự kiện:
▪ Bộ đếm đạt một giá trị được thiết lập trong thanh ghi chu kì (PRx) và timer không
hoạt động trong chế độ Gated Timer.
▪ Có một cạnh xuống xảy ra tại chân TxCK khi timer hoạt động trong chế độ
Gated timer.
Cấu hình ngắt:
▪ Bit TxIF phải được xóa bởi phần mềm.
▪ Để cho phép Timer sinh ra ngắt, bit Timer Interrupt Enable (TxIE) phải được
bật lên 1 đồng thời giá trị ưu tiên ngắt (được thiết lập qua các bit TxIP<2:0>)
phải khác 0.
Hình 2.10 thể hiện sự kiện tạo ra ngắt Timer.

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 12
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

Hình 2.10. Thể hiện sự kiện tạo ra ngắt Timer.

3. Nội dung thực hành


Tiến hành tạo Project cho PIC24FJ128GA010 và đặt tên là Lab2 rồi lưu ở đường dẫn
D:\VDK\Lab2.
Thêm đoạn code bên dưới vào file main.c
#include <p24fj128ga010.h>
int on = 0;
void Timer1_Init(int timeDelay){
T1CON = 0x00;
TMR1 = 0x00;
PR1 = timeDelay;
IPC0bits.T1IP = 0x01;
IFS0bits.T1IF = 0;
IEC0bits.T1IE = 1;
T1CON = 0x8020;

void _ISR _T1Interrupt(void)


{
if(on == 1){
PORTA = 0x0;
on = 0;
}
else{
PORTA = 0xff;
on = 1;
}
IFS0bits.T1IF = 0;
}

int main() {
TRISA = 0;
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 13
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

PORTA = 0;
Timer1_Init(62500);
while (1);
return 0;
}
Lưu ý: để timer có thể chạy đúng theo yêu cầu, sinh viên cần thiết lập dao động trên
MPLAB như hình 2.8 bên dưới.

Hình 2.11. Thiết lập cấu hình bit.

4. Bài tập
4.1. Bài tập chuẩn bị ở nhà
1. Giải thích quy trình làm việc của Timer loại dựa trên hình 2.1.
2. Nếu muốn định thời ở khoảng thời gian 500 ms giây và 100 ms giây thì PRx sẽ
bằng bao nhiêu. Cho F = 4 Mhz và Prescale tự chọn.
Viết code C tương ứng.
3. Dựa vào file PIC24FJ128GA010 Family Data Sheet, cho biết ngắt Input Change
Notification là gì? Dựa vào file Explorer 16 Development Board User’s Guide cho
biết 2 nút nhấn S3 và S4 được kết nối với PIC24 bằng PORT gì và chân nào?
4.2. Bài tập trên lớp
1. Lập trình để hệ thống đếm lên sau 500 ms sử dụng Timer 2 ở chế độ định thời,
xuất kết quả ra led.
2. Lập trình để hệ thống thỏa mãn yêu cầu sau: Khi nhấn S3 1 lần thì LED7 chớp tốc
độ 1s, nhấn 2 lần thì chớp tốc độ s, …, nhấn 8 lần thì chớp tốc độ s, nếu nhấn 9 lần
thì quay lại trạng thái ban đầu. Lưu ý sử dụng ngắt ngoài cho SW. và ngắt timer.
3. Lập trình để hệ thống thỏa mã yêu cầu sau: Khi nhất S3 thì mạch đếm lên sau mỗi
500 ms, khi nhất S4 thì mạch đếm xuống sau mỗi 500 ms. Lưu ý sử dụng ngắt
ngoài cho SW và ngắt timer.
Gợi ý bài 2 và 3: Sử dụng ngắt ngoài Input Change Notification cho SW3 và SW4
sử dụng hàm khởi tạo và phục vụ ngắt như đoạn code bên dưới:
// CN – Change notification
void Interrupt_Init(){
TRISA = 0; // PORTA là output
TRISDbits.TRISD6 = 1; // Chân RD6 là input
TRISDbits.TRISD13 = 1; // Chân RD13 là input
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 14
Trường Đại học Khoa học Tự Nhiên Thực hành Vi điều khiển
Khoa Điện tử - Viễn thông

CNEN1bits.CN15IE = 1; // Cho phép chân CN15 – RD6 sinh ra ngắt


CNPU1bits.CN15PUE = 1; // Cho phép chân CN15 – RD6 sinh ra ngắt khi có pull-up
CNEN2bits.CN19IE = 1; // Cho phép chân CN19 – RD13 sinh ra ngắt
CNPU2bits.CN19PUE = 1; // Cho phép chân CN19 – RD13 sinh ra ngắt khi có pull-up
IPC4bits.CNIP = 7; // Độ ưu tiên của ngắt là 7
IFS1bits.CNIF = 0; // Xóa cờ ngắt
IEC1bits.CNIE = 1; // Bật ngắt
}
void _ISR _CNInterrupt(void){
IFS1bits.CNIF = 0;
/* Thêm code xử lý vào đây*/
}

TÀI LIỆU THAM KHẢO


1. Chương 14 “Timers” (DS39704) trong PIC24F Family Reference Manual.
2. PIC24FJ128GA010 Family Data Sheet.
3. MPLAB XC16 C Compiler User’s Guid.

Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang | 15

You might also like