Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как читать отдельные биты регистров общего назначения -ассемблер.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
serj32
Здравствуйте.Вот если полностью "закинуть" ну например регистр R19 в регистр данных PORTB-здесь понятно.
out PORTB,R19
A как мне переместить ну скажем 2 бит регистра R19 в PORTB на 2 бит.
Это новерно будет так:
out PD2,R19.2
Спасибо.
mempfis_
Цитата(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.

sbrs r19, 2
rjump clear
sbi PORTB, 2
rjump next
clear:
cbi PORTB, 2
next:

Если бит 2 регистра r19 установлен то пропуск следующей интсрукции и на установка бита в PORTB с прыжком на метку next, иначе прыжок на метку clear

http://www.atmel.com/Images/doc1022.pdf
_Артём_
Цитата(serj32 @ Mar 30 2013, 19:24) *
Это новерно будет так:
out PD2,R19.2

Нет, не будет.
Возможны варианты.
Например так:
Код
    sbrc    R19,2
    sbi      PORTD,2
    sbrs    R19,2
    cbi      PORTD,2


Семин
Может я и ошибаюсь, но вроде такого способа, напрямую "закинуть", куда бы то
нибыло, отдельный быт, нет ни у одного процессора. Биты можно устанавливать,
сбрасывать. Одно из этих действий нужно выбрать в зависимости от состояния
нужного бита "флага", проанализировав его. Можно с помощью логических команд
записывать целиком байт так, чтобы воздействовать только на один бит.
mempfis_
Цитата(Семин @ Mar 31 2013, 10:35) *
Может я и ошибаюсь, но вроде такого способа, напрямую "закинуть", куда бы то
нибыло, отдельный быт, нет ни у одного процессора.


BST/BLD?

in r16, PORTB
bst r19, 2
bld r16, 2
out PORTB, r16

Правда не знаю насколько правомерно где попало использовать бит T т.к. на ассемблере не пишу.
SSerge
Цитата(mempfis_ @ Mar 31 2013, 17:43) *
Правда не знаю насколько правомерно где попало использовать бит T т.к. на ассемблере не пишу.

Правомерно, бит Т именно для таких манипуляций и сделан, но только с битами в регистрах, с битами портов через него, увы, не поработать.
Для работы с I/O портом самое простое - вариант из сообщения #3.
Он, кстати, исполняется на один такт быстрее Вашего.
ae_
Копирование одновременно нескольких, произвольно расставленных бит из регистра в регистр, биты задаются маской (паттерном)
Код
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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.