|
|
  |
Помогите с циклом для С8051F005 |
|
|
|
Oct 26 2007, 05:39
|

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

|
IMHO, для сравнения байта с заранее известной константой лучше всего использовать команды CJNE A, #immediate, offset CJNE A, direct, offset CJNE Rn, #immediate, offset получаем переход если не равны, при этом флаг С=1, если первый операнд меньше и С=0 в противном случае
|
|
|
|
|
Oct 26 2007, 10:38
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759

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

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

|
Цитата(msn @ Oct 26 2007, 14:38)  Код 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: Спасибо... Это то что нужно!
|
|
|
|
|
Oct 26 2007, 16:46
|
Частый гость
 
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 29 2007, 06:13
|

Гуру
     
Группа: Свой
Сообщений: 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 при любом сравнении (не только равно-неравно).
|
|
|
|
|
Oct 31 2007, 22:57
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759

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

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

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

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

|
Цитата(Scorpline @ Nov 2 2007, 03:07)  ...и еще маленький вопросик. А если сравнивать уже 2 байта, то намного ли усложняется код? Вот так будет для сравнения двухбайтных величин с константой Код ;--- Если в R0, R1 лежит проверяемая величина (Var: R0-HiVar, R1-LoVar) ;--- Проверка Var < Const1 (HiConst1, LoConst1) CJNE R0, #HiConst1, Lab1 CJNE R1, #LoConst1, Lab1 Lab1: JNC LabNext CALL FunLoss; Если VAR < Const1 то вызываем FunLoss JMP LabelEnd LabelNext: ;--- Проверка Var > Const2 CJNE R0, #HiConst2, Lab2 CJNE R1, #LoConst2, Lab2 JMP LabelEnd Lab2: JC LabelEnd CALL FunMore; Если Var > Const2 то вызываем FunMore LabelEnd:
Сообщение отредактировал Палыч - Nov 2 2007, 10:23
|
|
|
|
|
Nov 3 2007, 22:32
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759

|
Цитата(Scorpline @ Nov 2 2007, 02:07)  ...и еще маленький вопросик. А если сравнивать уже 2 байта, то намного ли усложняется код? Дело просто в том что мне надо сравнивать код с ADC, а он у меня 12 разрядный (adc0h,adc0l)....  ...познаю *.ASM Кстати у F005 есть программируемый детектор диапазона АЦП, который устанавливает флаг ADWINT (только устанавливается в 1, сбрасывать нужно вручную) если значение ADC за или в пределах заданного ADC0GT / ADC0LT (16 бит) диапазона. Т.е. все сравнения выполняются автоматически после получения новых данных ADC.
|
|
|
|
|
Nov 4 2007, 22:25
|
Участник

Группа: Участник
Сообщений: 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? ...правда лучьше без него.
|
|
|
|
|
Nov 5 2007, 10:14
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759

|
Цитата(Scorpline @ Nov 5 2007, 00:25)  Да.. но ADWINT устанавливается в "1" в любом случае, если код с ADC вышел за границы "цифрового окна". А мне надо что бы выполнялись разные действия если код выше или ниже окна сравнения(...ну и соответственно сравнивать 2 байта... или как то можно это реализавать с ADWINT? ...правда лучьше без него.  Если Вы знаете что код за пределами окна, то вам нужно только 1 и скорее всего однобайтовое сравнения выше или ниже окна.
|
|
|
|
|
Nov 5 2007, 10:14
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759

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