aleksandr-zh писал(а):мне был бы удобен Мега8а
PIC'и -раздарил.
Кроме меги и PIC'ов вообще-то существует масса других семейств. Ну да ладно...
Используем таймер1 для счёта длительности. Счёт периодов будем вести программно (частота низкая, это не сложно).
Настраиваем таймер в режим 0, 16-битный счёт. Входной сигнал (после преобразования в прямоугольную форму, естественно) подаём на вход захвата таймера ICP1 (можно использовать внутренний компаратор).
Разрешаем прерывания от ICF1 (в обработчике прерывания будем вести счёт их количества, это N).
При приходе первого (в измерительном цикле) прерывания ICF1 запоминаем ICR1
При приходе N+1 запоминаем ещё одно значение ICR1
Вычитая из второго первое получаем длительность (это будет ТС2 в предыдущем посте).
На возможное переполнение таймера плюём, при вычитании 16-разрядных чисел без заимствования всё станет на свои места.
Здесь есть нюансы: тактовая таймера1 (для Вашего случая - когда измеряется частота сети) должна быть 3/N МГц, чтобы не возникало переполнения таймера1. Например, если будем измерять за 50 периодов, то тактовая должна быть не выше 60кГц, желательно в диапазоне 30-60кГц. Т.е. соответствующим образом нужно настроить прескаллер таймера