|
|
|
|
|
|
|
|
|
|
Timer0
(Timer/Counter/WatchDog timer) |
|
|
|
|
|
หลักการใช้งาน
Timer0 เป็นตัวตั้งเวลา (Timer)
|
|
|
-
สัญญาณนาฬิกาที่ได้ จะได้จากสัญญาณนาฬิกาจากภายใน โดยจะมีความถี่เท่ากับ F=
fosc/4 |
|
|
-
การเพิ่มขึ้นของ Timer0 จะเพิ่มขึ้นตามจังวังของสัญญาณนาฬิกาจากภายใน
หากมีการเขียนข้อมูล TMR0 ด้วยฟังก์ชั่น set_timer0(); จะทำให้
Timer0 หยุดไป 2 cycle และไม่สามารถอ่านได้ในช่วงนี้
เมื่อใช้ Timer0 ในการวัดคาบเวลา จะต้องบวกค่าเวลาไปอีก
2 cycle จึงจะได้เวลาที่ถูกต้อง
|
|
|
|
|
|
เมื่อเราต้องการหน่วงเวลา
150 us ที่ความถี่ 4 MHz จะได้คาบเวลา fosc เท่ากับ 4/4x10^6 = 1 us |
|
|
เมื่อ
timer0 นับ 1 จะมีคาบเวลาเท่ากับ 1 us |
|
|
หากต้องการให้หน่วง
150 us จึ่งต้องนับ 150 ครั้ง |
|
|
ค่าเริ่มต้นที่ต้องโหลดให้
TMR0 = 256-150 =106 |
|
|
เมื่อให้
timer0 เริ่มนับก็จะนับต่อไปจาก 106 จนถึง 255 แล้วเปลี่ยนเป็น 0 ก็จะได้จำนวนนับเท่ากับ
150 ครั้งพอดี |
|
|
|
|
|
วิธีการคำนวน |
|
|
เมื่อไม่ใช้
prescaler คาบเวลาที่ต้องการหาได้จากสมการ |
|
|
|
|
|
Td
= cycle * T |
สมการที่
1 |
|
Td = cycle *(4/fosc ) |
|
|
cycle
= Td /(4/fosc ) |
|
|
|
|
|
Td
เป็นคาบเวลาทั้งหมด ,cycle เป็นจำนวนรอบการนับ ,fosc เป็นความถี่ของ
XTAL, Tเป็นคาบเวลาของสัญญาณนาฬิกาของระบบ |
|
|
เมื่อใช้
prescaler |
|
|
Td =(cycle*(4/fosc
))*PR |
จะได้คาบเวลาเพิ่มขึ้นเป็นจำนวนเท่าของ
PR |
หรือ |
cycle
= (Td/Pr) /(4/fosc ) |
|
|
cycle
= (Td/Pr) *(fosc/4 ) |
สมการที่
2 |
|
|
|
Pr
เป็นค่าของ prescaler |
|
|
|
|
|
|
|
|
|
ดังนั้นสูตรการหาค่าเริ่มต้นในการนับของ
TMR0 ในการใช้งานโหมด timer |
|
|
-ใช้สัญญาณนาฬิกา
จากแหล่งกำเนิด สัญญาณภายใน |
|
|
|
TMR0
= 256-cycle |
|
|
TMR0
= 256-(Td/Pr) /(4/fosc ) |
|
|
TMR0
= 256-(Td/Pr) *(fosc/4 ) |
สมการที่
3 |
|
|
|
|
TMR0
เป็นค่าที่จะต้องโหลดเข้า timer0 ,Pr เป็นค่าของ prescaler |
|
Td
เป็นคาบเวลาทั้งหมด ,fosc เป็นความถี่ของ XTAL |
|
|
|
|
|
|
|
|
|
สูตรการหาค่าเริ่มต้นในการนับของ
TMR0 ในการใช้งานโหมด Counter |
|
|
-ใช้สัญญาณนาฬิกา
จากแหล่งกำเนิด สัญญาณภายนอก ผ่านขา RA4/TOCKI |
|
|
-
การอ่านค่าจากสัญญาณภายนอก จะต้องสอดคล้องกันกับสัญญาณภายใน ดังนั้นคาบเวลาของสัญญาณภายนอกที่เข้ามาทางขา
RA4 นั้นควรมีค่าอย่างน้อยเป็น 2 เท่า ของค่าสัญญาณภายใน |
|
|
|
|
|
|
TMR0
= 256-(Time/Pr) *fext |
สมการที่
4 |
|
|
|
|
TMR0
เป็นค่าที่จะต้องโหลดเข้า timer0 ,Time ค่าเวลาของการนับ มีหน่วยเป็น
วินาที |
|
fext
คือความถี่ของสัญญาณนาฬิกาจากภายนอก ที่เข้ามาทางขา RA4/TOCK1 |
|
|
|
|
|
|
|
|
|
การคำนวนหาคาบเวลาสูงสุด
tdmax |
|
|
TMR0 =256-cycle = 0 คือ cycle มีค่าเท่ากับ 256 |
|
|
ค่าเริ่มต้นในการนับ
TMR0 = 0 (timer จะนับ 0-255) และค่า prescaler มีค่าสูงสุด PR=256 |
|
|
|
|
|
จาก
สมการที่ 2 |
|
|
|
cycle=(Td/Pr)*(fosc/4
)=256 |
|
|
Td
= 256*(4/fosc)*PR |
|
|
Tdmax
= 256*(4/fosc)*256 |
PR=256 |
|
Tdmax
= 65536*(4/fosc) |
|
|
Tdmax
= 262144/fosc |
สมการที่
4 |
|
|
|
|
|
|
|
|
|
เช่น
fosc = 4 MHz ค่าคาบเวลาสูงสุดที่ timer0 จะทำได้คือ |
|
|
262144/4*10^6
= 0.065536 sec หรือ 65.536 ms |
|
|
|
|
|
|
|
|
การใช้งาน
WatchDog timer (WDT) |
|
|
การใช้งาน
Timer0 ด้วยภาษา C |
|
|
ตัวอย่างการใช้งาน
Timer0 ในการหาคาบเวลา |
|
|
|
|
|
|
|