цитирую принцып работы устройства автора
"происходит постоянный опрос входов по замкнутому циклу с частотой 10000000 раз в секунду (кварц 10 МГц.). Как только сектор входит в датчик холла на одном из входов появляется сигнал, программа переходит в подпрограмму где подает питание на один из выходов и включает катушку какогото цилиндра, обнуляет счетный регистр таймера 1 и запускает сам таймер счетчик 1 с предделителем на 64, дожидается выхода сектора, как только он выйдет сигнал исчезает и число до которого досчитал счетчик копируется в двойной регистр X. (так измеряется частота вращения коленвала в данный конкретный момент, по длине импульса). Затем программа добавляет к значению Х регистр r2 (величину отставания, ниже рассмотрим откуда она берется) и ждет когда счетчик досчитает до величины Х, как только это произойдет процессор выключает катушку (происходит искра), выключает таймер счетчик 1, вычитает из Х - r2 (Х становиться таким как был до прибавления) и приступает к следующей, самой важной части: в зависимости от величины регистра X (длины импульса) вычисляет размер отставания для следующей вспышки и помещает его в регистр r2. Затем снова переходит в режим опроса входов. Как только сектор входит во второй датчик холла сигнал появляется на втором входе, программа снова включает уже вторую катушку, обнуляет регистр таймера 1, включает таймер 1 и ждет окончания импульса, по выходу сектора копирует число до которого успел досчитать счетчик в регистр X и прибавляет к нему r2, ожидая пока таймер досчитает до величины X (величина длины импульса с добавлением отставания момента зажигания от момента выхода сектора), как только он досчитает выключает катушку (искра), вычисляет величину отставания для следующей вспышке в зависимости от длинны импульса предыдущей."

Ах да, чуть незабыл, автор использует 2 датчика холла, а я использую всего одну оптопару, что немного упрощает задачу, но темнемение, всеравно непредставляю как это реализовать!



Смотрите примеры, если там написано на асме: