Делаю софт для управления шестиногом. Столкнулся с проблемой. Мега32, встроенный резонатор на 8МГц. Отлаживал в Proteus, все работает как надо. Заливаю в железо - получаю фигню.
Софт основан на командной оболочке от _YS_. Сам код софтового ШИМ на сервы взял у DiHalt, переделал под 18 серв. По команде инициализации серв выставляет их в среднее положение, все ок. Если после этого дать команду на поворот одной любой сервы - остальные упираются в крайнее положение. Такое впечатление, что контроллер не успевает задать остальным сервам положение. В протеусе при этом на эмуляции поворачивается только заданная серва. Остальные стоят как и должны.
Главный вопрос - а чего это оно?
Действо происходит в cmd_func.c
Функции:
Servo_add - установка сервы N в положение Pos.
Дальше массив длительностей ШИМ сортируется и выставляется флаг обновления для прерывания.
Прерывание на Timer1_COMPA должно выводить ШИМ на заданные порты. В нем отслеживается состояние конечного автомата. Изначально все порты сбрасываются в исходное состояние(лог 1 на выходе). Дальше для каждого порта по маске задержек выключается соотв бит. Когда автомат переберет все различающиеся по задержке положения - он выставляет задержку 20мс и уходит в новый цикл.
Так вот. Если все сервы стоят в одном положении(стартовом) - ничего в железе не дергается. Руками отворачиваем серву - она сопротивляется и возвращается в то же положение. Если любую серву повернуть(становится два состояния серв - все в центре кроме одной) - сервы сходят с ума и поворачиваются в крайнее положение. В протеусе есть дребезг только в том случае, когда одна серва повернута чуть-чуть(186 у всех, 185-184 у одной, например).
Комменты в процедуре обработки прерывания могут не отражать действительность, т.к. считал задержки от частоты чипа и не правил комменты.
Помогите, пожалуйста, запустить... А то стоит игрушка, а я не пойму, что ей мешает бегать.