Цитата(Ga_ry @ Jul 20 2018, 13:17)

контролер атмега 48.
Один литр воды выводит на выход 450 импульсов.
В атмеге есть прерывания на ножках PCINT_ по любому изменению состояния.
Например для ножки №31 (PD1) это будет выглядеть так:
CODE
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: On
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
PCMSK2=(1<<PCINT23) | (0<<PCINT22) | (0<<PCINT21) | (0<<PCINT20) | (0<<PCINT19) | (0<<PCINT18) | (1<<PCINT17) | (0<<PCINT16);
PCIFR=(1<<PCIF2) | (0<<PCIF1) | (0<<PCIF0);
Затем пишем функцию что делать при этом событии и вставляем туда инкремент счётчика импульсов
Например:
CODE
// Pin change 16-23 interrupt service routine
interrupt [PC_INT2] void pin_change_isr2(void) //прерывание внешних кнопок
{
if (на ножке 1) cnt++;
}
Далее в коде делаете проверку сколько импульсов у вас "натекло", отключаете воду и сбрасывайте счётчик.
Каждый расходомер можно завести на отдельную ножку.