Мега пока работает от внутреннего генератора 8МГц. В будущем, м.б. припаяю кварц на 16МГц. Индикация пока на LCD HD44780, это отладка, в конечном устройстве измеренные частота и угол сдвига фаз должны передаваться в другой МК.
Входной каскад схемы обеспечивает обычные 50Гц синусоиды напряжения и тока, поднятые на 2.5в. Обе синусоиды родом из розетки, токовая синусоида снимается с токового транса с шунтом. Типовая схема короче. Плюс стандартная защита от перенапряжения, чтобы все синусоиды всегда лежали в диапазоне 0..+5в.
Сигнал по напряжению подан на вход внутреннего компаратора меги, сигнал по току на внешний компаратор К554СА3 с типовой обвязкой. Минусовые входы обоих компараторов на средней точке +2.5в. Выход компаратора подключен к INT0 контроллера.
Канал напряжения работает нормально - частота (по прерыванию компаратора) меряется вполне адекватно, слегка гуляет, но, думается, это из-за нестабильностей основного генератора.
С внешним компаратором дело гораздо хуже

В прошивке написал:
CODE
volatile dword ms1;
// External Interrupt 0 service routine
// Rising edge (0->1) - начало положительной полуволны тока
interrupt [EXT_INT0] void ext_int0_isr(void)
{
ms1++;
} // ext_int0_isr
...........
//////////////
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x08;
// Инициализация INT0
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GICR|=0x40; // INT0 enable
MCUCR=0x03; // ISC01..00 = 11 - rising edge INT0
GIFR=0x40; // сброс INT0
В главном цикле переменная ms1 просто печатается на дисплей.
Кроме INT0 есть ещё прерывание TC0 с частотой 1 кГц - считает миллисекунды и секунды. Там работает нормально.
Казалось бы, я должен на дисплее увидеть число, увеличивающееся на 50 каждую секунду, но там творится что-то ужасное. Этот ms1 меняется так, как будто там не 50 Гц, а что-то типа 1..10 кГц

Я сперва нагрузил в этот INT0 полный алгоритм, так проц вообще почти завис ....
Когда я снимаю нагрузку с ТТ, на выходе компаратора ноль, но число продолжает расти. Только с немного меньшей скоростью (на глаз).
Кто-нибудь знает что это за фигня такая?
С внешними прерываниями я раньше работал всего один раз, делал связку ATMega32+PDIUSBD12D (USB контроллер). PDI-шка висела на INT0. Девайс ожил почти сразу и работал без проблем

Только там, помнится прерывание было по лог. 1 на входе, а тут по переднему фронту (0->1).
Ради эксперимента завёл тот же токовый сигнал на внутренний компаратор - работает как часы...
Спасибо.
PS. Опять у меня кнопка CODEBOX не фурычит
