Radist писал(а):
Сидим в главном цикле, ждем обнуления таймера. Дождались - выдали единичку и ждем когда ее надо будет убрать. Дождались, убрали. Ждем когда время станет 2 мс. Дождались, выставили единичку второй серве. Ждем когда ее надо убрать. Дождались - убрали. Снова ждем обнуления таймера.
Так нельзя

При таком алгоритме "в лоб" у проца на 16 Мгц хватит быстродействия на несколько серв, дальше будет низкая точность, причем максимальное число серв по этому алгоритму - 8.
Но эта часть задачи я сделал, тут проблем нет.
А вот с анализом все не так просто

Проблема в том, что импульсы от 2х сигналов, которые надо анализировать приходят в разные моменты времени, иногда накладываясь друг на друга, иногда нет. Иногда 1 импульс раньше, иногда другой, они между собой не связаны.
И свои импульсы надо выдавать именно в промежуток времени, когда оба они прошли и до следующих есть хотябы 2500 мкс, иначе либо искажаются входные данные либо выходные становятся не синхронными и происходит дрожание серв.
А проблема в том, что пока проц сидит в обработчике прерываний, другие прерывания не выполняются, и переход по ним происходит только после окончания обработчика, что вызывает искажение данных.
Обработчики внешних прерываний короткие - там только время с таймера записывается, а вот выдача сигналов на сервы занимает около 2500 мкс (сами импульсы + секвенсор).
Т.о. Если решить задачу в лоб получается например: 2 импульса по 1500 на внешних прерываниях
1й канал старт импульса 100 мкс (обработка почти 0 мкс)
2й канал старт импульса 1000 мкс (обработка почти 0 мкс)
1й канал окончание импульса 1600 мкс (обработка почти 0 мкс)
таймер 1/50 Сек для вывода своих импульсов 1700 мкс (обработка длится 2500 мкс)
2й канал окончание импульса 4200 мкс (т.к. пока мы находились в предыдущем обработчике, прерываний небыло)
Т.о. 1й канал у нас посчитался правильно 1600 - 100 = 1500
А вот второй неправильно 4200 - 1000 = 3200, хотя на самом деле он был тоже 1500, но окончание импульса было профукано, пока мы сидели в своем обработчике.