Цитата(IC7K @ Jul 3 2009, 08:49)

у меня алгоритм такой:
прыгаем по таймеру, в обработчике инкрементируем счетчик сработок таймера, тем самым меряем длину импульса
при перепаде с 0-1 или 1-0 включаем задержку, одновременно вычисляем задержку следующего импульса
одновременно считаем новый импульс
и все это не работает почемуто...
Нельзя совмещать измерение входных импульсов и выдачу выходных. "Нельзя" не потому что это совсем невозможно, а потому, что это настолько сложно сделать правильно, что совершенно не имеет смысла париться. У вас должно быть 2 раздельных куска кода, один меряет период входной частоты, другой синтезирует выходныe частоты по заданию, полученному в результате измерения.
1. Измерение.Казалось бы, проще всего по перепаду входного импульса (из 0 в 1, или из 1 в 0, как больше нравится) запоминать значение свободно бегущего аппаратного счетчика. Период равен
(текущее значение) - (предыдущее значение).
Однако при больших периодах входного сигнала счетчик начнет переполняться. Чтобы не потерять правильное значение счетчика, необходимо в момент переполнения аппаратного счетчика (по прерыванию) инкрементировать программный счетчик, который станeт расширением аппаратного. Суммарная разрядность этого (аппаратного+программного) счетчика должна быть такой, чтобы переполнения не было хотя бы лет 100. Навскидку, 48 разрядов для частоты 16МГц/256 хватит за глаза. Конечно, при этом придется вычитание
(текущее значение) - (предыдущее значение) делать 48-разрядным, зато голова не будет болеть.
Вторая проблема - что делать, если входная частота равна 0? Ведь при этом на вход перестанут поступать импульсы, и измеритель так никогда и не закончит измерение очередного периода. А в это время выходной блок (синтезатор частоты) будет продолжать выдавать какие-то выходные импульсы, поскольку нового задания так никогда и не получит.
Вот эта проблема посерьезней, чем разрядность счетчика. Ее можно попробовать решить так. Когда процедура прерывания, вызываемая в момент переполнения аппаратного счетчика, инкрементирует программную "надбавку", обсуждавшуюся ранее, она должна одновременно проверять накопленное к этому моменту значение разности
(текущее значение) - (предыдущее значение). И если новая разность превысила то значение, которое было получено в предыдущем цикле измерения интервала, то дополнять (увеличивать) задание для выходного синтезатора частоты.
2. Синтез частоты по заданию.Это сделать легко, но надо учитывать, что синтезатор обязан регулярно проверять свое задание, поскольку оно может меняться "на лету", пока вых. импульс находится в стадии формирования. При нулевой вх. частоте, когда измеритель все время "подновляет" задание синтезатору, выход должен замереть навечно.