2. ЕСЛИ
3. ИНАЧЕ, ЕСЛИ
4. ИНАЧЕ, ЕСЛИ
Подпрограмма, текст которой приведен в Программе 11.6,
СОМР movf PORTB,w; Берем входное значение P
subwf LEVEL,w; LEVEL — P
btfss STATUS,Z; Пропускаем, если равно
goto CONTINUE; ИНАЧЕ проверяем остальные варианты
; Сюда попадаем при равенстве
movlw b’11111010’; Выставляем на вывод «==» лог. 1
movwf PORTA; На остальных выходах — лог. 0
goto COMP_END; и выходим
CONTINUE btfsc STATUS,С; Пропускаем, если заем (Р > LEVEL)
goto LO; ИНАЧЕ Р < LEVEL
; Сюда попадаем при P > LEVEL
HI movlw b’11111001’; Выставляем на вывод «>» лог. 1
movwf PORTA; На остальных выходах — лог. 0
decf TRIP,w; Копируем TRIP-1 в W
movwf LEVEL; Новое значение порога
goto COMP_END; и выходим
; Сюда попадаем при P < LEVEL
LO movlw b’11111100’; Выставляем на вывод «<» лог. 1
movwf PORTA; На остальных выходах — лог. 0
incf TRIP,w; Копируем TRIP+1 в W
movwf LEVEL; Новое значение порога
COMP_END return
void compare(unsigned int trip)
{
EQ = HI = LO = 0;
if(PORTB == LEVEL) {EQ =1;}
else if(PORTB > LEVEL) {HI = 1; LEVEL = trip — 1;}
else {LO = 1; LEVEL = trip +1;}
}
Преимущество программной реализации функций, традиционно реализуемых аппаратно (таких как функция сравнения), заключается в большей гибкости, хотя и за счет снижения пропускной способности. Использование недорогих «вычислителей», таких как микроконтроллеры PIC, означает, что относительно простые функции, традиционно реализуемые специальными микросхемами, могут выполняться с помощью встраиваемых процессоров.
В данном случае гибкость состоит в том, что вместо фиксированного уровня можно легко начать использовать произвольное значение, считываемое, скажем, с порта С (см. Вопрос для самопроверки 11.5). В Примере 12.1 на стр. 435 показано, как можно считывать внешние данные последовательно. Также один или оба уровня могут быть сформированы из аналоговых сигналов с использованием встроенного модуля АЦП (см. главу 14). Во всех этих случаях гистерезис может задаваться в виде доли от порогового значения, например ±1/32, а не как фиксированное значение ± 1 бит.
В Си-варианте подпрограммы, код которой приведен в Программе 11.6,
На Рис. 11.14 изображен принцип работы
Рис. 11.14.