Проверяем работу "программного детектора перепада 1-›0" для каждого из двух каналов:
- подтвердим регистрацию спада на канале RB4 коротким импульсом на выходе RA0;
- подтвердим регистрацию спада на канале RB5 коротким импульсом на выходе RA1.
В коде
rpm_count() это может выглядеть так:
PHP код:
|
... if (FallingEdges & _PORTB_RB4_MASK) { fan1++; // ----------- PORTAbits.RA0 = 1; // Подтверждение регистрации импульса на входе RB4 коротким импульсом на выходе RA0 NOP(); NOP(); PORTAbits.RA0 = 0; } if (FallingEdges & _PORTB_RB5_MASK) { fan2++; // ----------- PORTAbits.RA1 = 1; // Подтверждение регистрации импульса на входе RB5 коротким импульсом на выходе RA1 NOP(); NOP(); PORTAbits.RA1 = 0; ...
}
|
Подключаем счетчики импульсов для входного и выходного синалов:
Канал
fan1, вход МК RB4, выход RA0, на входе меандр 1000 Гц;
Канал
fan2, вход МК RB5, выход RA1, на входе меандр 100 Гц,
Измерение за время 1.2 секунды, все укладывается в ожидания:
В обрабочике прерываний - только вызов функции
rpm_count() с целью убедиться в корректности обработки сигналов от таходатчиков.
За секунды счета разница в реальных и измеренных значениях может отличаться на единицы, но никик не в разЫ.
Пара золотых правил - отсутствие блокирущих задержек в обработчиках прерываний и атомарное чтение/запись volatile-переменных ( в случаях необходимости ).