Fish1. Это я взял, из программы, где необходимо было проверять младший байт счетчика сравнения, оставил без изменения, просто для примера.
Кроме того, если быть совсем правильным, то самое лучшее
OCR1B = OCR1B + PERIOD;
Так как к таймеру прибавлять нельзя, из-за того, что его регистры 8 разрядные, пока вы читаете один регистр таймера, это отнимет время, может изменится другой, или вообще произойти переполнение таймера.
Именно, чтобы показать, что запись
OCR1B = OCR1B + PERIOD;
Реально в проце происходит примерно так
IN R16,OCR1BL
IN R17,OCR1BH
SUBI R16,0xXX
SBCI R16,0xYY
OUT OCR1BH,R17
OUT OCR1BL,R16
Я так и написал в Сях, чтобы показать что не все так просто
Если мы сделаем
OCR1B = TCNT1 + PERIOD;
то
IN R16,TCNT1L //Вот тут пока мы его читаем
IN R17,TCNT1H //Значение таймера уже может поменятся, вплоть до того, что произойдет переполнение и TCNT1H станет 0 вместо скажем 0xFF
SUBI R16,0xXX
SBCI R16,0xYY
OUT OCR1BH,R17
OUT OCR1BL,R16
2. Флаг тут скидывается вручную, так как изначально этот код был не в обработчике прерывания, Да и так для надежности

) Си компилятор вон два раза подряд джампы вставляет без включенной оптимизации. Считаем, что у меня оптимизация была выключена