Спойлер
Это видно в дизассемблере, что компилятор засунул команды именно в таком порядке:
Спойлер
Есть еще ряд проблем. Например, компилятор не сбрасывает флаг прерывания и поэтому его приходится сбрасывать вручную в основном цикле. Иначе прерывание выполняется один раз, а потом таймер считает, а флаг висит.
И в основном цикле, когда программа заходит в функцию задержки _delay_ms() внутри нее сбрасывается флаг глобального разрешения прерываний. Из-за чего опять все работает через одно место.




