Перейти к содержанию

Установка бита в зависимости от значения переменной


Рекомендуемые сообщения

Здравствуйте!

Подскажите оптимальное решение. Применять буду на ассемблере AVR

Допустим, есть регистр R16, в нём есть значение в диапазоне от 0 до 7 (целые числа). Задача установить соответствующий этому числу бит в регистре R17.

На языке компилятора это будет вроде R17 = (1 << R16), вот только компилятор в таком случае принимает вместо регистра константы, что и понятно, такой команды в списке команд AVR нет.

Можно сделать конструкцию вида Switch - case

Можно в цикле сдвигать единичку столько раз, какое число есть в регистре R16.

 

А нет ли более изящного решения?

Заранее спасибо!

Ссылка на комментарий
Поделиться на другие сайты

О мудрейший! Спасибо за столь адекватную оценку моего скромного опуса.

А подскажите команду, которой это реализуется?

Есть lsl, lsr (логический сдвиг на разряд вправо и влево). Есть логические операции с константой (и, или, не), где константа формируется компилятором на основе как раз таки операций вроде 1<<5.

Какая операция отвечает за логический сдвиг на n разрядов, где n располагается в другом регистре/ячейке памяти, а не в тексте программы?

Изменено пользователем number_nine
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А прочитать книгу вера не позволяет?

А проверить свои мысли в отладчике или Протеус тоже вера не позволяет

Или поколение пепси разучилось что то делать

Зачем помогать тому кто не хочет этого

..............

Изменено пользователем hasl
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm 

Первая страница с гугла по запросу avr asm команды

Дальше жмете контрл + F и пишите бит

Вам подсветит хром все желтым, со словом бит, и вы видите все возможные команды.

Там есть установить бит, сбросить бит и тд.

 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

47 минут назад, hasl сказал:

А прочитать книгу вера не позволяет?

А проверить свои мысли в отладчике или Протеус тоже вера не позволяет

Или поколение пепси разучилось что то делать

Зачем помогать тому кто не хочет этого

..............

И в чём Вы помогли? Тут ветка для начинающих, так?

Давайте не будем мерятся кто сколько книг прочёл и кто какого поколения будет, ок? А то может стать мучительно стыдно )))

 

Вы все, видимо, обладаете клиповым сознанием, увидели слово и триггернулись посылать читать книги, искать в гугле, даже не пытаясь вникнуть в суть вопроса.

Поэтому я повторю вопрос:

Есть байт X, принимает значение 0..7. Есть регистр, соответственно архитектуре 8 бит. У каждого бита есть позиция 7.6.5...0. Байт указывает на ту позицию, которую нужно (допустим) установить в 1. Как это сделать быстрее и компактнее? Мне на ум приходит, например сдвиг единицы командой LSL в цикле, количество итераций которого равно значению числа в байте X. Либо сделать конструкцию switch - case. В зависимости от значения байта X адресной адресацией выбирается ветка, где при помощи битовой маски и команды логической операции изменяется нужный бит.

Получается зависимость

X          Rd

0          0000 0001

1          0000 0010

2          0000 0100

3          0000 1000

4          0001 0000

....

7          1000 0000

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, number_nine сказал:

Давайте не будем мерятся кто сколько книг прочёл и кто какого поколения будет, ок? А то может стать мучительно стыдно )))

да ни кто не меряется ни чем. просто вон список команд, я даже сказал по какому слову вам надо найти, а вы опять про циклы...

по вашему вопросу видно же что вы вроде понимаете о чем говорите, ну там там же прям есть команда которая нужна вам.

ну или я не понимаю таки вопроса :D

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

@number_nine Интернет нам подсказывает, что тут подходит пример табличного чтения.

Делаете в памяти программ массив с желаемым результатом

table:
.db 1,2,4,8,16,32,64,128

Затем кладёте в регистр Z адрес этого массива, добавляете к регистру Z сдвиг по таблице = значение регистра r16 с учётом переноса и считываете результат в регистр r17

ldi  ZL, low(table*2)  
ldi  ZH, high(table*2)   
add ZL, r16                
clr r16
adc ZH, r16
lpm r17, Z 

 

Ссылка на комментарий
Поделиться на другие сайты

а чем вас не устраивают существующие? обычно всегда компромисс скорость/память. быстро - значит память жрет, мало памяти - значит медленно. Если нет инструкции, сдвигающей на значение, лежащее в регистре, то варианта 2 - табличный, либо сдвиг в цикле.
Можете еще включить -O3 в компиляторе и посмотреть, что он генерит на операцию вида a<<b

Изменено пользователем LeonidPr
Ссылка на комментарий
Поделиться на другие сайты

Хотел узнать, возможно есть какой-нибудь хитрый математико-логический способ перевести число в позицию единичного бита. Всем спасибо, тему можно закрыть.

Ссылка на комментарий
Поделиться на другие сайты

@colorad Да, в принципе это правильно, но если формализовать на асме, то получится тот же цикл сдвигов (умножение на 2), где n - кол-во итераций цикла

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Yurkin2015 сказал:

Делаете в памяти программ массив с желаемым результатом


table:
.db 1,2,4,8,16,32,64,128

ноль ты забыл поставить в начале таблицы.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

да, согласен, просчитался я ...

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Вариант первый.

ldi r16, 1

Cycle:

dec r16

Проверка на переполнение или отрицательное число, не помню команду.

Если да, выход, если нет

lsl r16

rjmp Cycle

Получили бит в соответствии с переменной от 0 до 7.

Второй вариант.

Создаем таблицу.

Table_bits:

.db 0b00000001, 0b00000010

.db 0b00000100, 0b00001000

.db 0b00010000, 0b00100000

.db 0b01000000, 0b10000000

Установка адреса указателя на flash таблицу. Прибавляем переменную. Считывает значение. Получаем бит в соответствии с переменной от 0 до7.

Народ. В данном случае вопрос касается алгоритмов. Вы не правы, отправляя тс читать книги. В книгах зачастую нет ответа на такие вопросы.

Ссылка на комментарий
Поделиться на другие сайты

ты ошибся с регистром результата.

должно быть так:

ldi r17, 1

Cycle:

tst r16

breq end

dec R16

lsl r17

rjmp Cycle

end:

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

@number_nine оффтоп конечно, но в АРМ процессорах это все есть без нужды придумывать вот такое. Интересно люди еще используют АВР) Для учебы конечно штука хорошая.

Ссылка на комментарий
Поделиться на другие сайты

Пройдя учебу (штуку хорошую), люди многому учатся. Например так:

inc		r16			; это позволит сократить цикл до 3-х строчек
sec					; подготовим перенос
cycle:
	rol		r17		; и поехали...
	dec		r16		;
end_cycle:
	brne		cycle

Согласитесь. HAL и рядом не валяется.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...