Работа с числами со знаком

Здесь обсуждаем устройства на МК и программы для них
Ответить
tempest
Читатель
Читатель
Сообщения: 2
Зарегистрирован: 29 ноя 2016, 19:18

Работа с числами со знаком

Сообщение tempest » 29 ноя 2016, 20:09

Пытаюсь сделать термореле на 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
TEMPMAXCZW
127127110
12612700255
12512700254
-126127103
-127127102
-128127101

Код: Выделить всё

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 - это тоже не правильно. Подскажите, что делаю не так? Возможно есть какое-то простое решение. Искал подобные схемы, но везде прошивки без исходников.
Последний раз редактировалось tempest 11 дек 2016, 18:59, всего редактировалось 1 раз.

Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2944
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Re: Работа с числами со знаком

Сообщение rhf-admin » 29 ноя 2016, 21:40

Ну почему же, всё логично.
В доке есть описание команды, там написано как интерпретировать результаты: C=1, Z=0 - результат положительный, C=1, Z=1 - результат ноль, C=0, Z=0 - результат отрицательный.
Мы видим два отрицательных результата: для Temp=126 и Temp=125. Для остальных случаев результат положительный или ноль.
Также в описании команды написано, что диапазон операнда от 0 до 255. То есть он воспринимается как беззнаковое число. То есть нет никакого -126, -127, -128, вместо этого есть 130, 129, 128. И тогда последние 3 строчки: 130-127 > 0, 129-127 > 0, 128-127 > 0 - всё верно.

Можно сделать так: 1) Прибавить к Temp 128 (0b10000000). 2) Теперь можно пользоваться для сравнения командой sublw, только MIN/MAX нужно брать не -128/127, а 0/255.
С уважением, администрация сайта.

tempest
Читатель
Читатель
Сообщения: 2
Зарегистрирован: 29 ноя 2016, 19:18

Re: Работа с числами со знаком

Сообщение tempest » 11 дек 2016, 19:04

благодарю, все получилось :clapping2:

Ответить

Вернуться в «Устройства на микроконтроллерах»