Проверяем работу "программного детектора перепада 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-переменных ( в случаях необходимости ).