екундомір запущений - інкрементіруем його свідчення
if (btTimerOn)
{(+ + byTcnt == 10)
{= 0;
if (+ + wTime == 60000) = 0;
}
}
}
Літінг 4.6 - Обробка переривань від керуючих імпульсів
interrupt [EXT_INT0] void RPM_PULSE_interrupt (void)
{lTmp; & = ~ 0x40; (btFirstLowRateFlash)
{
// Перший імпульс, скидаємо лічильник періоду і
// лічильник імпульсів = 0; = 0; = 0;
TIFR = 0x02; B = 0x03;// FCK/64 (62.5 KHz)
TCNT0 = 0; | = 0x02;// Дозволяємо переривання від TMR0 = FALSE;
}
{+ +;
// Перевіряємо, чи не час закінчити вимірювання
if (wTimerOvfCnt> TIMER_OVF_ENOUGHT)
{B = 0;// Зупиняємо TMR0 & = 0x40;// Забороняємо переривання від INT0 & = ~ 0x02;// Забороняємо переривання від TMR0 (TIFR & 0x02) + +;// Враховуємо можливість переповнення
lTmp = (62500L * 60L * (long) wFlashCnt) ;/ = ((wTimerOvfCnt <<8) + TCNT0) ;/ = byBladeCnt; = lTmp;
// Перезапускаємо вимірювання = TRUE; = 0; = 0; B = 0x03;// FCK/64 (62.5 KHz)
TCNT0 = 0; = 0x02; | = 0x02;// Дозволяємо переривання від TMR0
// GIFR = 0x40;
}
} = 0x40; | = 0x40;
}
Лістинг 4.6 - interrupt [TIM0_OVF] void TIMER0_interrupt (void)
{+ +;
// Якщо імпульсів не було дуже довго, то показуємо
// 0 оборотів і запускаємо вимір заново (wTimerOvfCnt> NO_PULSES_INTERVAL)
{= 0; = TRUE; = 0;
}
}
Лістинг 4.7 Головний функція. Ініціалізація всіх модулів. Цикл виклику робочих підпрограм
void main (void)
{
// Crystal Oscillator division factor:
# pragma optsize-= 0x80; = Prescaler;// 0x00 - для кварцу 4MHz, 0x01 - для кварцу 8MHz ...
# ifdef _OPTIMIZE_SIZE_
# pragma optsize +
# endif
# asm ("cli"); = 0x00;// Забороняємо SLEEP, режими переривання поки не важливі.
// У принципі, цього можна і не робити. = 0x00;// Забороняємо зовнішні переривання = 0xFF;// Очищаємо прапори переривань = 0x00;// Забороняємо переривання від таймерів = 0xFF;// Очищаємо прапори переривань
// Розряд DDRx - визначає напрямок передачі даних (0 - вхід, 1 - вихід). <...