#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 ที่ผมดังแสดงไว้ข้างต้น จะเป็นการดีมากเลยครับ ว่ามันคำนวณอย่างไร ควรใช้ค่าใด ขอความอนุเคราะห์มา ณ ที่นี้ด้วยครับ
ขอคำปรึกษาเรื่อง โค๊ดภาษา C โดยใช้ timer ครับ
#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 ที่ผมดังแสดงไว้ข้างต้น จะเป็นการดีมากเลยครับ ว่ามันคำนวณอย่างไร ควรใช้ค่าใด ขอความอนุเคราะห์มา ณ ที่นี้ด้วยครับ