Ниччо не понятно , ни в ваших словах, ни в ващем коде

Вы опишите, что у вас за устройство, что вы ожидаете увидеть и что вы реально видите.
Но чудес то не бывает, если у вас плавает задержка, то где то , наверное, происходит наложение прерываний, непример, у вас произошло внешнее прерывание, и вы вошли в обработчик прерывания и в момент выполнения предыдущего обработчика у вас должно произойти прерывание от вашего таймера, но обработчик прерывания таймера вызовется только после окончания обработчика внешнего прерывания + 1 команда из основного цикла. Это во-первых.
Затем, во-вторых, вместо
Код
if (i == 16)
я бы написал
Код
if (i >= 16)
.