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

 
 
 
Reply to this topicStart new topic
> Как читать отдельные биты регистров общего назначения -ассемблер., Непонятно.
serj32
сообщение Mar 30 2013, 17:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345



Здравствуйте.Вот если полностью "закинуть" ну например регистр R19 в регистр данных PORTB-здесь понятно.
out PORTB,R19
A как мне переместить ну скажем 2 бит регистра R19 в PORTB на 2 бит.
Это новерно будет так:
out PD2,R19.2
Спасибо.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 30 2013, 17:43
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 30 2013, 17:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(serj32 @ Mar 30 2013, 19:24) *
Это новерно будет так:
out PD2,R19.2

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


Go to the top of the page
 
+Quote Post
Семин
сообщение Mar 31 2013, 06:35
Сообщение #4


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

Группа: Участник
Сообщений: 142
Регистрация: 27-04-12
Пользователь №: 71 608



Может я и ошибаюсь, но вроде такого способа, напрямую "закинуть", куда бы то
нибыло, отдельный быт, нет ни у одного процессора. Биты можно устанавливать,
сбрасывать. Одно из этих действий нужно выбрать в зависимости от состояния
нужного бита "флага", проанализировав его. Можно с помощью логических команд
записывать целиком байт так, чтобы воздействовать только на один бит.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 31 2013, 10:43
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



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


BST/BLD?

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

Правда не знаю насколько правомерно где попало использовать бит T т.к. на ассемблере не пишу.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 31 2013, 11:10
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

Правомерно, бит Т именно для таких манипуляций и сделан, но только с битами в регистрах, с битами портов через него, увы, не поработать.
Для работы с I/O портом самое простое - вариант из сообщения #3.
Он, кстати, исполняется на один такт быстрее Вашего.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
ae_
сообщение Apr 21 2013, 12:40
Сообщение #7


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Копирование одновременно нескольких, произвольно расставленных бит из регистра в регистр, биты задаются маской (паттерном)
Код
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
Go to the top of the page
 
+Quote Post

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

 


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


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