Здравствуйте.Вот если полностью "закинуть" ну например регистр R19 в регистр данных PORTB-здесь понятно. out PORTB,R19 A как мне переместить ну скажем 2 бит регистра R19 в PORTB на 2 бит. Это новерно будет так: out PD2,R19.2 Спасибо.
mempfis_
Mar 30 2013, 17:43
Цитата(serj32 @ Mar 30 2013, 21:24)
Здравствуйте.Вот если полностью "закинуть" ну например регистр R19 в регистр данных PORTB-здесь понятно. out PORTB,R19 A как мне переместить ну скажем 2 бит регистра R19 в PORTB на 2 бит. Это новерно будет так: out PD2,R19.2 Спасибо.
Имеется ввиду переместить в PORTB состояние бита 2 регистра r19?
in r16, PORTB mov r17, r19 andi r16, ~(1<<2) andi r17, (1<<2) or r16, r17 out PORTB, r16
Словами. Копируем состояние порта в r16. Копируем r19 в r17 чтобы не потерять r19 (можно не делать если значение r19 далее не потребуется). Зануляем нужный бит не трогая остальные. В r17 зануляем все биты кроме требуемого. Выполняем or между r16 и r17. состояние бита из r17 будет скопировано в r16. Отправляем состояние в порт.
Я уже подзабыл ассемблер AVR. Там есть возможность напрямую работать с битами регистров а также команды проверки-пропуска SBRC/SBRS.
Может я и ошибаюсь, но вроде такого способа, напрямую "закинуть", куда бы то нибыло, отдельный быт, нет ни у одного процессора. Биты можно устанавливать, сбрасывать. Одно из этих действий нужно выбрать в зависимости от состояния нужного бита "флага", проанализировав его. Можно с помощью логических команд записывать целиком байт так, чтобы воздействовать только на один бит.
mempfis_
Mar 31 2013, 10:43
Цитата(Семин @ Mar 31 2013, 10:35)
Может я и ошибаюсь, но вроде такого способа, напрямую "закинуть", куда бы то нибыло, отдельный быт, нет ни у одного процессора.
BST/BLD?
in r16, PORTB bst r19, 2 bld r16, 2 out PORTB, r16
Правда не знаю насколько правомерно где попало использовать бит T т.к. на ассемблере не пишу.
SSerge
Mar 31 2013, 11:10
Цитата(mempfis_ @ Mar 31 2013, 17:43)
Правда не знаю насколько правомерно где попало использовать бит T т.к. на ассемблере не пишу.
Правомерно, бит Т именно для таких манипуляций и сделан, но только с битами в регистрах, с битами портов через него, увы, не поработать. Для работы с I/O портом самое простое - вариант из сообщения #3. Он, кстати, исполняется на один такт быстрее Вашего.
ae_
Apr 21 2013, 12:40
Копирование одновременно нескольких, произвольно расставленных бит из регистра в регистр, биты задаются маской (паттерном)
Код
EOR R16, R10 CBR R16, 0b00100110; копируем биты 1,2,5 из регистра R10 в R16 EOR R16, R10
Для работы с портом в/в добавляем in в начале и out в конце:
Код
IN R16, PORTN EOR R16, R10 CBR R16, 0b01001101; копируем биты 0,2,3,6 из регистра R10 в PORTN EOR R16, R10 OUT PORTN, R16
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.