SlideShare a Scribd company logo
CHƯƠNG 5
BỘ ĐỊNH THỜI
Kiểm tra chương ngắt
1. Nêu tên các thanh ghi liên quan đến ngắt, chức
năng các bit trong thanh ghi INTCON?
2. Nêu các chân ngắt ngoài và các chân ngắt PORTB
của PIC16F887, có gì khác với PIC 16F877A?
3. Vẽ sơ đồ mạch nguyên lý, vẽ lưu đồ giải thuật và
viết chương trình điều khiển 8 LED nối với PORTD
theo yêu cầu: Khi có ngắt ngoài PORTD = 0xF0;
Biết ban đầu 8 LED tắt; Fosc = 4MHz
Nội dung chương 5
1. Timer
2. Đặc điểm, Sơ đồ khối của Timer 0
3. Các bước để định thời gian Timer 0
4. Các bước để đếm sự kiện Counter 0
5. Bài tập Timer 0
6. Đặc điểm, Sơ đồ khối của Timer 1
7. Các bước để định thời gian Timer 1
8. Các bước để đếm sự kiện Counter 1
9. Bài tập Timer 1
10. Đặc điểm, Sơ đồ khối của Timer 2
11. Các bước để định thời gian Timer 2
12. Bài tập Timer 2
 Timer được sử dụng cho nhiều chức
năng:
 Định thì để tạo sự kiện
 Đếm sự kiện
 Tạo dạng sóng v..v
 PIC16F877 có 3 timers
– Timer0
– Timer1
– Timer2
Timers
So sánh các Timer
TIMER2
TIMER1
TIMER0
8-bits (TMR2)
16-bits
(TMR1H:TMR1L)
8-bits (TMR0)
Kích thước
thanh ghi
Fosc/4
Fosc/4
Fosc/4
Nguồn CLOCK
(bên trong)
None
T1CKI pin or
Timer 1 oscillator
(T1OSC)
T0CKI pin
Nguồn CLOCK
(bên ngoài)
Prescaler
(1:1,1:4,1:8)
Postscaler
(1:11:16)
Prescaler 3-bits
(÷1,÷2,÷4,÷8)
Prescaler 8-bits
(1:21:256)
CLOCK SCALING
AVAILABLE
(Resolution)
TMR2 matches
PR2
(TMR2IF in PIR2)
On overflow
FFFFh0000h
(TMR1IF in PIR1)
On overflow
FFh00h
(TMR0IF in INTCON)
Sự kiện ngắt và
cờ ngắt
NO
YES
NO
Đánh thức PIC từ
SLEEP
Đặc điểm của Timer 0
Là Timer/Counter 8 bit
Có thể đọc và ghi
Có bộ chia trước 8 bit có thể lập trình bằng
phần mềm
Có thể lựa chọn nguồn xung clock bên
trong hoặc bên ngoài
Cho phép lựa chọn tác động cạnh cho xung
clock bên ngoài
Xảy ra hiện tượng ngắt khi tràn từ
FFh00h
Sơ đồ khối Timer 0
scaled clock TMR0
T0CKI
pin
Fosc/4
prescaler
Watchdog Timer
synchronize
WDT out
OPTION register
RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0
TMR0 Clock
Source Select
1 = TOCK1, 0 = Fosc/4
Source Edge Select
1 = increment TMR0 on high-to-low transition
0 = increment TMR0 on low-to-high transition
Prescaler Assignment
1= prescaler assigned to WDT
0= prescaler assigned to Timer 0
Prescaler Rate Select Bits
TMR0
RATE
PS0
PS1
PS2
1:2
0
0
0
1:4
1
0
0
1:8
0
1
0
1:16
1
1
0
1:32
0
0
1
1:64
1
0
1
1:128
0
1
1
1:256
1
1
1
8
DATA BUS
scaled clock TMR0
T0CKI
pin
Fosc/4
prescaler
Watchdog Timer
synchronize
8
DATA BUS
•Timer 0 có thể đọc/ ghi
TMR0IF
INTCON register
• Xung clock bên ngoài (TOCKI) được sử dụng, nó sẽ
được đồng bộ hóa với xung clock bên trong
•Cờ ngắt Timer 0 sẽ được set khi có hiện tượng tràn TMR0
(FF00)
Sơ đồ khối Timer 0
Hoạt động
Các bước để định thời gian Timer 0
B1: Tính toán các giá trị cần đưa vào code:
 tdelay: thời gian cần định thời (us)
 fOSC: tần số dao động thạch anh
 Pre:hệ số chia tần trước prescaler(Pre=1,2,4...,256
 [TMR0]: giá trị cần ghi vào thanh ghi TMR0
B2: Ghi vào TMR0 giá trị đã tính toán
B3: Xóa cờ báo tràn( cờ ngắt) TMR0IF
B4: Chọn chế độ hoạt động của Timer 0
• (chọn chế độ Timer, gán prescaler..)
B5: Xác định thời điểm Timer 0 tràn bằng cách:
• Kiểm tra cờ TMR0IF( nếu dùng thăm dò)
• Xử lý ISR của Timer 0 (nếu dùng ngắt)
Xác định được:
TMR0 =
TMR0IF =
PSA =
PS2 =
PS1 =
PS0 =
T0SE =
T0CS =
Nếu dùng ngắt:
GIE =
TMR0IE =
 TD = dem* Tdelay = dem * [256-TMR0] *4*(1/fosc)* PresT0
 = dem* [256-TMR0] *4*(Tosc)* PresT0
 = dem* [256-TMR0] *Tcy* PresT0
Tdelay min = 1 *Tcy* 2 = 2us
max = 256 *Tcy* 256= 65,536ms
a. TD = 100ms = dem * tdelay = 2 * 50ms
 dem = 2; TMR0=61; TMR0IF =0
PresT0 =1:256) PS2=1; PS1=1; PS0=1;
PSA=0 T0SE = 0 T0CS=0
b. TD = 500ms = dem * tdelay = 50 * 10ms
 dem = 50 ; TMR0=; TMR0IF =0
PresT0 =1:X) PS2=x; PS1=x; PS0=x;
PSA=0 T0SE = 0 T0CS=0
Ví dụ
Fosc=4MHz Tcy = 1us
 [TMR0] = 256 – [ tdelay/Tcy*PresT0]
 = 256 – [1000us/1us*256) =
 [0] <= 256 – [ tdelay/Tcy*PresT0]
 PresT0 >= [ tdelay/ 256*Tcy]
= 1000us/ 256*1us >=4
TMR0 0……….………………. …..255
Các bước để đếm sự kiện Counter 0
 B1: Xóa giá trị trong thanh ghi TMR0 =0
 B2: Xóa cờ báo tràn( cờ ngắt) TMR0IF=0
 B3: Chọn chế độ hoạt động của Counter 0
• Chọn chế độ đếm sự kiện (Counter) T0CS =1
• Kích hoạt hoặc không cho phép ngắt GIE=0, TMR0IE=0
• Gán giá trị prescaler cho Timer 0 PSA =
• Chọn loại kích của nguồn xung bên ngoài T0SE=
 B4: Đọc giá trị về và xử lý xung đếm trong thanh ghi TMR0.
Lưu ý:
 Ví dụ mô phỏng
Lập trình khởi tạo cho timer0 để tạo thời gian trễ
t=[256-0] *1us*16=4096us=4,1ms=0.0041s
fosc= 4MHz
Xác định:
Giá trị ban đầu TMR0=0;
Hệ số chia trước 1:16 (ps2=0; ps1=1; ps0=1)
Khởi tạo giá trị cho Timer0 (hitech-C)
TMR0
0 0 0 0 0 0 0 0
INTCON
0
OPTION_REG
0 0 0 0 0 0 1 1
TMR0IF
This interrupt flag will set on
Timer0 overflow even if
interrupts are disabled
PSA
PS<2:0>
TOCS
Selects Timer 0
Clock Source
(External or Internal)
Prescaler
Assignment
(WDT or TMR0)
Prescaler
value = 1:16
1
;Xóa giá trị đếm cho Timer0
;Xóa TMR0
TMR0=0x00;
;Xóa cờ ngắt Timer0 TMR0IF
TMR0IF=0;
;Thiết lập thanh ghi OPTION_REG ;
;với xung clock bên trong với bộ
;chia tần 1:16
BANKSEL OPTION_REG
MOVLW b’00000011’
OPTION_REG=0x03
;Kiểm tra cờ tràn TMR0IF nếu tràn
;thì tiếp tục
while(!TMR0IF) {}
<continue>
1 1 1 1 1 1 0 0
1 1
1
0 0 0 0 0 0 0 0
Timer0
incrementing
Flag on overflow
Ví dụ 1:
Dựa vào sơ đồ viết lưu đồ giải thuật và viết chương
trình tạo sóng xung vuông có tần số 500Hz tại chân
RE1 và 2Hz tại chân RE2 dùng Timer 0 để định thời.
Ta có: Td1 = 1/500Hz = 2ms  tdelayT0 = 1ms
Td2 = 1/2Hz = 500ms = 250 Td1
Begin
Cấu hình các
PORT digital
Cấu hình các PORT E:
output
PORTE=0
COUNT=250
TMR0=6
TMRIF=0
Đặt chế độ Timer0
Pre=4
Timer0
TMR0IF
=1?
RE1=!RE1
COUNT- -
COUNT
=0?
RE2=!RE2
LOOP1
LOOP2
Sơ đồ giải
thuật:
#include <xc.h>
#define _XTAL_FREQ 4000000
unsigned char count;
Code C: void main()
{
ANSEL=0x00;
TRISE = 0b001; // E1& E2 la out
PORTE = 0;
loop:
count=250;
while(count--)
{
TMR0=6;
T0CS=0;
TMR0IF=0;
PSA=0;
PS2=0;
PS1=0;
PS0=1;
while(!TMR0IF){}
RE1=!RE1;
}
RE2=!RE2;
goto loop;
}
Ví dụ 2: Dựa vào sơ đồ viết lưu đồ giải thuật và viết
chương trình điều khiển đếm số lần nhấn nút SW0
được nối với ngõ vào của counter 0 (T0CKI) và hiển
thị giá trị này trên 8 led đơn dùng counter 0.
Begin
Cấu hình các
PORT digital
Cấu hình các PORT C:
output
Đặt chế độ Timer0:
Mode: Counter
Prescaler:1:2
PrescalerWDT
Sơ đồ giải thuật:
Cấu hình chân nối
RA4: input
Đặt giá trị ban đầu cho
bộ đếm(TMR0=0)
Xóa cờ báo tràn
Timer0
Đọc giá trị từ bộ
đếm & xuất giá trị
lên LED
Code Mplabx-XC8
 SV tự viết
Bài tập Timer0
Bài 1: Viết chương trình delay 4ms dùng Timer 0
biết fOSC=4Mhz
Bài 2: Chỉ dùng Timer 0 viết chương trình delay có
thời gian lớn nhất biết fOSC=4Mhz.
Bài 3: Cho sơ đồ giống như ví dụ 2. Viết chương
trình khi nhấn nút SW0 thì số đếm giảm từ 2000
hiển thị trên 8 led đơn.
Chữa bài 1.2,3
Bài kiểm tra21/09/2023 lớp
DHDTMT17ATT
a. Viết chương trình có tên TD_ms() theo yêu cầu sau:
 Biết tdelay=25ms; fosc=8MHz; Phải sử dụng module timer
0 để định thời gian.
b. sử dụng chương trình trên làm chương trình delay, hãy
viết chương trình điều khiển 8 led nối với portC của PIC
16f887 và các nút nhấn sw1 và sw2 và sw3 (theo kết nốicho
trước), thực hiện theo yêu cầu sau:
– Khi nhấn/nhả sw1( nối với RB0) 8 led sáng đuổi từ
MSB  LSB.
– Khi nhấn/nhả sw2( nối với RE0) 8 led sáng dần từ LSB
 MSB.
– Khi nhấn/nhả sw3( nối với RA4) 8 led tắt.
Biết Fosc=8MHz ; thời gian chuyển giữa các trạng thái
là Td = 100ms.
Kiểm tra 20/09/2023
a. Viết chương trình có tên TD_ms() theo yêu cầu
sau:
 Biết tdelay=25ms; fosc=8MHz; Phải sử dụng
module timer 0 để định thời gian.
b. sử dụng chương trình trên làm chương trình
delay, hãy viết chương trình điều khiển 8 led nối
với PORTC thực hiện yêu cầu sau với sw1 và sw2
và sw3 (tự thiết kế mạch):
- Khi nhấn nhả swi.
với td=100ms
 t_delay = 25 ms = 25000 us.
 f_xtal = 8 MHz  t_xung=0.5 us.
 Số lượng xung cần đếm:
n_xung=50000.
 Chọn tỉ lệ chia tần trước presT0 là 8
[với giá trị này, số xung cần đếm sẽ là
50000/8= 6250]
 + Chọn số đếm cho TMR0 là 250
 + Số lần đếm cờ báo tràn (TMR0IF)
nIF = 25
 Thanh ghi OPTION có: PS<2:0>=
010; PSA=0; T0SE=0; T0CS=0;
 TMR0 = 256-250
 TMR0IF=0;
void Delay_25ms (void)
{
OPTION = 0B00000010;
TMR0 = 6;
unsigned char nIF=0;
while (nIF<25)
{
while (TMRIF==0);
TMR0IF=0;
TMR0 = 6;
nIF ++;
}
}
Đặc điểm của Timer 1
 Là Timer/Counter 16 bit gồm 2 thanh ghi
TMR1H và TMR1L có thể đọc và ghi
 Timer1 có thể hoạt động ở chế độ định thời
hay đếm được lựa bởi bit TMR1CS.
 Trong chế độ định thời T1 tăng giá trị ở mỗi
chu kỳ lệnh, chế độ đếm bộ đếm tăng mỗi khi
có cạnh clock ngõ vào bên ngoài
 Có bộ prescale chia tần 3 bit
 Xảy ra hiện tượng ngắt khi tràn từ
FFFFh0000h
 Có khả năng “đánh thức” vi điều khiển từ chế
độ “ngủ” nhờ có thêm bộ dao động bên ngoài.
Sơ đồ khối Timer1
T1CKI
pin
T1
OSC
T1OS0
T1OSI
prescaler
synchronize
Timer1 Control Register (T1CON)
Chọn nguồn xung clock
1 = External (T1CKI)
0 = Internal (FOSC/4)
LP Oscillator Enable
1 = T1OSC selected
0 = T1CKI can be used
Fosc/4
scale
T1CKPS0
T1CKPS1
1:8
1
1
1:4
0
1
1:2
1
0
1:1
0
0
Timer1 On
1 = Enable Timer1
T1GINV TMR1GE T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
TMR1H TMR1L
Enable
TMR1ON
Timer1 External Clock Input Synchronization
1 = do not synchronize external clock input
0 = synchronize external clock input with
internal clock (Fosc/4)
Sơ đồ khối Timer1
T1CKI
pin
T1
OSC
T1OS0
T1OSI
prescaler
synchronize
Thanh ghi điều khiển (T1CON)
Fosc/4
TMR1H TMR1L
Timer1 Gate Enable and
Timer1 Gate Invert are
available on some devices
Enable
TMR1ON
T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
T1GINV TMR1GE
Các bước để định thời gian Timer 1
 B1: Tính toán các giá trị cần đưa vào code:
Đối với dao động nội:
Đối với nguồn xung clock bên ngoài lấy từ bộ dao động Timer1
(thạch anh gắn trên 2 chân T1OS1 và T1OS0)
Trong đó:
tdelay: thời gian cần định thời (us)
fOSC: tần số dao động thạch anh
fOSC(T1): tần số dao động Timer1
Pre:hệ số chia tần trước prescaler(Pre=1,2,4,8)
[TMR1]: giá trị cần ghi vào thanh ghi TMR1
TMR1H: Byte cao của [TMR1]
TMR1L: Byte thấp của [TMR1]
TMR1 =15536D = 3CB0H-> TMR1H =3CH =00111100B ;
TMR1L=B0H = 10110000B;
Các bước để định thời gian Timer 1
 B2: Ghi vào thanh ghi TMR1( gồm TMR1H:TMR1L) được xác định ở
trên
 B3: Xóa cờ báo tràn (cờ ngắt) TMR1IF
 B4: Chọn chế độ hoạt động của Timer1
• Chế độ định thời gian (Timer)
• Kích hoạt hoặc vô hiệu hóa các ngắt
• Chọn giá trị prescale
 B5: Cho phép Timer1 bắt đầu hoạt động
 B6: Xác định thời điểm Timer1 bị tràn bằng cách:
• Kiểm tra cờ TMR1IF( nếu dùng thăm dò)
• Xử lý ISR của Timer 1 (nếu dùng ngắt)
Các bước để đếm sự kiện Counter 1
 B1: Xóa giá trị trong thanh ghiTMR1
 B2: Xóa cờ báo tràn (cờ ngắt) TMR1IF
 B3: Chọn chế độ hoạt động của Counter 1
• Chế độ đếm sự kiện (Counter 1)
• Kích hoạt hoặc vô hiệu hóa các ngắt(tùy chọn)
• Chọn giá trị tỉ lệ của prescale
• Chọn tính năng đồng bộ hoặc không đồng bộ xung
 B4: Cho phép Counter 1 bắt đầu hoạt động
 B5: Đọc về và xử lý số đếm xung đếm được trong thanh ghi
TMR1(TMR1H:TMR1L)
 Ví dụ mô phỏng
Lập trình khởi tạo cho timer1 để tạo thời
gian trễ td=
fosc= 4MHz
Xác định:
Giá trị ban đầu TMR1H= ..;
TMR1L= ..;
Hệ số chia trước 1:8
Main Code
Start
;Xóa cờ ngắt Timer1 TMR1IF
TMR1IF=0;
;Cho phép ngắt Timer1
TMR1IE=1;
;Cho phép ngắt toàn cục và ngắt ngoại vi
PEIE=1;
GIE=1;
Thiết lập ngắt Timer1 (C)
INTCON
PIE1
1
GIE PEIE
TMR1IE
1
1
PIR1
TMR1IF
0
TMR1H
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
TMR1L
1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1
Khởi tạo Timer1 (C)
TMR1H
0 0 0 0 0 0 0 0
T1CON (Timer1 Control)
Input clock
prescale bits
(T1CKPS<1:0>)
TMR1L
0 0 0 0 0 0 0 0
PIR1 (Peripheral Interrupt Request)
TMR1IF
0
0
0
0
0
0
0 0
0
0
0
0
0
0 1
1
Clock source
select bit
(TMR1CS)
TMR1ON
1
TMR1H:TMR1L INCREMENTING
1
OVERFLOW!!
;Xóa thanh ghi TMR1
TMR1H=0x00;
TMR1L=0x00
;Xóa cờ ngắt TMR1IF trong thanh ghi PIR1
TMR1IF=0;
;Setup T1CON register for internal clock
;with 1:8 prescaler, Timer1 is stopped
;and T1 osc is disabled
T1CON=0xC0;
;Bật Timer 1
TMR1ON=1;
;Kiểm tra cờ ngắt Timer 1
while(!TMR1IF) {} Timer1
oscillator
enable bit
(T1OSCEN)
Viết CT Delay_2s sử dụng Timer1
 Tính toán:
t_delay = 2s = 2000000
us; f_xtal = 8 MHz 
t_xung=0.5 us
Số lượng xung cần
đếm: n_xung=4000000
 Với Timer1:
+ Chọn tỉ lệ chia tần
trước prescale là 8
+ Chọn dung lượng
đếm Timer1 là 50000
+ Số lần đếm cờ báo tràn
Timer1 là 10
void Delay_2s (void)
{
T1CON=0B00110000;
TMR1H=(65536-50000)/256;
TMR1L=(65536-50000)%256;
unsigned char nIF=0;
TMR1IF=0; TMR1ON=1;
while (nIF <10)
{
TMR1IF=0;
TMR1H=(65536-50000)/256;
TMR1L=(65536-50000)%256;
nIF ++;
}
TMR1ON=0;
}
Ví dụ 3: Dựa vào sơ đồ viết chương trình điều
khiển tạo sóng xung vuông có chu kỳ 100ms tại
chân RE1 và 500ms tại chân RE2
Begin
Cấu hình các
PORT digital,
PORTE: output
Cấu hình các PORT E:
output
count=5
TMR1IF=0
TMR1=15536
T1CON=b’00000001’
TMR1IF
=1?
RE1=!RE1
count - -
count
=0?
RE2=!RE2
LOOP
N
Sơ đồ giải thuật
dùng “thăm dò” :
Y
N
Y
#include<pic.h>
unsigned char count;
void main (void)
{
ADCON1=0x06;
TRISE=0b001;
PORTE=0;
while(1)
{
count=5;
while(count--)
{
TMR1IF = 0;
TMR1H =0X3C;
TMR1L = 0XB0;
T1CKPS0 = 0;
T1CKPS1 = 0;
TMR1CS = 0;
TMR1ON = 1;
Code Hitech: while(!TMR1IF){}
RE1=RE1^1;
}
RE2=!RE2;
}
}
#include<pic.h>
unsigned char count = 0x00;
void interrupt Timer1_ISR(void)
{
TMR1IF = 0;
TMR1L = 0XB0;
TMR1H = 0X3C;
RE1 = RE1 ^ 1;
count++;
if (count == 5)
{
RE2 = RE2 ^ 1;
count = 0;
}
}
Dùng ngắt: Code
Hitech C:
void main (void)
{
ADCON1=0x06;
TRISE=0b001;
PORTE=0;
TMR1ON = 0;
TMR1H = 0X3C;
TMR1L = 0XB0;
T1CKPS0 = 0;
T1CKPS1 = 0;
TMR1CS = 0;
TMR1IE = 1;
TMR1IF = 0;
PEIE = 1;
GIE = 1;
TMR1ON = 1;
while(1);
}
Ví dụ 4: Dựa vào sơ đồ viết chương trình điều
khiển tạo sóng xung vuông có chu kỳ 2s tại chân
RE1.
Begin
Cấu hình các
PORT digital
Cấu hình PORT E:
output
TMR1IF=0
TMR1=0x8000
T1CON=b’00001111’
TMR1IF
=1?
RE1=!RE1
LOOP
N
Sơ đồ giải thuật
dùng “thăm dò” :
Y
#include<pic.h>
#define _XTAL_FREQ 4000000
void main()
{
ADCON1=0x06;
TRISE=0b000;
PORTE=0;
while(1)
{
TMR1IF=0;
TMR1H=0x80;
TMR1L=0x00;
TMR1CS=1;
T1OSCEN=1;
T1SYNC=1;
T1CKPS0=0;
T1CKPS1=0;
TMR1ON=1;
Code Hitech C:
while(!TMR1IF){}
PORTE ^= 2;
}
}
#include<htc.h>
…..
#define _XTAL_FREQ 4000000
void interrupt isr(void)
{
if(TMR1IF && TMR1IE)
{
TMR1IF = 0;
TMR1L = 0;
TMR1H = 0x80;
PORTE ^= 2;
}
}
Dùng ngắt: Code Hitech C:
void main()
{
ADCON1=0x06;
TRISE=0b000;
PORTE=0;
TMR1H=0x80;
TMR1L=0x00;
TMR1IF=0;
TMR1CS=1;
T1OSCEN=1;
T1SYNC=1;
T1CKPS0=0;
T1CKPS1=0;
TMR1ON=1;
TMR1IE=1;
PEIE=1;
GIE=1;
while(1);
}
Bài tập Timer1
Bài 1: Viết chương trình delay 100ms dùng
Timer1 biết fOSC=4Mhz
Bài 2: Chỉ dùng Timer1 viết chương trình
delay có thời gian lớn nhất biết fOSC=4Mhz
Bài 3: Viết chương trình delay 10s dùng
Timer 1 sử dụng bộ dao động bên ngoài gắn
trên 2 chân RC1/T1OSI, RC2/T1OSO có
f =32768 Hz
Đặc điểm của Timer 2
Là Timer 8 bit có bộ prescale và postscale
Được sử dụng như bộ tạo xung có PWM
cho chế độ hoạt động PWM của khối CCP
Thanh ghi TMR2 có thể đọc ghi và xóa khi
bị reset
Có bộ chia tần số trước prescale với bit
điều khiển T2CKPS1:T2CKPS2
Ngõ ra TMR2 đi qua bộ postscale 4 bit để
tạo ra yêu cầu ngắt TMR2 được chốt trong
cờ TMR2IF(PIR1<1>)
Tạo tín hiệu ngắt khi giá trị TMR2 bằng PR2
Chỉ sử dụng nguồn xung clock bên trong
Sơ đồ khối củaTimer2
Scale
T2CKPS
0
T2CKPS
1
1:1
0
0
1:4
1
0
1:16
X
1
Prescaler
1:1, 1:4, 1:16
COMPARATOR
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Postscaler
1:1  1:16
Fosc/4
Timer2 ON
1 = Timer2 enabled
TMR2
TMR2
OUTPUT
PR2
Timer2 Control Register (T2CON)
Sơ đồ khối củaTimer2
Prescaler
1:1, 1:4, 1:16
COMPARATOR
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Postscaler
1:1  1:16
Fosc/4
Timer2 ON
1 = Timer2 enabled
Scale
T2CKPS0
T2CKPS1
1:1
0
0
1:4
1
0
1:16
X
1
TMR2
TMR2
OUTPUT
PR2
SCALE
TOUTPS0
TOUTPS1
TOUTPS2
TOUTPS3
1:1
0
0
0
0
1:2
1
0
0
0
1:3
0
1
0
0
1:4
1
1
0
0
1:5
0
0
1
0
1:6
1
0
1
0
1:7
0
1
1
0
1:8
1
1
1
0
1:9
0
0
0
1
1:10
1
0
0
1
1:11
0
1
0
1
1:12
1
1
0
1
1:13
0
0
1
1
1:14
1
0
1
1
1:15
0
1
1
1
1:16
1
1
1
1
Timer2 Control Register (T2CON)
Prescaler
1:1, 1:4, 1:16
COMPARATOR
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Postscaler
1:1  1:16
Fosc/4
TMR2
OUTPUT
1 1 1 1 0 1 1 0
1 1 1 1 1 0 0 0
1 1 1 1 0 1 1 1
1 1 1 1 0 1 0 1
1
PIR1
TMR2IF
Timer2 Control Register (T2CON)
TMR2
PR2
Sơ đồ khối củaTimer2
Load Period
Register
Start Timer2
Counting
Flag set on first
match with
postscaler = 1:1
1 1 1 1 1 0 0 0
Khi sử dụng Timer2 cần chú ý:
 Khi mới cấp nguồn thì PR2=0xFF
 Prescaler và Postscaler sẽ bị xóa khi:
• Ghi dữ liệu vào TMR2
• Ghi dữ liệu vào T2CON
• Bất cứ sự kiện reset nào((WDT,POR,BOR)
 Khi reset vi điều khiển thì Prescaler và Postscaler sẽ
bị xóa
 TMR2 bị xóa khi ghi giá trị vào T2CON
 TMR2 sẽ tăng giá trị từ 00h đến khi bằng PR2 sau đó
TMR2 sẽ được reset về 0 vào chu kỳ tăng kế tiếp
 Sự kiện ngắt khi TMR2=PR2 không thể làm “đánh
thức” vi điều khiển khỏi chế độ “ngủ“.
 Timer 2 ít dùng để định thời gian. Nó thường dùng cho
CCP để tạo xung PWM
Các bước để định thời gian Timer 2
B1: Tính toán các giá trị cần đưa vào code:
Đối với dao động nội:
Trong đó:
tdelay: thời gian cần định thời (us)
fOSC: tần số dao động thạch anh(Mhz)
Pre: hệ số chia tần trước Prescaler(Pre=1,4,16)
Post: hệ số chia tần sau Postscaler(Post=1,2,...,16)
[TMR2]: giá trị cần ghi vào thanh ghi TMR2
[PR2]: giá trị cần ghi vào thanh ghi PR2
ௗ௘௟௔௬
ைௌ஼
Các bước để định thời gian Timer 2
B2: Ghi vào thanh ghi PR2 giá trị đã tính toán
B3: Xóa cờ báo tràn (cờ ngắt) TMR2IF
B4: Chọn chế độ hoạt động của Timer 2
 Kích hoạt hoặc vô hiệu hóa các ngắt
 Chọn giá trị Pre
 Chọn giá trị Post
B5: Cho phép Timer 2 bắt đầu hoạt động
B6: Xác định thời điểm Timer 2 bị tràn bằng
cách:
 Kiểm tra cờ TMR2IF (dùng thăm dò)
 Xử lý ISR của Timer 2 (nếu dùng ngắt)
Khởi tạo Timer2 (C)
TMR2 (Timer2 Counter)
0 0 0 0 0 0 0 0
T2CON (Timer2 Control)
PIR1 (Peripheral Interrupt Request)
TMR2IF
PIE1 (Peripheral Interrupt Enable)
TMR2IE
0
0
1
0
0 0
0 1
1
1
;Disable the Timer2 interrupts in the PIE1
;Cấm ngắt Timer2 trong thanh ghi PIE1
;Xóa cờ ngắt TMR2IF trong thanh ghi PIR1
TMR2IE=0;
TMR2IF=0;
;Setup thanh ghi T2CON Postscaler = 1:15,
;Prescaler = 1:16, Timer2 off
T2CON=0x72;
;Xóa thanh ghi TMR2
TMR2=0;
;Khởi tạo giá trị PR2
PR2=0x80
;Timer2 bắt đầu đếm lên
TMR2ON=1;
;Kiểm tra cờ ngắt TMR2IF
while (!TMR2IF)
{}
1
Postscaler = 1:15
(TOUTPS<3:0>)
TMR2ON
Prescaler = 1:16
(T2CKPS<1:0>)
1
PR2 (Period Register Timer2)
0 0 0 0 0 0 0
1
Flag is set
Timer2
Incrementing
1 1 1 1 1
1
1 1
1
1 1
1
Ví dụ 5: Dựa vào sơ đồ viết chương trình điều
khiển tạo sóng xung vuông có tần số 10Hz và
100Hz tại chân RE1 và RE2.
Begin
Cấu hình các
PORT digital
Cấu hình PORT E:
output, PORTE=0
TMR2IF=0
PR2=249, count=0
T2CON=b’00100001’
(Pre=1:4,Post=1:5)
count
=10?
ISR:
N
Sơ đồ giải thuật
dùng ngắt :
Y
TMR2IE=1
PEIE=1
GIE=1
TMR2IF=0
RE1=!RE1
count++
count=0
RE2=!RE2
RETFIE
#include<pic.h>
#define _XTAL_FREQ 4000000
unsigned char count = 0x00;
void interrupt Timer2_ISR(void)
{
TMR2IF = 0;
RE1 = RE1 ^ 1;
count++;
if (count == 10)
{
RE2 = RE2 ^ 1;
count = 0;
}
}
Dùng ngắt: Code Hitech C:
void main (void)
{
ADCON1=0x06;
TRISE=0b001;
PORTE=0;
PR2=249;
TMR2IF=0;
TOUTPS3=0;
TOUTPS2=1;
TOUTPS1=0;
TOUTPS0=0;
T2CKPS1=0;
T2CKPS0=1;
TMR2ON = 1;
TMR2IE=1;
PEIE=1;
GIE=1;
while(1);
}
Bài tập Timer2
Bài 1: Viết chương trình delay 1ms dùng
Timer2 biết fOSC=4Mhz
Bài 2: Chỉ dùng Timer2 viết chương trình
delay có thời gian lớn nhất biết fOSC=4Mhz
Bài tập tổng hợp
Bài tập tổng hợp
Bài 1: Viết chương trình delay 1s dùng Timer0, Timer1,
Timer2 biết fOSC=4Mhz
Bài 2: Viết chương trình tạo xung 10Hz trên chân RB7
Bài 3: Viết chương trình tạo xung có tần số 20Hz trên chân
RB0, chu kỳ nhiệm vụ D=40%.
Bài 4: Viết chương trình đếm sự kiện tại chân T0CKI kết
quả được hiển thị số đếm trên 8 led nối với PORT B biết
xung clock tác động từ mức cao xuống thấp.

More Related Content

What's hot

Apostila senai materiais e equipamentos de instalações elétricas(1)
Apostila senai   materiais e equipamentos de instalações elétricas(1)Apostila senai   materiais e equipamentos de instalações elétricas(1)
Apostila senai materiais e equipamentos de instalações elétricas(1)silvanojsilva
 
Lagune 2-arbeitsbuch (Deutschekursbuch)
Lagune 2-arbeitsbuch (Deutschekursbuch)Lagune 2-arbeitsbuch (Deutschekursbuch)
Lagune 2-arbeitsbuch (Deutschekursbuch)
Andrey Balakin
 
Applications of Microcontroller 8051
Applications of Microcontroller 8051Applications of Microcontroller 8051
Applications of Microcontroller 8051
Nilesh Bhaskarrao Bahadure
 
Pic problemas resueltos
Pic problemas resueltos Pic problemas resueltos
Pic problemas resueltos
GM Lamo
 
Proyectos de electronica(varios)
Proyectos de electronica(varios)Proyectos de electronica(varios)
Proyectos de electronica(varios)
Felipe Rojas Gutierrez
 
Microcontrolador PIC16F84 Desarrollo de Proyectos.pdf
Microcontrolador PIC16F84 Desarrollo de Proyectos.pdfMicrocontrolador PIC16F84 Desarrollo de Proyectos.pdf
Microcontrolador PIC16F84 Desarrollo de Proyectos.pdf
SANTIAGO PABLO ALBERTO
 
Face2 face elementary_teacher's.book_228p
Face2 face elementary_teacher's.book_228pFace2 face elementary_teacher's.book_228p
Face2 face elementary_teacher's.book_228pphamhuyanhtan CDSP-Dl
 
Parte mecanica del motor
Parte mecanica del motorParte mecanica del motor
Parte mecanica del motor
cildaisabel
 
Grammar
GrammarGrammar
Grammar
SkyEdge
 
Micro PLC Logo! Comunicación con teléfono Android
Micro PLC Logo! Comunicación con teléfono AndroidMicro PLC Logo! Comunicación con teléfono Android
Micro PLC Logo! Comunicación con teléfono Android
xendika2
 
New holland tl90 tractor service repair manual
New holland tl90 tractor service repair manualNew holland tl90 tractor service repair manual
New holland tl90 tractor service repair manual
fujskksmemmqaz
 
M. G. Say alternating current machines
M. G. Say alternating current machinesM. G. Say alternating current machines
M. G. Say alternating current machinesGarima Sain
 
Montajes De Electronica
Montajes De ElectronicaMontajes De Electronica
Montajes De ElectronicaEdgar Martinez
 
Informe (ieee) generador de diente de sierra
Informe (ieee) generador de diente de sierraInforme (ieee) generador de diente de sierra
Informe (ieee) generador de diente de sierra
Aldo Corp
 
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
SANTIAGO PABLO ALBERTO
 
Starters 6 sb
Starters 6 sbStarters 6 sb
Starters 6 sb
Thinh Vinh
 
Descripcion detallada del pic 16 f877
Descripcion detallada del pic 16 f877Descripcion detallada del pic 16 f877
Descripcion detallada del pic 16 f877
Raphael Raphael
 
Amplificador audio clase ab de fapesa con transistores
Amplificador audio clase ab de fapesa con transistoresAmplificador audio clase ab de fapesa con transistores
Amplificador audio clase ab de fapesa con transistores
Julián Abel Fontana
 

What's hot (20)

Apuntes del pic 16f84
Apuntes del pic 16f84Apuntes del pic 16f84
Apuntes del pic 16f84
 
Apostila senai materiais e equipamentos de instalações elétricas(1)
Apostila senai   materiais e equipamentos de instalações elétricas(1)Apostila senai   materiais e equipamentos de instalações elétricas(1)
Apostila senai materiais e equipamentos de instalações elétricas(1)
 
Lagune 2-arbeitsbuch (Deutschekursbuch)
Lagune 2-arbeitsbuch (Deutschekursbuch)Lagune 2-arbeitsbuch (Deutschekursbuch)
Lagune 2-arbeitsbuch (Deutschekursbuch)
 
Applications of Microcontroller 8051
Applications of Microcontroller 8051Applications of Microcontroller 8051
Applications of Microcontroller 8051
 
Arduino + lab view
Arduino + lab viewArduino + lab view
Arduino + lab view
 
Pic problemas resueltos
Pic problemas resueltos Pic problemas resueltos
Pic problemas resueltos
 
Proyectos de electronica(varios)
Proyectos de electronica(varios)Proyectos de electronica(varios)
Proyectos de electronica(varios)
 
Microcontrolador PIC16F84 Desarrollo de Proyectos.pdf
Microcontrolador PIC16F84 Desarrollo de Proyectos.pdfMicrocontrolador PIC16F84 Desarrollo de Proyectos.pdf
Microcontrolador PIC16F84 Desarrollo de Proyectos.pdf
 
Face2 face elementary_teacher's.book_228p
Face2 face elementary_teacher's.book_228pFace2 face elementary_teacher's.book_228p
Face2 face elementary_teacher's.book_228p
 
Parte mecanica del motor
Parte mecanica del motorParte mecanica del motor
Parte mecanica del motor
 
Grammar
GrammarGrammar
Grammar
 
Micro PLC Logo! Comunicación con teléfono Android
Micro PLC Logo! Comunicación con teléfono AndroidMicro PLC Logo! Comunicación con teléfono Android
Micro PLC Logo! Comunicación con teléfono Android
 
New holland tl90 tractor service repair manual
New holland tl90 tractor service repair manualNew holland tl90 tractor service repair manual
New holland tl90 tractor service repair manual
 
M. G. Say alternating current machines
M. G. Say alternating current machinesM. G. Say alternating current machines
M. G. Say alternating current machines
 
Montajes De Electronica
Montajes De ElectronicaMontajes De Electronica
Montajes De Electronica
 
Informe (ieee) generador de diente de sierra
Informe (ieee) generador de diente de sierraInforme (ieee) generador de diente de sierra
Informe (ieee) generador de diente de sierra
 
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
 
Starters 6 sb
Starters 6 sbStarters 6 sb
Starters 6 sb
 
Descripcion detallada del pic 16 f877
Descripcion detallada del pic 16 f877Descripcion detallada del pic 16 f877
Descripcion detallada del pic 16 f877
 
Amplificador audio clase ab de fapesa con transistores
Amplificador audio clase ab de fapesa con transistoresAmplificador audio clase ab de fapesa con transistores
Amplificador audio clase ab de fapesa con transistores
 

Similar to GUI C5- Timer.pdf

C6. Timer Module.pdfdsdsd dsdd sdsd sdds sd
C6. Timer Module.pdfdsdsd dsdd sdsd sdds sdC6. Timer Module.pdfdsdsd dsdd sdsd sdds sd
C6. Timer Module.pdfdsdsd dsdd sdsd sdds sd
HongVit873092
 
Cau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxCau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xx
Bùi Ngọc Bảo
 
Chuong4 hoạt động định thời
Chuong4 hoạt động định thờiChuong4 hoạt động định thời
Chuong4 hoạt động định thời
Đinh Công Thiện Taydo University
 
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.docĐồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.
Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.
Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.
nataliej4
 
Mitsubishi
MitsubishiMitsubishi
Mitsubishiddungd4
 
PLC mitsubishi
PLC mitsubishiPLC mitsubishi
PLC mitsubishi
quanglocbp
 
Báo cáo thực tập công nhân hệ thống báo động phát hiện rò rỉ khí gas
Báo cáo thực tập công nhân   hệ thống báo động phát hiện rò rỉ khí gas Báo cáo thực tập công nhân   hệ thống báo động phát hiện rò rỉ khí gas
Báo cáo thực tập công nhân hệ thống báo động phát hiện rò rỉ khí gas
nataliej4
 
Settings
SettingsSettings
Settings
Toàn Nguyễn
 
Chuong10
Chuong10Chuong10
Chuong10na
 
Tài liệu PCL tổng hợp
Tài liệu PCL tổng hợpTài liệu PCL tổng hợp
Tài liệu PCL tổng hợp
Minh Hoàng
 
Giáo trình thí nghiệm vi điều khiển ứng dụng
Giáo trình thí nghiệm vi điều khiển ứng dụngGiáo trình thí nghiệm vi điều khiển ứng dụng
Giáo trình thí nghiệm vi điều khiển ứng dụng
Man_Ebook
 
Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520
Yến Thanh Thanh
 
Chuong5 hoạt động port nối tiếp
Chuong5 hoạt động port nối tiếpChuong5 hoạt động port nối tiếp
Chuong5 hoạt động port nối tiếp
Đinh Công Thiện Taydo University
 
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Trần Đức Anh
 
Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]Nguyễn Hồng Nhân
 

Similar to GUI C5- Timer.pdf (20)

C6. Timer Module.pdfdsdsd dsdd sdsd sdds sd
C6. Timer Module.pdfdsdsd dsdd sdsd sdds sdC6. Timer Module.pdfdsdsd dsdd sdsd sdds sd
C6. Timer Module.pdfdsdsd dsdd sdsd sdds sd
 
Msptieuluan
MsptieuluanMsptieuluan
Msptieuluan
 
Ktvxl 7a timer
Ktvxl 7a timerKtvxl 7a timer
Ktvxl 7a timer
 
Cau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxCau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xx
 
Chuong4 hoạt động định thời
Chuong4 hoạt động định thờiChuong4 hoạt động định thời
Chuong4 hoạt động định thời
 
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.docĐồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
 
Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.
Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.
Đồ Án ASSEMBLY:Thiết kế đồng hồ số hiển thị trên LCD 16*2 Sử dụng IC AT89S52.
 
Mitsubishi
MitsubishiMitsubishi
Mitsubishi
 
PLC mitsubishi
PLC mitsubishiPLC mitsubishi
PLC mitsubishi
 
Co ban ve msp430
Co ban ve msp430Co ban ve msp430
Co ban ve msp430
 
Báo cáo thực tập công nhân hệ thống báo động phát hiện rò rỉ khí gas
Báo cáo thực tập công nhân   hệ thống báo động phát hiện rò rỉ khí gas Báo cáo thực tập công nhân   hệ thống báo động phát hiện rò rỉ khí gas
Báo cáo thực tập công nhân hệ thống báo động phát hiện rò rỉ khí gas
 
Settings
SettingsSettings
Settings
 
Chuong10
Chuong10Chuong10
Chuong10
 
Tài liệu PCL tổng hợp
Tài liệu PCL tổng hợpTài liệu PCL tổng hợp
Tài liệu PCL tổng hợp
 
Chuong2
Chuong2Chuong2
Chuong2
 
Giáo trình thí nghiệm vi điều khiển ứng dụng
Giáo trình thí nghiệm vi điều khiển ứng dụngGiáo trình thí nghiệm vi điều khiển ứng dụng
Giáo trình thí nghiệm vi điều khiển ứng dụng
 
Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520
 
Chuong5 hoạt động port nối tiếp
Chuong5 hoạt động port nối tiếpChuong5 hoạt động port nối tiếp
Chuong5 hoạt động port nối tiếp
 
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
 
Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]Giáo trình plc omron cp1 l 1h [unlockplc.com]
Giáo trình plc omron cp1 l 1h [unlockplc.com]
 

GUI C5- Timer.pdf

  • 2. Kiểm tra chương ngắt 1. Nêu tên các thanh ghi liên quan đến ngắt, chức năng các bit trong thanh ghi INTCON? 2. Nêu các chân ngắt ngoài và các chân ngắt PORTB của PIC16F887, có gì khác với PIC 16F877A? 3. Vẽ sơ đồ mạch nguyên lý, vẽ lưu đồ giải thuật và viết chương trình điều khiển 8 LED nối với PORTD theo yêu cầu: Khi có ngắt ngoài PORTD = 0xF0; Biết ban đầu 8 LED tắt; Fosc = 4MHz
  • 3. Nội dung chương 5 1. Timer 2. Đặc điểm, Sơ đồ khối của Timer 0 3. Các bước để định thời gian Timer 0 4. Các bước để đếm sự kiện Counter 0 5. Bài tập Timer 0 6. Đặc điểm, Sơ đồ khối của Timer 1 7. Các bước để định thời gian Timer 1 8. Các bước để đếm sự kiện Counter 1 9. Bài tập Timer 1 10. Đặc điểm, Sơ đồ khối của Timer 2 11. Các bước để định thời gian Timer 2 12. Bài tập Timer 2
  • 4.  Timer được sử dụng cho nhiều chức năng:  Định thì để tạo sự kiện  Đếm sự kiện  Tạo dạng sóng v..v  PIC16F877 có 3 timers – Timer0 – Timer1 – Timer2 Timers
  • 5. So sánh các Timer TIMER2 TIMER1 TIMER0 8-bits (TMR2) 16-bits (TMR1H:TMR1L) 8-bits (TMR0) Kích thước thanh ghi Fosc/4 Fosc/4 Fosc/4 Nguồn CLOCK (bên trong) None T1CKI pin or Timer 1 oscillator (T1OSC) T0CKI pin Nguồn CLOCK (bên ngoài) Prescaler (1:1,1:4,1:8) Postscaler (1:11:16) Prescaler 3-bits (÷1,÷2,÷4,÷8) Prescaler 8-bits (1:21:256) CLOCK SCALING AVAILABLE (Resolution) TMR2 matches PR2 (TMR2IF in PIR2) On overflow FFFFh0000h (TMR1IF in PIR1) On overflow FFh00h (TMR0IF in INTCON) Sự kiện ngắt và cờ ngắt NO YES NO Đánh thức PIC từ SLEEP
  • 6. Đặc điểm của Timer 0 Là Timer/Counter 8 bit Có thể đọc và ghi Có bộ chia trước 8 bit có thể lập trình bằng phần mềm Có thể lựa chọn nguồn xung clock bên trong hoặc bên ngoài Cho phép lựa chọn tác động cạnh cho xung clock bên ngoài Xảy ra hiện tượng ngắt khi tràn từ FFh00h
  • 7. Sơ đồ khối Timer 0 scaled clock TMR0 T0CKI pin Fosc/4 prescaler Watchdog Timer synchronize WDT out OPTION register RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 TMR0 Clock Source Select 1 = TOCK1, 0 = Fosc/4 Source Edge Select 1 = increment TMR0 on high-to-low transition 0 = increment TMR0 on low-to-high transition Prescaler Assignment 1= prescaler assigned to WDT 0= prescaler assigned to Timer 0 Prescaler Rate Select Bits TMR0 RATE PS0 PS1 PS2 1:2 0 0 0 1:4 1 0 0 1:8 0 1 0 1:16 1 1 0 1:32 0 0 1 1:64 1 0 1 1:128 0 1 1 1:256 1 1 1 8 DATA BUS
  • 8. scaled clock TMR0 T0CKI pin Fosc/4 prescaler Watchdog Timer synchronize 8 DATA BUS •Timer 0 có thể đọc/ ghi TMR0IF INTCON register • Xung clock bên ngoài (TOCKI) được sử dụng, nó sẽ được đồng bộ hóa với xung clock bên trong •Cờ ngắt Timer 0 sẽ được set khi có hiện tượng tràn TMR0 (FF00) Sơ đồ khối Timer 0
  • 10. Các bước để định thời gian Timer 0 B1: Tính toán các giá trị cần đưa vào code:  tdelay: thời gian cần định thời (us)  fOSC: tần số dao động thạch anh  Pre:hệ số chia tần trước prescaler(Pre=1,2,4...,256  [TMR0]: giá trị cần ghi vào thanh ghi TMR0 B2: Ghi vào TMR0 giá trị đã tính toán B3: Xóa cờ báo tràn( cờ ngắt) TMR0IF B4: Chọn chế độ hoạt động của Timer 0 • (chọn chế độ Timer, gán prescaler..) B5: Xác định thời điểm Timer 0 tràn bằng cách: • Kiểm tra cờ TMR0IF( nếu dùng thăm dò) • Xử lý ISR của Timer 0 (nếu dùng ngắt) Xác định được: TMR0 = TMR0IF = PSA = PS2 = PS1 = PS0 = T0SE = T0CS = Nếu dùng ngắt: GIE = TMR0IE =
  • 11.  TD = dem* Tdelay = dem * [256-TMR0] *4*(1/fosc)* PresT0  = dem* [256-TMR0] *4*(Tosc)* PresT0  = dem* [256-TMR0] *Tcy* PresT0 Tdelay min = 1 *Tcy* 2 = 2us max = 256 *Tcy* 256= 65,536ms a. TD = 100ms = dem * tdelay = 2 * 50ms  dem = 2; TMR0=61; TMR0IF =0 PresT0 =1:256) PS2=1; PS1=1; PS0=1; PSA=0 T0SE = 0 T0CS=0 b. TD = 500ms = dem * tdelay = 50 * 10ms  dem = 50 ; TMR0=; TMR0IF =0 PresT0 =1:X) PS2=x; PS1=x; PS0=x; PSA=0 T0SE = 0 T0CS=0 Ví dụ Fosc=4MHz Tcy = 1us
  • 12.  [TMR0] = 256 – [ tdelay/Tcy*PresT0]  = 256 – [1000us/1us*256) =  [0] <= 256 – [ tdelay/Tcy*PresT0]  PresT0 >= [ tdelay/ 256*Tcy] = 1000us/ 256*1us >=4 TMR0 0……….………………. …..255
  • 13. Các bước để đếm sự kiện Counter 0  B1: Xóa giá trị trong thanh ghi TMR0 =0  B2: Xóa cờ báo tràn( cờ ngắt) TMR0IF=0  B3: Chọn chế độ hoạt động của Counter 0 • Chọn chế độ đếm sự kiện (Counter) T0CS =1 • Kích hoạt hoặc không cho phép ngắt GIE=0, TMR0IE=0 • Gán giá trị prescaler cho Timer 0 PSA = • Chọn loại kích của nguồn xung bên ngoài T0SE=  B4: Đọc giá trị về và xử lý xung đếm trong thanh ghi TMR0. Lưu ý:
  • 14.  Ví dụ mô phỏng Lập trình khởi tạo cho timer0 để tạo thời gian trễ t=[256-0] *1us*16=4096us=4,1ms=0.0041s fosc= 4MHz Xác định: Giá trị ban đầu TMR0=0; Hệ số chia trước 1:16 (ps2=0; ps1=1; ps0=1)
  • 15. Khởi tạo giá trị cho Timer0 (hitech-C) TMR0 0 0 0 0 0 0 0 0 INTCON 0 OPTION_REG 0 0 0 0 0 0 1 1 TMR0IF This interrupt flag will set on Timer0 overflow even if interrupts are disabled PSA PS<2:0> TOCS Selects Timer 0 Clock Source (External or Internal) Prescaler Assignment (WDT or TMR0) Prescaler value = 1:16 1 ;Xóa giá trị đếm cho Timer0 ;Xóa TMR0 TMR0=0x00; ;Xóa cờ ngắt Timer0 TMR0IF TMR0IF=0; ;Thiết lập thanh ghi OPTION_REG ; ;với xung clock bên trong với bộ ;chia tần 1:16 BANKSEL OPTION_REG MOVLW b’00000011’ OPTION_REG=0x03 ;Kiểm tra cờ tràn TMR0IF nếu tràn ;thì tiếp tục while(!TMR0IF) {} <continue> 1 1 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 Timer0 incrementing Flag on overflow
  • 16. Ví dụ 1: Dựa vào sơ đồ viết lưu đồ giải thuật và viết chương trình tạo sóng xung vuông có tần số 500Hz tại chân RE1 và 2Hz tại chân RE2 dùng Timer 0 để định thời. Ta có: Td1 = 1/500Hz = 2ms  tdelayT0 = 1ms Td2 = 1/2Hz = 500ms = 250 Td1
  • 17. Begin Cấu hình các PORT digital Cấu hình các PORT E: output PORTE=0 COUNT=250 TMR0=6 TMRIF=0 Đặt chế độ Timer0 Pre=4 Timer0 TMR0IF =1? RE1=!RE1 COUNT- - COUNT =0? RE2=!RE2 LOOP1 LOOP2 Sơ đồ giải thuật:
  • 18. #include <xc.h> #define _XTAL_FREQ 4000000 unsigned char count; Code C: void main() { ANSEL=0x00; TRISE = 0b001; // E1& E2 la out PORTE = 0; loop: count=250; while(count--) { TMR0=6; T0CS=0; TMR0IF=0; PSA=0; PS2=0; PS1=0; PS0=1; while(!TMR0IF){} RE1=!RE1; } RE2=!RE2; goto loop; }
  • 19. Ví dụ 2: Dựa vào sơ đồ viết lưu đồ giải thuật và viết chương trình điều khiển đếm số lần nhấn nút SW0 được nối với ngõ vào của counter 0 (T0CKI) và hiển thị giá trị này trên 8 led đơn dùng counter 0.
  • 20. Begin Cấu hình các PORT digital Cấu hình các PORT C: output Đặt chế độ Timer0: Mode: Counter Prescaler:1:2 PrescalerWDT Sơ đồ giải thuật: Cấu hình chân nối RA4: input Đặt giá trị ban đầu cho bộ đếm(TMR0=0) Xóa cờ báo tràn Timer0 Đọc giá trị từ bộ đếm & xuất giá trị lên LED
  • 21. Code Mplabx-XC8  SV tự viết
  • 22. Bài tập Timer0 Bài 1: Viết chương trình delay 4ms dùng Timer 0 biết fOSC=4Mhz Bài 2: Chỉ dùng Timer 0 viết chương trình delay có thời gian lớn nhất biết fOSC=4Mhz. Bài 3: Cho sơ đồ giống như ví dụ 2. Viết chương trình khi nhấn nút SW0 thì số đếm giảm từ 2000 hiển thị trên 8 led đơn.
  • 24. Bài kiểm tra21/09/2023 lớp DHDTMT17ATT a. Viết chương trình có tên TD_ms() theo yêu cầu sau:  Biết tdelay=25ms; fosc=8MHz; Phải sử dụng module timer 0 để định thời gian. b. sử dụng chương trình trên làm chương trình delay, hãy viết chương trình điều khiển 8 led nối với portC của PIC 16f887 và các nút nhấn sw1 và sw2 và sw3 (theo kết nốicho trước), thực hiện theo yêu cầu sau: – Khi nhấn/nhả sw1( nối với RB0) 8 led sáng đuổi từ MSB  LSB. – Khi nhấn/nhả sw2( nối với RE0) 8 led sáng dần từ LSB  MSB. – Khi nhấn/nhả sw3( nối với RA4) 8 led tắt. Biết Fosc=8MHz ; thời gian chuyển giữa các trạng thái là Td = 100ms.
  • 25. Kiểm tra 20/09/2023 a. Viết chương trình có tên TD_ms() theo yêu cầu sau:  Biết tdelay=25ms; fosc=8MHz; Phải sử dụng module timer 0 để định thời gian. b. sử dụng chương trình trên làm chương trình delay, hãy viết chương trình điều khiển 8 led nối với PORTC thực hiện yêu cầu sau với sw1 và sw2 và sw3 (tự thiết kế mạch): - Khi nhấn nhả swi. với td=100ms
  • 26.  t_delay = 25 ms = 25000 us.  f_xtal = 8 MHz  t_xung=0.5 us.  Số lượng xung cần đếm: n_xung=50000.  Chọn tỉ lệ chia tần trước presT0 là 8 [với giá trị này, số xung cần đếm sẽ là 50000/8= 6250]  + Chọn số đếm cho TMR0 là 250  + Số lần đếm cờ báo tràn (TMR0IF) nIF = 25  Thanh ghi OPTION có: PS<2:0>= 010; PSA=0; T0SE=0; T0CS=0;  TMR0 = 256-250  TMR0IF=0;
  • 27. void Delay_25ms (void) { OPTION = 0B00000010; TMR0 = 6; unsigned char nIF=0; while (nIF<25) { while (TMRIF==0); TMR0IF=0; TMR0 = 6; nIF ++; } }
  • 28. Đặc điểm của Timer 1  Là Timer/Counter 16 bit gồm 2 thanh ghi TMR1H và TMR1L có thể đọc và ghi  Timer1 có thể hoạt động ở chế độ định thời hay đếm được lựa bởi bit TMR1CS.  Trong chế độ định thời T1 tăng giá trị ở mỗi chu kỳ lệnh, chế độ đếm bộ đếm tăng mỗi khi có cạnh clock ngõ vào bên ngoài  Có bộ prescale chia tần 3 bit  Xảy ra hiện tượng ngắt khi tràn từ FFFFh0000h  Có khả năng “đánh thức” vi điều khiển từ chế độ “ngủ” nhờ có thêm bộ dao động bên ngoài.
  • 29. Sơ đồ khối Timer1 T1CKI pin T1 OSC T1OS0 T1OSI prescaler synchronize Timer1 Control Register (T1CON) Chọn nguồn xung clock 1 = External (T1CKI) 0 = Internal (FOSC/4) LP Oscillator Enable 1 = T1OSC selected 0 = T1CKI can be used Fosc/4 scale T1CKPS0 T1CKPS1 1:8 1 1 1:4 0 1 1:2 1 0 1:1 0 0 Timer1 On 1 = Enable Timer1 T1GINV TMR1GE T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON TMR1H TMR1L Enable TMR1ON
  • 30. Timer1 External Clock Input Synchronization 1 = do not synchronize external clock input 0 = synchronize external clock input with internal clock (Fosc/4) Sơ đồ khối Timer1 T1CKI pin T1 OSC T1OS0 T1OSI prescaler synchronize Thanh ghi điều khiển (T1CON) Fosc/4 TMR1H TMR1L Timer1 Gate Enable and Timer1 Gate Invert are available on some devices Enable TMR1ON T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON T1GINV TMR1GE
  • 31.
  • 32. Các bước để định thời gian Timer 1  B1: Tính toán các giá trị cần đưa vào code: Đối với dao động nội: Đối với nguồn xung clock bên ngoài lấy từ bộ dao động Timer1 (thạch anh gắn trên 2 chân T1OS1 và T1OS0) Trong đó: tdelay: thời gian cần định thời (us) fOSC: tần số dao động thạch anh fOSC(T1): tần số dao động Timer1 Pre:hệ số chia tần trước prescaler(Pre=1,2,4,8) [TMR1]: giá trị cần ghi vào thanh ghi TMR1 TMR1H: Byte cao của [TMR1] TMR1L: Byte thấp của [TMR1] TMR1 =15536D = 3CB0H-> TMR1H =3CH =00111100B ; TMR1L=B0H = 10110000B;
  • 33. Các bước để định thời gian Timer 1  B2: Ghi vào thanh ghi TMR1( gồm TMR1H:TMR1L) được xác định ở trên  B3: Xóa cờ báo tràn (cờ ngắt) TMR1IF  B4: Chọn chế độ hoạt động của Timer1 • Chế độ định thời gian (Timer) • Kích hoạt hoặc vô hiệu hóa các ngắt • Chọn giá trị prescale  B5: Cho phép Timer1 bắt đầu hoạt động  B6: Xác định thời điểm Timer1 bị tràn bằng cách: • Kiểm tra cờ TMR1IF( nếu dùng thăm dò) • Xử lý ISR của Timer 1 (nếu dùng ngắt)
  • 34. Các bước để đếm sự kiện Counter 1  B1: Xóa giá trị trong thanh ghiTMR1  B2: Xóa cờ báo tràn (cờ ngắt) TMR1IF  B3: Chọn chế độ hoạt động của Counter 1 • Chế độ đếm sự kiện (Counter 1) • Kích hoạt hoặc vô hiệu hóa các ngắt(tùy chọn) • Chọn giá trị tỉ lệ của prescale • Chọn tính năng đồng bộ hoặc không đồng bộ xung  B4: Cho phép Counter 1 bắt đầu hoạt động  B5: Đọc về và xử lý số đếm xung đếm được trong thanh ghi TMR1(TMR1H:TMR1L)
  • 35.  Ví dụ mô phỏng Lập trình khởi tạo cho timer1 để tạo thời gian trễ td= fosc= 4MHz Xác định: Giá trị ban đầu TMR1H= ..; TMR1L= ..; Hệ số chia trước 1:8
  • 36. Main Code Start ;Xóa cờ ngắt Timer1 TMR1IF TMR1IF=0; ;Cho phép ngắt Timer1 TMR1IE=1; ;Cho phép ngắt toàn cục và ngắt ngoại vi PEIE=1; GIE=1; Thiết lập ngắt Timer1 (C) INTCON PIE1 1 GIE PEIE TMR1IE 1 1 PIR1 TMR1IF 0 TMR1H 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 TMR1L 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1
  • 37. Khởi tạo Timer1 (C) TMR1H 0 0 0 0 0 0 0 0 T1CON (Timer1 Control) Input clock prescale bits (T1CKPS<1:0>) TMR1L 0 0 0 0 0 0 0 0 PIR1 (Peripheral Interrupt Request) TMR1IF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 Clock source select bit (TMR1CS) TMR1ON 1 TMR1H:TMR1L INCREMENTING 1 OVERFLOW!! ;Xóa thanh ghi TMR1 TMR1H=0x00; TMR1L=0x00 ;Xóa cờ ngắt TMR1IF trong thanh ghi PIR1 TMR1IF=0; ;Setup T1CON register for internal clock ;with 1:8 prescaler, Timer1 is stopped ;and T1 osc is disabled T1CON=0xC0; ;Bật Timer 1 TMR1ON=1; ;Kiểm tra cờ ngắt Timer 1 while(!TMR1IF) {} Timer1 oscillator enable bit (T1OSCEN)
  • 38. Viết CT Delay_2s sử dụng Timer1  Tính toán: t_delay = 2s = 2000000 us; f_xtal = 8 MHz  t_xung=0.5 us Số lượng xung cần đếm: n_xung=4000000  Với Timer1: + Chọn tỉ lệ chia tần trước prescale là 8 + Chọn dung lượng đếm Timer1 là 50000 + Số lần đếm cờ báo tràn Timer1 là 10
  • 39. void Delay_2s (void) { T1CON=0B00110000; TMR1H=(65536-50000)/256; TMR1L=(65536-50000)%256; unsigned char nIF=0; TMR1IF=0; TMR1ON=1; while (nIF <10) { TMR1IF=0; TMR1H=(65536-50000)/256; TMR1L=(65536-50000)%256; nIF ++; } TMR1ON=0; }
  • 40. Ví dụ 3: Dựa vào sơ đồ viết chương trình điều khiển tạo sóng xung vuông có chu kỳ 100ms tại chân RE1 và 500ms tại chân RE2
  • 41. Begin Cấu hình các PORT digital, PORTE: output Cấu hình các PORT E: output count=5 TMR1IF=0 TMR1=15536 T1CON=b’00000001’ TMR1IF =1? RE1=!RE1 count - - count =0? RE2=!RE2 LOOP N Sơ đồ giải thuật dùng “thăm dò” : Y N Y
  • 42. #include<pic.h> unsigned char count; void main (void) { ADCON1=0x06; TRISE=0b001; PORTE=0; while(1) { count=5; while(count--) { TMR1IF = 0; TMR1H =0X3C; TMR1L = 0XB0; T1CKPS0 = 0; T1CKPS1 = 0; TMR1CS = 0; TMR1ON = 1; Code Hitech: while(!TMR1IF){} RE1=RE1^1; } RE2=!RE2; } }
  • 43. #include<pic.h> unsigned char count = 0x00; void interrupt Timer1_ISR(void) { TMR1IF = 0; TMR1L = 0XB0; TMR1H = 0X3C; RE1 = RE1 ^ 1; count++; if (count == 5) { RE2 = RE2 ^ 1; count = 0; } } Dùng ngắt: Code Hitech C: void main (void) { ADCON1=0x06; TRISE=0b001; PORTE=0; TMR1ON = 0; TMR1H = 0X3C; TMR1L = 0XB0; T1CKPS0 = 0; T1CKPS1 = 0; TMR1CS = 0; TMR1IE = 1; TMR1IF = 0; PEIE = 1; GIE = 1; TMR1ON = 1; while(1); }
  • 44. Ví dụ 4: Dựa vào sơ đồ viết chương trình điều khiển tạo sóng xung vuông có chu kỳ 2s tại chân RE1.
  • 45. Begin Cấu hình các PORT digital Cấu hình PORT E: output TMR1IF=0 TMR1=0x8000 T1CON=b’00001111’ TMR1IF =1? RE1=!RE1 LOOP N Sơ đồ giải thuật dùng “thăm dò” : Y
  • 46. #include<pic.h> #define _XTAL_FREQ 4000000 void main() { ADCON1=0x06; TRISE=0b000; PORTE=0; while(1) { TMR1IF=0; TMR1H=0x80; TMR1L=0x00; TMR1CS=1; T1OSCEN=1; T1SYNC=1; T1CKPS0=0; T1CKPS1=0; TMR1ON=1; Code Hitech C: while(!TMR1IF){} PORTE ^= 2; } }
  • 47. #include<htc.h> ….. #define _XTAL_FREQ 4000000 void interrupt isr(void) { if(TMR1IF && TMR1IE) { TMR1IF = 0; TMR1L = 0; TMR1H = 0x80; PORTE ^= 2; } } Dùng ngắt: Code Hitech C: void main() { ADCON1=0x06; TRISE=0b000; PORTE=0; TMR1H=0x80; TMR1L=0x00; TMR1IF=0; TMR1CS=1; T1OSCEN=1; T1SYNC=1; T1CKPS0=0; T1CKPS1=0; TMR1ON=1; TMR1IE=1; PEIE=1; GIE=1; while(1); }
  • 48. Bài tập Timer1 Bài 1: Viết chương trình delay 100ms dùng Timer1 biết fOSC=4Mhz Bài 2: Chỉ dùng Timer1 viết chương trình delay có thời gian lớn nhất biết fOSC=4Mhz Bài 3: Viết chương trình delay 10s dùng Timer 1 sử dụng bộ dao động bên ngoài gắn trên 2 chân RC1/T1OSI, RC2/T1OSO có f =32768 Hz
  • 49. Đặc điểm của Timer 2 Là Timer 8 bit có bộ prescale và postscale Được sử dụng như bộ tạo xung có PWM cho chế độ hoạt động PWM của khối CCP Thanh ghi TMR2 có thể đọc ghi và xóa khi bị reset Có bộ chia tần số trước prescale với bit điều khiển T2CKPS1:T2CKPS2 Ngõ ra TMR2 đi qua bộ postscale 4 bit để tạo ra yêu cầu ngắt TMR2 được chốt trong cờ TMR2IF(PIR1<1>) Tạo tín hiệu ngắt khi giá trị TMR2 bằng PR2 Chỉ sử dụng nguồn xung clock bên trong
  • 50. Sơ đồ khối củaTimer2 Scale T2CKPS 0 T2CKPS 1 1:1 0 0 1:4 1 0 1:16 X 1 Prescaler 1:1, 1:4, 1:16 COMPARATOR TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 Postscaler 1:1  1:16 Fosc/4 Timer2 ON 1 = Timer2 enabled TMR2 TMR2 OUTPUT PR2 Timer2 Control Register (T2CON)
  • 51. Sơ đồ khối củaTimer2 Prescaler 1:1, 1:4, 1:16 COMPARATOR TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 Postscaler 1:1  1:16 Fosc/4 Timer2 ON 1 = Timer2 enabled Scale T2CKPS0 T2CKPS1 1:1 0 0 1:4 1 0 1:16 X 1 TMR2 TMR2 OUTPUT PR2 SCALE TOUTPS0 TOUTPS1 TOUTPS2 TOUTPS3 1:1 0 0 0 0 1:2 1 0 0 0 1:3 0 1 0 0 1:4 1 1 0 0 1:5 0 0 1 0 1:6 1 0 1 0 1:7 0 1 1 0 1:8 1 1 1 0 1:9 0 0 0 1 1:10 1 0 0 1 1:11 0 1 0 1 1:12 1 1 0 1 1:13 0 0 1 1 1:14 1 0 1 1 1:15 0 1 1 1 1:16 1 1 1 1 Timer2 Control Register (T2CON)
  • 52. Prescaler 1:1, 1:4, 1:16 COMPARATOR TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 Postscaler 1:1  1:16 Fosc/4 TMR2 OUTPUT 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 PIR1 TMR2IF Timer2 Control Register (T2CON) TMR2 PR2 Sơ đồ khối củaTimer2 Load Period Register Start Timer2 Counting Flag set on first match with postscaler = 1:1 1 1 1 1 1 0 0 0
  • 53. Khi sử dụng Timer2 cần chú ý:  Khi mới cấp nguồn thì PR2=0xFF  Prescaler và Postscaler sẽ bị xóa khi: • Ghi dữ liệu vào TMR2 • Ghi dữ liệu vào T2CON • Bất cứ sự kiện reset nào((WDT,POR,BOR)  Khi reset vi điều khiển thì Prescaler và Postscaler sẽ bị xóa  TMR2 bị xóa khi ghi giá trị vào T2CON  TMR2 sẽ tăng giá trị từ 00h đến khi bằng PR2 sau đó TMR2 sẽ được reset về 0 vào chu kỳ tăng kế tiếp  Sự kiện ngắt khi TMR2=PR2 không thể làm “đánh thức” vi điều khiển khỏi chế độ “ngủ“.  Timer 2 ít dùng để định thời gian. Nó thường dùng cho CCP để tạo xung PWM
  • 54. Các bước để định thời gian Timer 2 B1: Tính toán các giá trị cần đưa vào code: Đối với dao động nội: Trong đó: tdelay: thời gian cần định thời (us) fOSC: tần số dao động thạch anh(Mhz) Pre: hệ số chia tần trước Prescaler(Pre=1,4,16) Post: hệ số chia tần sau Postscaler(Post=1,2,...,16) [TMR2]: giá trị cần ghi vào thanh ghi TMR2 [PR2]: giá trị cần ghi vào thanh ghi PR2 ௗ௘௟௔௬ ைௌ஼
  • 55. Các bước để định thời gian Timer 2 B2: Ghi vào thanh ghi PR2 giá trị đã tính toán B3: Xóa cờ báo tràn (cờ ngắt) TMR2IF B4: Chọn chế độ hoạt động của Timer 2  Kích hoạt hoặc vô hiệu hóa các ngắt  Chọn giá trị Pre  Chọn giá trị Post B5: Cho phép Timer 2 bắt đầu hoạt động B6: Xác định thời điểm Timer 2 bị tràn bằng cách:  Kiểm tra cờ TMR2IF (dùng thăm dò)  Xử lý ISR của Timer 2 (nếu dùng ngắt)
  • 56. Khởi tạo Timer2 (C) TMR2 (Timer2 Counter) 0 0 0 0 0 0 0 0 T2CON (Timer2 Control) PIR1 (Peripheral Interrupt Request) TMR2IF PIE1 (Peripheral Interrupt Enable) TMR2IE 0 0 1 0 0 0 0 1 1 1 ;Disable the Timer2 interrupts in the PIE1 ;Cấm ngắt Timer2 trong thanh ghi PIE1 ;Xóa cờ ngắt TMR2IF trong thanh ghi PIR1 TMR2IE=0; TMR2IF=0; ;Setup thanh ghi T2CON Postscaler = 1:15, ;Prescaler = 1:16, Timer2 off T2CON=0x72; ;Xóa thanh ghi TMR2 TMR2=0; ;Khởi tạo giá trị PR2 PR2=0x80 ;Timer2 bắt đầu đếm lên TMR2ON=1; ;Kiểm tra cờ ngắt TMR2IF while (!TMR2IF) {} 1 Postscaler = 1:15 (TOUTPS<3:0>) TMR2ON Prescaler = 1:16 (T2CKPS<1:0>) 1 PR2 (Period Register Timer2) 0 0 0 0 0 0 0 1 Flag is set Timer2 Incrementing 1 1 1 1 1 1 1 1 1 1 1 1
  • 57. Ví dụ 5: Dựa vào sơ đồ viết chương trình điều khiển tạo sóng xung vuông có tần số 10Hz và 100Hz tại chân RE1 và RE2.
  • 58. Begin Cấu hình các PORT digital Cấu hình PORT E: output, PORTE=0 TMR2IF=0 PR2=249, count=0 T2CON=b’00100001’ (Pre=1:4,Post=1:5) count =10? ISR: N Sơ đồ giải thuật dùng ngắt : Y TMR2IE=1 PEIE=1 GIE=1 TMR2IF=0 RE1=!RE1 count++ count=0 RE2=!RE2 RETFIE
  • 59. #include<pic.h> #define _XTAL_FREQ 4000000 unsigned char count = 0x00; void interrupt Timer2_ISR(void) { TMR2IF = 0; RE1 = RE1 ^ 1; count++; if (count == 10) { RE2 = RE2 ^ 1; count = 0; } } Dùng ngắt: Code Hitech C: void main (void) { ADCON1=0x06; TRISE=0b001; PORTE=0; PR2=249; TMR2IF=0; TOUTPS3=0; TOUTPS2=1; TOUTPS1=0; TOUTPS0=0; T2CKPS1=0; T2CKPS0=1; TMR2ON = 1; TMR2IE=1; PEIE=1; GIE=1; while(1); }
  • 60. Bài tập Timer2 Bài 1: Viết chương trình delay 1ms dùng Timer2 biết fOSC=4Mhz Bài 2: Chỉ dùng Timer2 viết chương trình delay có thời gian lớn nhất biết fOSC=4Mhz
  • 61. Bài tập tổng hợp Bài tập tổng hợp Bài 1: Viết chương trình delay 1s dùng Timer0, Timer1, Timer2 biết fOSC=4Mhz Bài 2: Viết chương trình tạo xung 10Hz trên chân RB7 Bài 3: Viết chương trình tạo xung có tần số 20Hz trên chân RB0, chu kỳ nhiệm vụ D=40%. Bài 4: Viết chương trình đếm sự kiện tại chân T0CKI kết quả được hiển thị số đếm trên 8 led nối với PORT B biết xung clock tác động từ mức cao xuống thấp.