pokk писал(а):что-то не понял как задержка зависит swith-case?
прерывание таймера происходит по его переполнению. т.е. значение TCNT2 в этот момент = 0.
После входа в прерывание, таймер не останавливается, и, в зависимости от предделителя таймера, может насчитать еще несколько импульсов во время выполнения обработчика прерывания.
Операция TCNT2=DELAYX; предназначена для того, чтобы сместить начальное значение TCNT2
относительно нуля, тем самым определяя кол-во тиков таймера до момента его прерывания.
Для примера: TCNT2 = 100 - определит задержку равную (256-100)=156 тикам таймера при условии, что в начальный момент значение таймера = 0, поскольку таймер (в данном случае таймер №2) переполнится после значения 255.
Но, поскольку эта операция может быть произведена в момент, когда значение TCNT2
не равно нулю, может появиться погрешность в бОльшую сторону равная значению TCNT2 в момент совершения операции присвоения. Поэтому, чем раньше вы ее произведете, тем меньше вероятность того, что возникнет погрешность.
У любой инструкции есть время выполнения, а поскольку switch-case также является инструкцией контроллера, то и у нее есть время выполнения. Следовательно пока выполняется switch-case значение таймера может стать отличным от нуля.
Все это можно проверить в симуляторе или попытаться рассчитать, имея значение предделителя таймера.