ArtemKAD писал(а):
Да. Эдакий крутейший 16 битный таймер-счетчик с тремя регистрами сравнения и возможностью аппаратно захватывать текущее значение по событию.
"И зачем нам в зоопарке все эти навороты?"
ArtemKAD писал(а):
А вот этого как раз нет. Настройка там состоит в указании режима работы (12) , предделителя (0) и далее только до скольки считать.
После этой настройки таймер сам по достижению события дергает ядро за прерывания и сам по достижению, заданного в одном из регистров сравнения конца, сбрасывается в "0".
А можно никого ни за что не дергать, а просто формировать ШИМ? 20 каналов, собственно, ерунда, я делал и 64 на одном чипе. Вот они никого не дергали, и делали именно ШИМ, а не просто таймер с прерыванием.
ArtemKAD писал(а):
Да, тот таймер этого аппаратно не умеет. Он все это и не только умеет совместно с ядром. Начиная от аппаратного формирования PWM и кончая разбором принятой приемником "колбасы" сигнала.
В итоге пришли к тому, что 20 меговских ядер на самом деле занимаются преимущественно беготней между своей периферией и попытками отвечать на дерганья с разных сторон. Тогда как периферия, описанная самостоятельно, делает именно то, что просят, и именно так, как просят.
Наблюдение за МК-проектами дало интересную картину. Перед началом работ (особенно когда речь идет о зарплате и получении заказа) почему-то все выглядит прекрасно - выбранный МК все может, периферия богатейшая, возможности подтверждены огромным сообществом разработчиков, компиляторы генерируют оптимальный летающий и компактный код. В середине оказывается, что программирование - ответственное и сложное занятие, программисты тоже люди, а периферия кривая И именно поэтому оно работает плохо.
Конкретно по ШИМу это часто выливается в то, что силовые ключи начинают гореть, а программист потом хватается за голову и объясняет, где именно в инициализации он поставил неправильный бит, а где перепутал порядок проверки. Кроме того, тестовые примеры работают нормально, а при доводке софта (и введении в него дополнительных ресурсоемких алгоритмов) ядро перестает успевать дернуть таймер с приемлемым временем реакции на событие.