Цитата(Tiro @ Aug 21 2006, 18:08)

1) ввод и вывод в АВР имеют встроенные синхронизаторы, что требует задержки в один такт перед считыванием пина _после изменения состояния соответствующего вывода_ (в дейташите раздел I/O-Ports -> Introduction)
так я вроде учел... непонятно, как на это может влиять перемена строк 169 и 170...
Цитата(Tiro @ Aug 21 2006, 18:08)

2) любые _внешние по отношению к обработчику прерывания_ переменные, модифицируемые в прерывании (и в вызываемых из обработчика функциях), должны иметь модификатор volatile, чтобы запретить компилятору оптимизацию при работе с ними. Это не особенность WinAVR, а общее правило использования оптимизирующих компиляторов при написании обработчиков прерываний.
имеется в виду, что все дело в перегруженности прерываний?
надо строго в прерываниях выставлять флаги, обрабатываемые в основном теле программы, чтобы как можно более сократить тело прерываний и уменьшить количество и вложенность функций в них?
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)