7seg писал(а):А может кто подсказать формулу для расчета пределителя и TCNT1
а в чем проблема-то?
я бы вообще не советовал слишком увлекаться формулами, потому как в Си некоторые формулы вычисляются несколько неожиданно для многих... лично я всегда рассчитываю конкретные значения сам (при помощи калькулятора Windоws) и вбиваю в проект уже готовые констаты.
кстати о константах: категорически советую убрать из вашего файла #define F_CPU 8000000, а вместо этого задавать частоту в настройках проекта, как положено.
а теперь о расчете таймера.
нам известна частота тактирования МК и частота прерываний, которую мы хотим получить. отношение этих частот - это коэффициент деления, который надо реализовать. допустим, при тактовой 8 МГц мы хотим получить прерывания с частотой 1000 Гц. Значит, нам над обеспечить коэффициент деления 8000.
этот коэффициент может обеспечиваться разными способами. проверим, что будет, если мы напрямую затактируем таймер и будем работать по прерываниям по переполнению: 8000000 / 256 = 31250 - это в 31.25 раз больше, чем мы хотим. к сожалению, поделить на 31.25 невозможно никак, поэтому как бы мы ни старались, при работе по переполнению таймера (8-битного я взял, для 16-битного все чуть иначе, но принцип тот же) получить 1000 Гц невозможно.
В сущности задача сводится к подбору множителей для получения желаемого значения 8000: среди этих множителей могут быть значения предделителя таймера и значения для счетчика в режиме CTC таймера. Вы же помните, что в режиме СТС таймер считает до меньшего, чем его "размер" значения? т.е. можно поделить частоту на любое целое значение, умещающееся в разрядность таймера. например 8000 = 8 * 1000 (8 - стандартный предделитель, а вот 1000 влезет только в 16-битный таймер). 8000 = 125 * 64 - это нас устраивает! 64 - стандартный предделитель, а 125 мы будем использовать для режма CTC таймера!
вот оно - решение: для 8-битного таймера в режиме СТС надо указать значение для счета TOP=125, задать предделитель 64 и тогда прерывание ПО СОВПАДЕНИЮ (не по переполнению!!!) будет возникать ровно 1000 раз в секунду!
Аналогично рассуждая вы должны легко получить любые желаемые частоты прерываний при своих параметрах проекта. Если целое значение частоты недостижимо, стремитесь к максимально близкому достижимому целому, либо меняйте алгоритм...