Паноптикум... Мега 128 на 16 мегагерцах, внешний вентиль и ещё конденсатор!...
Нужен один таймер, четыре байта памяти и одна нога порта.
Таймер даёт прерывания через, например 1 миллисекунду. Процедура его прерывания смотрит на порт и наращивает счётчик длительности (2-байтовый), если единица. Потом наращивает счётчик времени. Если счётчик времени равен 1000, то переписывает счётчик длительности в другое место памяти, поднимает флаг "измерено" и сбрасывает счётчики времени и длительности. ВСЁ. Точность 0.1%, всё синхронно, где-то в основном цикле - программа обработки счётчика длительности по флагу. Блин, на ассемблере будет короче всё это написать.
Цитата(Ojo @ Jun 26 2008, 20:56)

Спасибо за ответы. Жалко что у меги нет возможности в таймере по одному фронту записать значение счетчика в один регист, а по второму во второй. Т.к. оба предложенных решения требуют задействования 2-х ножек Мега.
Есть такая возможность! Подаёте свой сигнал на вход прерывания, настраиваете реакцию на оба фронта. В обработчике первым делом ветвитесь по уровню сигнала - какой фронт. И вперёд.
interrupt:
in reg,port
sbrc port,bit
rjmp falling
mov reg_raising,timer
ret
falling: mov reg_falling,timer
ret
Регистр флагов запоминать не нужно - ни одна команда его не меняет. 14 циклов процессора - 625 нс.