Lirzman писал(а):ЗЫ Щас придет aesok и найдет кучу багов.(как обычно)
Я пришол. :zevok:
Ну баг ты нашол сам. Но Его исправление ты предложил неверное:
if(cur_servo==3)
{PORTB SET_B(2);
PORTB CLR_B(1);
TCNT1=gangle[2]+2; cur_servo=4;
}
Подумай из за чего поисходит эта ошибка.
Наводки:
Посмотри асемблерный код обработчика прерывания. В чем разница для разных серв? Чему равно значение счетчика таймера в тот момент когда ему присваеваеться новое значение, для разных серв? Что будет если компилятор сгенерирует более оптимальный (или менее оптимальный) код?
Что произойдет если контроллер, в тот момент когда происходит переполнение таймера '1' и должен начать выполняться обработчик прерываня таймера '1', контроллер находиться в обработчике другого прерываня? Как это отразиться на серве?
Ваше предложение по универсальному решению проблеммы?
Анатолий.