การใช้งานไทเมอร์ 0 ของ PIC16F877

     ไทเมอร์เป็นส่วนสำคัญสำหรับไมโครคอนโทรเลอร์ PIC เพื่อนำมาสร้างฐานเวลา โดยไท
เมอร์ 0 มีขนาด 8 บิต สามารถใช้กำเนิดสัญญาณอินเทอร์รัปต์เมื่อเกิดการนับค่าเกินหรือ
โอเวอร์โฟลว (overflow)
     การกำหนดให้ไทเมอร์ทำงานในโหมด ไทเมอร์หรือเคาน์เตอร์จะขึ้นอยู่กับการนับสัญญาณ
ถ้าเป็นการนับสัญญาณนาฬิกาจากภายในก็ทำงานเป็นตัวตั้งเวลาหรือไทเมอร์ แต่ถ้าเป็นการ
นับสัญญาณจากภายนอกก็จะเป็นตัวนับหรือเคาน์เตอร์
การใช้งานไทเมอร์ 0 ด้วยโปรแกรม CCS
ฟังก์ชั่น setup_timer_0() กับการใช้งานในโหมดไทเมอร์ 0
     รูปแบบการใช้งาน
          setup_timer_0(mode)
          โดยที่ mode คือ ค่าคงที่ที่กำหนดไว้ในเฮดเดอร์ มีรายละเอียดดังนี้

           Mode                                                      ความหมาย
           RTCC_INTERNAL                                รับสัญญาณนาฬิกาภายในไมโครคอนโทรเลอร์
           RTCC_EXT_L_TO_H                            รับสัญญาณนาฬิกาที่เปลี่ยนจากลอจิกต่ำ่ไปสูงจากภายนอก
           RTCC_EXT_H_TO_L                            รับสัญญาณนาฬิกาที่เปลี่ยนจากลอจิกสูงไปต่ำจากภายนอก
           RTCC_DIV_2                                         อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 2
           RTCC_DIV_4                                         อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 4
           RTCC_DIV_8                                         อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 8   
           RTCC_DIV_16                                       อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 16
           RTCC_DIV_32                                       อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 32
           RTCC_DIV_64                                       อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 64
           RTCC_DIV_128                                     อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 128
           RTCC_DIV_256                                     อัตราส่วนการทำงานของปรีสเกลเลอร์ 1 : 256
ฟังก์ชั่น set_timer0() สำหรับเซตไทเมอร์ 0
     รูปแบบการใช้งาน
          set_timer0(value)
          โดยที่ value คือ กำหนดค่าเริ่มต้นในการนับให้กับไทเมอร์ 0 มีค่าตั้งแต่ 0 - 255
ตัวอย่างการใช้งาน
     เป็นวงจรกำเนิดความถี่ 200 Hz โดยใช้ไทเมอร์ 0 เป็นตัวสร้างฐานเวลา และเปิดใช้อินเทอร์รัปต์ไทเมอร์ 0 โดยกำหนด
ให้ไทเมอร์ 0 เกินโอเวอร์โฟลว ทุกๆ 5 ms และให้พอร์ B บิต 0 ติดดับ เมื่อเกิดอินเทอร์รัปต์ไทเมอร์ 0

#include <16F877.h>
#fuses HS
#fuses NOLVP
#fuses NOWDT
#fuses NOPROTECT
#use    delay(clock = 20000000)

#INT_TIMER0
void Isr_TMR0(void)
{
     output_toggle(PIN_B0); // Toggle PORTB.0
}


void main (void)
{
     enable_interrupts(INT_TIMER0);
     enable_interrupts(GLOBAL);

     setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
     set_timer0(61);
     
          while(true)
               {
                ;// Statement   
               }
}

ฟังก์ชั่น get_timer0() สำหรับอ่านค่าไทเมอร์ 0
     รูปแบบการใช้งาน
          value = get_timer0() 
          โดยที่ value คือ ตัวแปรสำหรับเก็บค่าที่อ่านจากไทเมอร์ 0

ผลการทำงาน
     PORTB.0 จะสลับติดดับ ทุกๆ 5 ms  

การคำนวณเวลา
     TMR0 = 256 - (Tdelay / PR) x (Fosc / 4)

เมื่อ
     TMR      คือ ค่าที่กำหนดให้กับฟังก์ชั่น set_timer0()
     Tdelay    คือ ค่าหน่วงเวลาในหน่วยวินาที 
     PR         คือ ค่าของปรีสเกลเลอร์
     Fosc      คือ ความถี่ของสัญญานนาฬิกาหลักในหน่วยเฮิรตซ์

ดังนั้น
     TMR = 256 - (5 ms / 128) x (20 Mhz / 4)
     TMR = 61 

CODE
กลับสู่หน้าหลัก