Приторможу я пока с контролем над сервами. Не знаком я с ассемблером, но все равно думаю и там будет проблемно реализовать этот принцип, так как если не синхронизировано опрашивать порты, то обязательно упустим приход начала или конца импульса.
Тогда второй вопрос, а что еще можно попробовать?
Функцией attachInterrupt() на меге не более 6 каналов, это ладно, буду контролировать 6 каналов, но в описании написано:
Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются. Возможна потеря данный передаваемых по последовательному соединению (Serial data) в момент выполнения функции обработки прерывания.
Может если нет вариантов, то использовать pulseIn, но тогда нужно придумать серьезное усреднение этих данных, по большому счету мне 10-20 стабильных значений достаточно. Пробовал использовать функцию map(pulseIn(), 1000, 2000, 0, 10) - нормально, при плавном перемещении джойстика серва ступенями занимает свое положение, но в переходных зонах все равно болтается.
Отсюда третий вопрос, подскажите механизм усреднения, аппроксимирации? Вариант суммировать 10 отсчетов подряд и разделить на 10 не помогли.
p.s. может надо было это среднее умножить на 9, потом добавить один отсчет и снова разделить на 10? Я пробовал просто суммировать 10 значений и делил на 10 и это все в цикле.
И еще, pulseIn() долго определяет, что на входе нет импульса. Выключил передатчик и конкретно затормозила.