Пытаюсь сделать термореле на pic16f628a и столкнулся с такой проблемой, как определение знака числа. Но обо всем по порядку. Есть у меня регист TEMP - в нем я храню пороговое значение температуры, при котором должна включаться/отключаться нагрузка. Предполагается, что значение в TEMP - число со знаком, диапазон значений которого ограничен максимальным значением MAX = 127 (0111 1111b) и минимальным MIN = -128 (1000 0000b). Т.е. знак определяется старшим битом. Чтобы значение TEMP не выходило за рамки допустимых значений, перед увеличением/уменьшением значения мне надо проверить, что TEMP < MAX (для увеличения значения) или что TEMP > MIN (для уменьшения значения). Решил, что проще будет вычесть из меньшего большее и потом проверить значение на отрицательность, т.е. проверки должны быть TEMP - MAX < 0 и MIN - TEMP < 0 соответственно. Сначала думал проверять бит C регистра STATUS, но результаты в отладчике MPLAB не совпали с ожидаемым:
Результаты проверки TEMP - MAX < 0
TEMP | MAX | C | Z | W |
127 | 127 | 1 | 1 | 0 |
126 | 127 | 0 | 0 | 255 |
125 | 127 | 0 | 0 | 254 |
-126 | 127 | 1 | 0 | 3 |
-127 | 127 | 1 | 0 | 2 |
-128 | 127 | 1 | 0 | 1 |
Код: Выделить всё
movlw 0x7F; W = 127
sublw 0x7F; 127 - W
movlw 0x7F; W = 127
sublw 0x7E; 126 - W
movlw 0x7F; W = 127
sublw 0x7D; 125 - W
movlw 0x7F; W = 127
sublw 0x82; -126 - W
movlw 0x7F; W = 127
sublw 0x81; -127 - W
movlw 0x7F; W = 127
sublw 0x80; -128 - W
Как видно из результатов, при значении TEMP = 126 и 125 заема бита С почему то не произошло (хотя должен был бы быть). Думал проверять старший бит регистра TEMP, но как показывают значения -126, -127, -128 - это тоже не правильно. Подскажите, что делаю не так? Возможно есть какое-то простое решение. Искал подобные схемы, но везде прошивки без исходников.