Tải bản đầy đủ (.pdf) (0 trang)

Chuong 5 Vi điều khiển PIC 16F887 timer – counter

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (746.28 KB, 0 trang )

TRƯỜNG ĐẠI HỌC PHENIKAA
KHOA ĐIỆN ĐIỆN TỬ

KỸ THUẬT VI XỬ LÝ VÀ VI
ĐIỀU KHIỂN
Chương 5:
Vi điều khiển PIC 16F887 timer – counter
GIẢNG VIÊN:

ThS. ĐÀO TÔ HIỆU

Hà Nội, 08/2021


NỘI DUNG

✓Giới thiệu
✓Timer/counter trên PIC 16F887
✓Ứng dụng timer/counter

2


GIỚI THIỆU

PIC16F887 có 3 timer,
counter (T/C):
+ T/C0 và T/C2 : 8 bit
+ T/C1: 16bit

T/C0: (8bit) có 3 thành ghi quan trọng:


OPTION_REG có địa chỉ là 0x81
INTCON có địa chỉ 0x0b
TMR0 có địa chỉ 0x01 (giá trị đếm 0-255)
3


TIMER/COUNTER TRÊN PIC 16F887
Thanh ghi OPTION_REG (0x81)
RBPU: bit điều khiển điện trở treo của PORTB
INTEDG: Cấu hình đọc xung sườn âm/dương cho ngắt ngoài
tại chân RB0 (1: sườg dương, 0: sườn âm)
T0CS: bit lựa chọn nguồn xung cho thanh ghi TMR0
1= sẽ đếm xung ngoại đưa đến chân RA4/T0CKI (pin 6).
0= sẽ đếm xung clock nội bên trong
TOSE: BIT lựa chọn xung sườn lên hay sườn xuống
0= xung thay đổi từ cao xuống thấp tại chân T0CKI
1= xung thay đổi từ thấp lên cao tại chân chân T0CKI
PSA: bit gán bộ chia tần.
1= gán bộ chia cho WDT.
0= gán bộ chia Timer0.

4


6.2. TIMER/COUNTER TRÊN PIC 16F887
Thanh ghi OPTION_REG (0x81)
PS2:PS0: các bit cấu hình bộ chia tần
PS2
0
0

0
0
1
1
1
1

PS1
0
0
1
1
0
0
1
1

PS0
0
1
0
1
0
1
0
1

5

TMR0

1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256

WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128


TIMER/COUNTER TRÊN PIC 16F887
Thanh ghi INTCON (0xb0): thanh ghi ngắt của T/C0
+ Thanh ghi TMR0 đếm vượt 255 (0xff) -> 0x00 sinh ra ngắt timer0, cờ
báo ngắt (TMR0IF lên 1).
+ 2 bit quan trọng: TMR0IE là bit số 5 (cho phép ngắt tràn ), bit 2 :
TMROIF (cờ ngắt ).
+Timer0 phải xóa cờ báo ngắt TMR0IF = 0 để tiếp tục chu trình tiếp
theo.
+ Bộ định thời sẽ ngừng hoạt động khi PIC ở chế độ ngủ => không thể
dùng ngắt timer để kích hoạt PIC.


6


TIMER/COUNTER TRÊN PIC 16F887
Đếm xung ngoại với RA4/T0CKI (pin 6) dung WDT
+ PSA = 1 và T0CS = 1: Đếm xung ngoại gán cho WDT

7


TIMER/COUNTER TRÊN PIC 16F887
Đếm xung ngoại với RA4/T0CKI (pin 6) timer0
+ PSA = 0 và T0CS = 1: Đếm xung ngoại gán cho timer0

8


TIMER/COUNTER TRÊN PIC 16F887
Đếm xung ngoại với RA4/T0CKI (pin 6) timer0
+ PSA = 0 và T0CS = 1: Đếm xung ngoại gán cho timer0

9


ỨNG DỤNG
Ví dụ: Sử dụng thạch anh nội 4 MHz, timer0. Hãy thiết lập
timer0 với bộ chia tần 4 để xác định ngắt timer sau mỗi 200us
Giải:
B1:

Timer0: 8 bit => Giá trị đếm TMR0: 0 – 255 (256 giá trị) tương ứng
với 1 chu kỳ lệnh.
F = 4000000Hz => Sau khi qua Bộ chia 1/4: f0 = f/4 = 1000000Hz
 Tần số sau khi qua bộ chia tần 4 thì = 1000000/4 = 250000Hz.
B2:
chu kỳ lệnh = 1/250000= 4us
Để đếm được 200us thì cần trải qua số chu kỳ lệnh = 200/4 = 50
 TMR0 chỉ cần đếm 50 giá trị
 Giá trị thiết lập bộ đếm= 256-50 = 206

10


ỨNG DỤNG
Ví dụ: Sử dụng thạch anh nội 4 MHz, timer0. Hãy thiết lập
timer0 với bộ chia tần 4 để xác định ngắt timer sau mỗi 200us

t f
Var=2 −
+1
Kprescaler  4
n

n: số bit bộ timer sử dụng
t: Thời gian cần xác định
Kprescaler: Bộ chia tần k
4: bộ chia ¼ tại đầu vào

Tham số thiết lập = 256 – (0.0002 * 4000000)/(4x4) = 206


Bài tập: Với timer1 (16 bit) hãy thiết lập tìm các tham số
thiết lập bộ chia tần và timer1 để xác định thời gian 500us.

11


Lập trình timer0 dùng xung dao động nội
#include <timer0.h>
int32 count = 0;
int stt = 0;
#int_TIMER0//di thanh cap
void Ngat_TIMER0(void)
{
count++;
if(count>=999)
{
count = 0;
stt = !stt;
output_bit(PIN_C0,stt);//Ham dao trang thai
}
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_BIT);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_timer0(206);
while(TRUE)
{}
}

12




×