реклама на сайте
подробности

 
 
> Помогите с циклом для С8051F005
Scorpline
сообщение Oct 25 2007, 23:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Я начинающий в ассемблере... Может кто поможет написать код цикла для сравнения двух однобайтных значений... то есть есть два числа(допустим #10h и #3Fh). Они сравниваются с другими значениями которые прокручиваются в цикле(и постоянно изменяются)... и если эти значение меньше 10h то выполняется вызов какойто подпрограммы и соответственно значение больше 3Fh то вызов другой подпрограммы.... (вообщем как в ассемблере зделать знаки <>) help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
msn
сообщение Oct 26 2007, 10:38
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(Scorpline @ Oct 26 2007, 02:55) *
Я начинающий в ассемблере... Может кто поможет написать код цикла для сравнения двух однобайтных значений... то есть есть два числа(допустим #10h и #3Fh). Они сравниваются с другими значениями которые прокручиваются в цикле(и постоянно изменяются)... и если эти значение меньше 10h то выполняется вызов какойто подпрограммы и соответственно значение больше 3Fh то вызов другой подпрограммы.... (вообщем как в ассемблере зделать знаки <>) help.gif

Код
MOV      A,Rx               ; Определили значение переменной цикла, A = VAR
CLR      C                  
SUBB     A,#0x10            ; A  = VAR – 0x10
JNC      LabelNext          ; Если VAR – 0x10 >= 0 :: VAR >= 0x10 то переходим на LabelNext
CALL     FunLoss            ; Если VAR – 0x10  < 0 :: VAR  < 0x10 то вызываем FunLoss            
JMP      LabelEnd

LabelNext:
MOV      A,Rx               ; Определили значение переменной цикла, A = VAR
SETB     C                  
SUBB     A,#0x3F            ; A  = VAR – 0x3f
JC       LabelMore          ; Если VAR – 0x3f <= 0 :: VAR <= 0x3f то переходим на LabelEnd
CALL     FunMore            ; Если VAR – 0x3f  > 0 :: VAR  > 0x3f то вызываем FunMore            

LabelEnd:
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 26 2007, 13:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



По-моему, всётаки лучше так

Код
;--- Если в Rx лежит проверяемый байт (VAR)
;--- Проверка VAR < 0x10
    CJNE  Rn, #10h, Lab1
Lab1:
    JNC   LabNext          
    CALL  FunLoss; Если  VAR  < 0x10 то вызываем FunLoss
    JMP    LabelEnd
LabelNext:
;--- Проверка VAR > 0x3F
    CJNE  Rn, #3Fh, Lab2
    JMP    LabelEnd
Lab2:
    JC    LabelEnd
    CALL  FunMore; Если VAR  > 0x3f то вызываем FunMore
LabelEnd:


Применение CJNE мне нравится тем, что при проверке не разрушается содержимое аккумулятора и регистров

Сообщение отредактировал Палыч - Oct 26 2007, 14:00
Go to the top of the page
 
+Quote Post
msn
сообщение Oct 26 2007, 16:46
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



CJNE - команда условного перехода производит сравнение содержимого аккумулятора с операндом (команда "cjne A, #const, label") или регистра с операндом (команда "cjne reg, operand, label") и реализует переход, если они не равны.
Т.е. у Вас получается:

;--- Если в Rx лежит проверяемый байт (VAR)
;--- Проверка VAR != 0x10
CJNE Rn, #10h, Lab1
JNC LabNext
Lab1:
CALL FunLoss; Если VAR != 0x10 то вызываем FunLoss
JMP LabelEnd
LabelNext:
;--- Проверка VAR != 0x3F
CJNE Rn, #3Fh, Lab2
JMP LabelEnd
Lab2:
JC LabelEnd
CALL FunMore; Если VAR != 0x3f то вызываем FunMore
LabelEnd:

Происходит сравнения не равно 0x10 и не равно 0x3f, а не меньше 0x10 и не больше 0x3f.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 29 2007, 06:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(msn @ Oct 26 2007, 20:46) *
CJNE - команда условного перехода производит сравнение содержимого аккумулятора с операндом (команда "cjne A, #const, label") или регистра с операндом (команда "cjne reg, operand, label") и реализует переход, если они не равны.
Происходит сравнения не равно 0x10 и не равно 0x3f, а не меньше 0x10 и не больше 0x3f.

Я выше писал
Цитата
для сравнения байта с заранее известной константой лучше всего использовать команды... получаем переход если не равны, при этом флаг С=1, если первый операнд меньше и С=0 в противном случае
т.е. команда CJNE действительно производит сравнение двух операндов и при этом выставляет флаг С, который можно использовать в последующих командах, а переход, который осуществляет CJNE в некоторых случаех сравнения не нужен вовсе (ставим переход на следующую команду). Код господин msn поправил (перенес метку, убрал условный переход) зря: они - часть той фишки, что позволяет использовать CJNE при любом сравнении (не только равно-неравно).
Go to the top of the page
 
+Quote Post
msn
сообщение Oct 31 2007, 22:57
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(Палыч @ Oct 29 2007, 08:13) *
Я выше писал
т.е. команда CJNE действительно производит сравнение двух операндов и при этом выставляет флаг С, который можно использовать в последующих командах, а переход, который осуществляет CJNE в некоторых случаех сравнения не нужен вовсе (ставим переход на следующую команду). Код господин msn поправил (перенес метку, убрал условный переход) зря: они - часть той фишки, что позволяет использовать CJNE при любом сравнении (не только равно-неравно).

Спасибо.
Уже лет 10 на 51 пишу, а про то что CJNE меняет С не знал 07.gif
Ваш вариант действительно оптимальнее smile.gif
Go to the top of the page
 
+Quote Post
Scorpline
сообщение Nov 2 2007, 00:07
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Цитата(msn @ Nov 1 2007, 02:57) *

...и еще маленький вопросик. А если сравнивать уже 2 байта, то намного ли усложняется код?
Дело просто в том что мне надо сравнивать код с ADC, а он у меня 12 разрядный (adc0h,adc0l)....
smile3046.gif ...познаю *.ASM
Go to the top of the page
 
+Quote Post
msn
сообщение Nov 3 2007, 22:32
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(Scorpline @ Nov 2 2007, 02:07) *
...и еще маленький вопросик. А если сравнивать уже 2 байта, то намного ли усложняется код?
Дело просто в том что мне надо сравнивать код с ADC, а он у меня 12 разрядный (adc0h,adc0l)....
smile3046.gif ...познаю *.ASM

Кстати у F005 есть программируемый детектор диапазона АЦП, который устанавливает флаг ADWINT (только устанавливается в 1, сбрасывать нужно вручную) если значение ADC за или в пределах заданного ADC0GT / ADC0LT (16 бит) диапазона. Т.е. все сравнения выполняются автоматически после получения новых данных ADC.
Go to the top of the page
 
+Quote Post
Scorpline
сообщение Nov 4 2007, 22:25
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Цитата(msn @ Nov 4 2007, 02:32) *
Кстати у F005 есть программируемый детектор диапазона АЦП, который устанавливает флаг ADWINT (только устанавливается в 1, сбрасывать нужно вручную) если значение ADC за или в пределах заданного ADC0GT / ADC0LT (16 бит) диапазона. Т.е. все сравнения выполняются автоматически после получения новых данных ADC.

Да.. но ADWINT устанавливается в "1" в любом случае, если код с ADC вышел за границы "цифрового окна". А мне надо что бы выполнялись разные действия если код выше или ниже окна сравнения(...ну и соответственно сравнивать 2 байта... или как то можно это реализавать с ADWINT? ...правда лучьше без него. smile.gif
Go to the top of the page
 
+Quote Post
msn
сообщение Nov 5 2007, 10:14
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(Scorpline @ Nov 5 2007, 00:25) *
Да.. но ADWINT устанавливается в "1" в любом случае, если код с ADC вышел за границы "цифрового окна". А мне надо что бы выполнялись разные действия если код выше или ниже окна сравнения(...ну и соответственно сравнивать 2 байта... или как то можно это реализавать с ADWINT? ...правда лучьше без него. smile.gif

Если Вы знаете что код за пределами окна, то вам нужно только 1 и скорее всего однобайтовое сравнения выше или ниже окна.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 19:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016