Порылся еще в нете и нашел схожую тему 5-летней давности на нашем же форуме:
ATmega timer2 в асинхронном режиме. После прочтения темы посмотрел эррату на мегу128 - проблема до сих пор существует для всех ревизий кристалла от F до М.
Ниже выдержка из эрраты:
Цитата
2. Interrupts may be lost when writing the timer registers in the asynchronous timer
The interrupt will be lost if a timer register that is synchronous timer clock is written when the
asynchronous Timer/Counter register (TCNTx) is 0x00.
Problem Fix/Workaround
Always check that the asynchronous Timer/Counter register neither have the value 0xFF nor
0x00 before writing to the asynchronous Timer Control Register (TCCRx), asynchronous
Timer Counter Register (TCNTx), or asynchronous Output Compare Register (OCRx).
В твоем коде воспользоваться данным воркэраундом не удастся (будет заметно подмигивание)
Остается только посоветовать либо оставить все на 85Гц, либо отказаться от периодического изменения OCR:
1. настроить прескалер таймера на 1
2. Настроить таймер на режим CTC (автосброс при срабатывании output compare, WGM01 = 1, WGM00 = 0 ), в OCR занести значение (64-1). Таким образом, у нас прерывание про сравнению будет срабатывать с частотой 32768/64 == 512Гц. При каждом третьем входе в это прерывание выставлять флаг fl_Display (частота развертки 512/3/3==57Гц), а при каджом 512 входе - флаг fl_Second.
3. понятное дело, убрать обновление OCR0 из OUT_TIMER и отключить прерывание по переполнению.
ЗЫ реинициализацию регистра count (если он останется после переделки) лучше осуществлять в самом прерывании. Это, конечно, +1 такт к прерыванию, но читабельность программы существенно улучшится.