Разрабатываю устройство для распределения зажигания для 6-ти цилиндрового двигателя внутреннего сгорания.
Мною была начата тема в разделе "Теория" http://radiokot.ru/forum/viewtopic.php?f=21&t=50763 и в ходе обсуждения я пришёл к выводу, что удобнее и проще делать на МК.
Единственный МК, который оказался у меня в наличии ATmega8. Пользуюсь пакетом WinAVR.
На входе МК сигнал с датчика положения коленчатого вала (синусоида с синхроимпульсами в виде той же синусоиды с частотой в 2 раза меньшей):

Амплитуда от 0.5 В до 250 В на максимальных оборотах (6 000 об/мин).
Так же ещё будет сигнал с датчика массового расхода воздуха (аналоговый сигнал).
Пока собираюсь только разобраться с датчиком коленвала.
Сигнал с датчика коленвала подаю на компаратор, получаю прямоугольный ипмпульсы, которые подаю на вход ICP1 МК. Для измерения длительности импульсов использую Input Capture Unit 1-ого таймера (срабатывание на нисходящем фронте). Изначально таймер выключен (на МК подаётся питания при повороте ключа в положение "зажигание"), при попадании первого нисходящего фронта на входе включается таймер (считаю что вполне подходит деление тактовой частоты процессора на 8 ).
Код прерывания:
Код: Выделить всё
ISR(TIMER1_CAPT_vect)
{
unsigned int capture = ICR1;
TCNT1 = 0x0000;
if (bit_is_clear(TIFR, TOV1)) // Если таймер не был переполнен, то продолжаем
{
if (TCCR1B == 0x00)
{
TCCR1B |= _BV(CS11); // Включение таймера, если он был выключен
}
else
{
if (lastImp == 0)
{
lastImp = capture; // если это первый импульс, то лишь сохраняем его длительность
}
else
{
if (capture > 1.5 * lastImp)
{
toothNum = 0; // синхроимпульс определяется по его периоду
syncImp();
}
else
{
toothNum++;
}
}
}
}
else
{
TCCR1B = 0x00; // Если таймер был переполнен,
TIFR |= _BV(TOV1); // то чистим флаг и показания таймера
}
}
И вот получается, что как-то долго этот код весь выполняется...

После синхроимпульса проходит 31.1 мкс! много слишком! (тактовая частота 12 MHz)
Не подскажите как оптимизировать код? Я вот вообще думаю, что придется писать на ассемблере эту часть.
P.S. Исходный код на Си в приложении
надо бы как-нибудь избавиться от умножения...
