Вы сбрасываете значение таймера в прерывании переполнения. 1. Время входа в прерывание плавает из-за разной длины прерываемой команды. 2. Прерывание может быть задержано прерываниями с более высоким приоритетом. 3. Ваша программа обработки прерывания может иметь разную длительность от входа в прерывание до сброса таймера.
Прерывание вообще не нужно, обрабатывайте основной программой флаг прерывания. Тогда таймер будет себе молотить равномерно. Период переполнения задаём регистром OCR и режимом CTC, вместо флага TOV смотрим на OCF. И не надо никакого кварца на 32 кгц, основной кварц даёт не бОльшую погрешность.