外部时钟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);
}
}
|