外部時鐘8M,捕捉中斷T1采用8分頻,這樣每個時鐘周期為8us,一個65535記錄的最長時間為524280us,定時器0和定時器2用于顯示
現在高轉速還有低轉速都能正常顯示,但當轉速沒有的時候,不能清零,我也是初學者,弄了好幾天了,求教各位大神,幫幫忙。
//ICPC1捕捉中斷的時候,T1的初始化
void tc1_init()
{
TCCR1B=0X43;//64分頻,
TIMSK1=0X21;
SREG|=0X80;
}
#pragma interrupt_handler TC1_yichu:10 //T/C1溢出中斷
void TC1_yichu()
{
ov_counter++;
}
#pragma interrupt_handler TC1_buzhuo:7 //T/C1捕捉中斷 發動機轉速
void TC1_buzhuo()
{
if(icp_n==1) //測量一個信號的時間
{
falling_edge=ICR1L;
temp=ICR1H;
falling_edge|=temp<<8;
TCNT1H=0;
TCNT1L=0;
buhuobiaozhiwei=1;
TIMSK1=0X00; //這個必須要,不是時間就是亂的
}
else if(icp_n==0)
{
rising_edge=ICR1L;
temp=ICR1H;
rising_edge|=temp<<8; //上升沿的時間
}
icp_n++;
}
void T2_init()
{
TCCR2A=0X0C; //外部時鐘 ,64分頻,CTC模式 8M/64=125khz
TCNT2=0X00;
//OCR2A=0X63; //OCR2A=0X63(99),(99+1)/1000=0.1MS
OCR2A=0XF9; //2MS
TIMSK2|=0X02;
}
#pragma interrupt_handler t2:5
void t2()
{
T2_yichu=1;
SEI();// 開中斷,允許中斷嵌套,T/C0中斷可打斷該中斷服務
display();
}
/////////////主函數////////////////////
void main()
{
DDRD &=~(1<<PD0); //方向輸?
PORTD|=BIT(0); //方向輸?
tc1_init();
T2_init();
IO_init();
uart_init(9600);
SREG|=BIT(7); //全局中斷開放
while(1)
{
if(buhuobiaozhiwei) //完成一次測量
{
if(falling_edge >=rising_edge)
{
pulse_clocks = (ulong)falling_edge -(ulong)rising_edge;
}
else
{
pulse_clocks = (ulong)falling_edge -(ulong)rising_edge+(ulong)ov_counter*65535*8;
}
pulse_clocks=pulse_clocks*8;
fadongjizhuansu=60000000/pulse_clocks;
fadongjizhuansu_TXB=fadongjizhuansu;
icp_n=0;
TIFR1=0X21;
TIMSK1=0X21;
ov_counter=0;
buhuobiaozhiwei=0;
if(T2_yichu)//顯示
{
freq_to_disbuff();
T2_yichu=0;
}
}
caiji_data();
uart_TXB();
delay_MS(100);
}
}
|