ขอคำปรึกษาเรื่อง โค๊ดภาษา C โดยใช้ timer ครับ

กระทู้คำถาม
#include <16f877a.h>
#use delay(clock=20M)
#include <LCD.c>
#fuses hs,nowdt,nocpd,nolvp,noprotect
#define use_portb_lcd
#byte portc=0x07
#bit  led=portc.4

volatile unsigned int32 f_count;
volatile unsigned int32 t1_count;
volatile unsigned char  t2_count;
volatile unsigned char  t2_ovf;

#int_TIMER1
void  TIMER1_isr(void)
{  
      t1_count += 65536;//65536  is maximum timer1 count
}

#int_TIMER2
void  TIMER2_isr(void)
{   if(++t2_count > 78)            // Overflow 1000ms
   {   f_count = get_timer1();   set_timer1(0);   // Fetch Timer1
      f_count += t1_count;   t1_count = 0;   // Sum.   Timer1 Overflow
      t2_count = 0;       t2_ovf   = 1;   // Clear/Set
   }
}

void main(void)
{
  
     lcd_init();
   lcd_gotoxy(1,1);
      printf(lcd_putc,"Frequency");
    

   set_tris_c(0x00);
   led=1;
   delay_ms(100);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);      // External Clock
   //setup_timer_2(T2_DIV_BY_16,234,16);      // Overflow 20ms @12MHz
   setup_timer_2(T2_DIV_BY_16,81,16);      // Overflow 12.5ms @20MHz

   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);

   while(1)
   {
      if(t2_ovf)
      {   t2_ovf = 0;

        
        
        lcd_gotoxy(1,2);
       printf(lcd_putc,"%lu KHZ",f_count);
      }
   }
}

ผมทำวงจรเกี่ยวกับ "วงจรนับความถี่" โดยใช้ timer 2 ตัวเป็นตัวนับความถี่ แต่ผมยังไม่เข้าใจเกียวกับการทำงานของ timer มากนัก จึงคำนวณการเกิด interrupts overflows ได้ไม่แน่นอน (ยังมั่วๆอยู่) จึงส่งผลให้ค่าที่แสดงความถี่ยังไม่เที่ยงตรง จึงขอคำปรึกษาเกียวกับ ทฤษฏีและหลักการของ timer และถ้าหากท่านใดอธิบายการทำงานของโปรแกรมในส่วน timer ที่ผมดังแสดงไว้ข้างต้น จะเป็นการดีมากเลยครับ ว่ามันคำนวณอย่างไร ควรใช้ค่าใด ขอความอนุเคราะห์มา ณ ที่นี้ด้วยครับ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่