Таймер 1 совместно с модулем ССР1, работающим в режиме сравнения, будет использоваться для формирования секундного интервала. Этот таймер тактируется от собственного генератора с часовым кварцем, а его состояние изменяется от h’0000’ до h’7FFF’. Однако для облегчения перевода единиц (об/мин = 60 х об/с) предлагается уменьшить интервал счета в 60/64 раз, чтобы реализовать эквивалентное соотношение — ([об/с] х 60/64) х 64. Это можно сделать, уменьшив модуль счета до h’7FFF’ х 60/64 = h’77FF’. Итоговое умножение на 64 можно выполнить либо сдвигом результата на шесть разрядов влево (<<6), либо, что более эффективно, копированием полученного значения в об/с в старший байт результата в об/мин и сдвигом его на два разряда вправо, т. е.
[об/мин] = ([об/с] х 256) >> 2.
Очевидно, что такой подход намного эффективнее, чем использование секундного интервала и умножения на 60.
Возможный вариант программы, реализующей описанный алгоритм, приведен в Программе 13.6. В секции инициализации выполняются следующие операции:
• Таймер 0 переключается в режим счета по спадающему фронту сигнала на входе T0CKI.
• Модуль ССР1 переключается в режим сравнения 1011 для сброса Таймера 1 по событию «совпадение».
• Разрешается прерывание по этому событию.
• В регистры CCPR1H: L заносится значение, соответствующее интервалу 60/64 с.
В процедуре обработки прерывания число оборотов в секунду, считанное из Таймера 0 и расширенное до двухбайтного значения, сохраняется во временных регистрах. После этого Таймер 0 обнуляется, а сохраненное значение преобразуется к об/мин, как было описано выше. После двукратного сдвига вправо два старших бита регистра RPM сбрасываются, чтобы исключить воздействие флага переноса. Итоговое 14-битное число в регистрах RPM: RPM+1 является искомым результатом, который впоследствии может использоваться в фоновой программе для выдачи на дисплей или, быть может, для передачи в компьютер по последовательному каналу.
Для повышения надежности программы в обработчике прерывания необходимо также проверять состояние флага прерывания по переполнению Таймера 0, который может использоваться для включения индикатора, предупреждающего о превышении допустимой скорости.