Цитата(rezident @ Apr 10 2007, 09:55)

Еще раз. Откуда взялась цифра 169999? Изначально мы не знаем входную частоту. Допустим по 1 периоду определили ее период с дискретностью +-1 такт опорной частоты (число 94 или 95 в ее отсчетах). Т.е. 16000000Гц/94=170212,766Гц или 16000000Гц/95=168421,051Гц. Время измерения у нас 1 сек, следовательно мы должны подсчитать 170213 или 168421 импульсов входной частоты, чтобы примерно получить 1 сек "временнЫх ворот".
Не, что-то не срастается. Давайте ляжем по-другому(:-). Запустили таймер1 и прерывание по захвату. Пусть так получилось, что прерывание сработало как раз в то время, когда в таймере оказался 0 (вообще без разницы, что там будет, просто для удобства). Запомнили этот 0 в памяти или регистре, не важно. Сидим ждём, курим, "кирпич ёк"(:-). То есть ничего не делаем, таймер1 подсчитывает время окна, таймер 0 подсчитывает количество входных импульсов. "Ничего не делаем" означает скручиваем 32-битный счетчик, предположим он рассчитан на 800 мс. Затем разрешили прерывание по захвату, оно сработало, у нас в руках число - время последнего фронта входного импульса. Какое оно будет? Зависит от того, сколько импульсов входного сигнала насчиталось. Давайте прикинем.
Если задержка была на 800 мс, то число М=170000*0.8=136000, а число N=16000000*0.8=12800000. Хорошо, значит Fx=16000000*136000/12800000=170000±0.013 Гц
Если задержка была на 801 мс, то число М=170000*0.801=136170, а число N=16000000*0.801=12816000. Fx=16000000*136170/12816000=170000±0.013 Гц
Если задержка была на 802 мс, то число М=170000*0.802=136340, а число N=16000000*0.802=12832000. Fx=16000000*136340/12832000=170000±0.013 Гц
Ну и так далее. Как вы видите размер окна никак не влияет на результат. Но относительная ошибка, естественно, зависит от времени наблюдения. Для упрощения понимания я брал задержку примерно на 1 с.
Подчеркну, окно всё время будет кратным периоду входной частоты, поскольку схема захвата срабатывает от передних фронтов именно входной частоты. Ну а поскольку частота опоры асинхронна по отношению к входной частоте, она будет "гулять" на ±1 такт.
Цитата(rezident @ Apr 10 2007, 09:55)

Я не знаю синхронный или асинхронный захват в AVR, поэтому насчет +-2 утверждать не буду. В общем (худшем) случае будет +-2 такта.
Захват синхронный, поскольку все входные сигналы тактируются внутренним клоком, т.е. все входные фронты приводятся к единой временной сетке, что есть, не скажу всегда необходимо, но грамотно с точки зрения построения архитектуры МК. Как бы то ни было, фронт нашего сигнала лежит между двумя фронтами тактовой частоты, следовательно максимальная ошибка +1 такт, или, если хотите, ±0.5 такта. Как кому нравится. Или вот так ещё можно сказать: фронт нашего сигнала лежит в диапазоне от N до N+1 такта, соответственно ошибка лежит в диапазоне от 0 до 1 такта.
Цитата(rezident @ Apr 10 2007, 09:55)

P.S. только для удобства лучше все же иметь в периферии 32-х разрядный таймер, а не 8-ми разрядный

Так ведь нет его! С другой стороны, представьте себе некий 8-10-12-ногий чип, который меряет частоту с относительной точностью 10^(-10), что могут дать только какие-нибудь монстры с цезиевым или там водородным стандартом, да и то не все. Ну а опору надо брать от ДжиПиэС(:-).