Форум по микроконтроллерам: Сравнение 2-х переменных - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Сравнение 2-х переменных

#1 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 21 Сентябрь 2011 - 11:47

Понравилась ПП Александра
Сравнение двух беззнаковых 16-разрядных чисел
На её основе сделал макрос, позволяющий сравнивать 2 переменные n-ного размера.

Сам макрос
Compare MACRO val_size, val_1, val_2, lab_bol, lab_men
local _b_cnt = val_size-.1
banksel   val_1
 	while (_b_cnt>=.0)
          movf    val_1 + _b_cnt, W 
          subwf   val_2 + _b_cnt, W 
          btfss   STATUS, C    
          goto    lab_bol 
          btfss   STATUS, Z 
          goto    lab_men
 	_b_cnt--
 	endw
ENDM

val_size - размер переменных в байтах. Должны находиться в одном банке.
val_1, val_2 - адреса сравниваемых переменных
lab_bol, lab_men - метки, на которые нужно переходить при val_1 > val_2 и val_1 < val_2
При условии val_1 = val_2, программа продолжает выполняться дальше.

Пример использования
Compare .2, X, Y, Xbol, Ybol   ; Сравниваем 2-х байтне переменне X и Y.
                              ; Если X > Y, то уходим на метку Xbol
                              ; Если X < Y, то уходим на метку Ybol
                              ; Если X = Y, то выполняем следующую команду

                    ; Тут код обработки, если X = Y
 	nop
 	goto Comp_end
Xbol                ; Тут код обработки, если X > Y
 	nop
 	goto Comp_end
Ybol                ; Тут код обработки, если X < Y
 	nop
Comp_end


Не говорите что мне делать, и я не скажу куда Вам идти !
1

#2 Пользователь офлайн   strannik 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 124
  • Регистрация: 02 Февраль 12
  • ГородКиев

Отправлено 24 Ноябрь 2014 - 02:43

При помощи этого макроса пытаюсь сравнить две двухбайтовые переменные в BCD коде.
Вот результат:
; 12 час 58 мин > 12 час 57 мин
;(0x1258>0x1257)
; 12 час 58 мин = 12 час 58 мин
;(0x1258=0x1258)
; 12 час 58 мин < 12 час 59 мин
;(0x1258<0x1259)
; 12 час 58 мин > 13 час 00 мин
;(0x1258>0x1300)
; 12 час 58 мин > 13 час 01 мин
;(0x1258>0x1301)
; 12 час 58 мин > 13 час 57 мин
;(0x1258>0x1357)
; 12 час 58 мин < 13 час 58 мин
;(0x1258<0x1358)
; 12 час 58 мин < 13 час 59 мин
;(0x1258<0x1359)
; 12 час 58 мин > 14 час 00 мин
;(0x1258>0x1400)
(Извините не нашел как спрятать это безобразие под спойлер)
Вот проектик:Прикрепленный файл  Compare.rar (29,25К)
Количество загрузок:: 84
Толи где-то не прав, толи уже поздно.
Не могу понять почему сравнение происходит именно так, прошу помощи.

Сам себе отвечу

Проблема решилась при сравнении без макроса.
Вот проектик:Прикрепленный файл  Compare_WM.rar (15,16К)
Количество загрузок:: 91
Проблема то решилась - но непонимание осталось.
Не могу понять почему сравнение макросом происходит именно так, все еще прошу помощи.

Сообщение отредактировал strannik: 24 Ноябрь 2014 - 03:19

0

#3 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 24 Ноябрь 2014 - 18:23

Прикрепленное изображение: 2014-11-24 18-18-17 Скриншот экрана.png
Всё нормально.
Time - 12:58
Alarm - 12:57
Уходит на метку Xbol :)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#4 Пользователь офлайн   strannik 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 124
  • Регистрация: 02 Февраль 12
  • ГородКиев

Отправлено 24 Ноябрь 2014 - 19:18

Да.
Всё нормально. Тут.
Вот только:
Time - 12:58
Alarm - 13:00
Уходит на метку Xbol :)
Чего бы это вдруг?
Прикрепленное изображение: comp_m.png
А пройтись до 14:00.
У меня получилось вот так.
;(0x1258>0x1257)
;(0x1258=0x1258)
;(0x1258<0x1259)
;(0x1258>0x1300)
;(0x1258>0x1301)
;(0x1258>0x1357)
;(0x1258<0x1358)
;(0x1258<0x1359)
;(0x1258>0x1400)
Ничего не понимаю?
Честно признаюсь макрос не разобрал, поэтому и понять, что происходит не могу. А хочеться.

Сообщение отредактировал strannik: 24 Ноябрь 2014 - 19:22

0

#5 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 24 Ноябрь 2014 - 20:48

Всё понятно.
Порядок байтов поменяйте местами и будет Вам счастье :)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#6 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 24 Ноябрь 2014 - 20:59

Либо вот Вам макрос, с перевёрнутыми байтами:
Compare MACRO val_size, val_1, val_2, lab_bol, lab_men
local _b_cnt = 0
banksel   val_1
     while (_b_cnt<val_size)
          movf    val_1 + _b_cnt, W 
          subwf   val_2 + _b_cnt, W 
          btfss   STATUS, C    
          goto    lab_bol 
          btfss   STATUS, Z 
          goto    lab_men
          _b_cnt++
     endw
ENDM
Он в Вашем случае будет работать.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#7 Пользователь офлайн   strannik 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 124
  • Регистрация: 02 Февраль 12
  • ГородКиев

Отправлено 24 Ноябрь 2014 - 21:01

Пока писал ответ, появился макрос.
Спасибо

Сообщение отредактировал strannik: 24 Ноябрь 2014 - 21:05

0

#8 Пользователь офлайн   strannik 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 124
  • Регистрация: 02 Февраль 12
  • ГородКиев

Отправлено 24 Ноябрь 2014 - 21:16

Все работает. Супер.
Значит ли это, что первым макросом нельзя сравнивать BCD числа, а вторым обычные шестнадцатибитные (двухбайтовых).
0

#9 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 24 Ноябрь 2014 - 21:29

Эти макросы просто отличаются порядком сравнения байтов по адресам. Один - со старшего к младшему, второй - наоборот.
Просто с первым макросом, в Вашем случае, сравнение шло по минутам, и если они были равны, тогда уже по часам. Если неравны, то переход по соответствующим меткам, в зависимости от того, что больше/меньше.
Не говорите что мне делать, и я не скажу куда Вам идти !
1

#10 Пользователь офлайн   strannik 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 124
  • Регистрация: 02 Февраль 12
  • ГородКиев

Отправлено 24 Ноябрь 2014 - 21:42

Да было такое. В таблице пробовал писать минуты потом часы - но, что-то не пошло - короче не добил вопрос.
Так, что давлю +.(Надеясь, что это плюс в репутацию). :i-m_so_happy:

Сообщение отредактировал strannik: 24 Ноябрь 2014 - 21:43

0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей