определение переменных:
volatile unsigned char timer1_ovf_counter=0; // Cколько раз переполнялся таймер1 счёта импульсов
unsigned char timer1_ovf_counter_summ=0; // Cколько раз переполнялся таймер1 счёта импульсов - результирующее значение
unsigned char timer2_clock=0; // Необходимо для отсчёта времени 1 сек таймером 2
unsigned char timer1_counterH; // Старший байт таймера счёта по окончанию 1 сек
unsigned char timer1_counterL; // Младший байт таймера счёта по окончанию 1 сек
unsigned int frequency_tmp; // промежуточная переменная для расчета частоты
инициализация таймеров:
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
// Mode: CTC top=OCR0
// OC0 output: Disconnected
TCCR0=0x0D;
TCNT0=0x00;
OCR0=0x9C;
// Timer/Counter 1 initialization
// Clock source: T1 pin Rising Edge
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x07;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x0F;
TCNT2=0x00;
OCR2=0x9C;
// Timer(s)/Counter(s) Interrupt(s) initialization
//TIMSK=0x02;
//TIMSK=0x06;
TIMSK=0x86;
функции прерываний:
// Timer2 отсчитывает 1 сек интервал и сохраняет значения счетчиков для расчета скорости
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
timer2_clock++;
//если значение счетчика равно 50 (20 мсек*50 = 1 сек) то запоминаем значения счетчиков таймеров
if (timer2_clock == FRQ_CLOCK){
timer1_counterL=TCNT1L;
timer1_counterH=TCNT1H;
TCNT1H=0x00;
TCNT1L=0x00;
timer1_ovf_counter_summ=timer1_ovf_counter;
timer1_ovf_counter=0;
timer2_clock=0;
// Расчет числа импульсов прошедших за период таймера2 с входа T1 таймера1
frequency=timer1_ovf_counter_summ;
frequency=frequency << 16;
frequency_tmp=timer1_counterH;
frequency_tmp=frequency_tmp << 8;
frequency_tmp=frequency_tmp+timer1_counterL;
frequency=frequency+frequency_tmp;
///получили текущую скорость и выполнили суммирование
avg_speed = ceil(frequency*SPEED_SENSOR_TYPE);
}
}
// Timer1 - вызов прерывания переполнения с каждым импульсом с датчика скорости
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
timer1_ovf_counter++;
}
и после этого в основном цикле выводим значение avg_speed:
sprintf(lcd_buffer,"%u км/ч ",avg_speed);
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);



