Добрый день всем!
Помогите пожалуйста с алгоритмом опережения зажигания...
Просто уже мозг дымит после целой недели попыток....
У меня имеется контроллер
Attiny2313
индикатор семисегментный на 4 разряда из периферии прерывание по входу
INT0
и два таймера.
алгоритм вижу такой:
завожу сигнал с датчика на вход INT0
настраиваю на любое срабатывание прерывания.
при срабатывании прерывания по подьему фронта запускаю таймер при срабатывании прерывания по спаду копирую в переменную обнуляю счетчик, и продолжаю считать когда происходит опять прерывание копирую в другую переменную и опять обнуляю счетчик первая переменная несет скважность между импульсами а вторая длинну импульса. После всего этого подмешиваю данные с массива и вставляю значения в регистры совпадения для копирования импульса с задержкой.
Все попытки заставить правильно работать ни чем хорошим не закончились...... импульсы хаотично разбрасываются.....
Подскажите более адекватный алгоритм.
PS индикатор для вывода частоты оборотов двигателя, пока только это и работает и тоже кривовато....
[HTML]interrupt [EXT_INT0] void ext_int0_isr(void)
{
timer1=START; // включаем таймер
if(!(PIND.2))
{
LED=0;
x++;
TCNT1=0;
}
else
{
x++;
/*if(data›200)*/LED=1; // повторяем импульс если низкие обороты
//data = TCNT1;
/* if(data‹200)
{
i = data;
}*/
TCNT1=0;
}
}[/HTML]
тут инкрементируем импульсы при событии.
[HTML] if(++start › 50)
{
if(++timer›=100)
{
#asm("cli")
x/=2;
data=x;
timer=start=x=0;
}
if (timer==0)
{
#asm("sei")
}
start=51;
}
delay_ms(10);[/HTML]
тут мы забираем насчитанные импульсы
Всем буду очень благодарен за помощь!
С ув. Артем