Вопросы начинающих PIC ASM

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

КРАМ писал(а):Что значит определить?
Вам тоже надо как процессору объяснять))
yor писал(а):Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Определить позицию старшего единичного бита в байте, для вычисления его веса (^2), 128 64 ... 2 1, 16f648.

[uquote="BOB51",url="/forum/viewtopic.php?p=4596763#p4596763"]Почему долго? Одного btfss (или btfsc -зависит от логики задачи) вполне достаточно.[/uquote] Начинаем со старшего, и в худшем случае пока до младшего дойдёшь, 8 циклов. Наоборот смысла нет. Да ещё и восемь раз повторять эти btfss с изменяющимся номером бита. В смысле, в цикл затруднительно засунуть, в связи со сложностью динамической смены номера бита, команд получится много.

[uquote="BOB51",url="/forum/viewtopic.php?p=4596763#p4596763"]Альтернатива - сдвиг RLF Rx,w с последующей проверкой флага C регистра status.[/uquote]Спасибо, я до этого тоже уже додумался, но те же 8 циклов

А больше, похоже, никак, в один присест не получится. Хотя, если учесть последующие действия, может чего и придумается. Это для того, чтобы из

Код: Выделить всё

001xxxxx -> позиция №5 -> вес 32 -> 32*2=64 -> преобразовать в три младшие бита регистра OPTION PS[2:0] для предделителя TMR0.
То есть в этом случае 64-> PS[2:0]=101

Код: Выделить всё

PS<2:0>: Prescaler Rate Select bits Bit Value TMR0
 000 1:2
 001 1:4
 010 1:8
 011 1:16
 100 1:32
 101 1:64
 110 1:128
 111 1:256
И это мне ещё повезло, что остальные биты OPTION всегда нулевые будут, и можно просто писать

Код: Выделить всё

00000101 -> OPTION
Реклама
abc
Друг Кота
Аватара пользователя
Сообщения: 3705
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Сообщение abc »

Код: Выделить всё

rrf Rx,f
swapf  Rx,w
andlw  b'00000111'
movwf  OPTION
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4596783#p4596783"]
yor писал(а):Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Определить позицию старшего единичного бита в байте, для вычисления его веса (^2), 128 64 ... 2 1, 16f648.[/uquote]
Наверное нужно сначала думать, а лишь потом формулировать вопрос.
Определить старший единичный байт и определить позицию старшего единичного байта - это две большие разницы.
Однако да, подобные задачи не компактны, поэтому в системе команд PIC24/dsPIC есть специальные инструкции FF1L/FF1R позволяющие вернуть позицию первого единичного бита слева или справа. Причем за один машинный цикл.
Так же есть инструкция определяющая позицию первого слева ИЗМЕНИВШЕГОСЯ бита - FBCL. Для положительных значений это будет первая слева 1 после 0, а для отрицательных - первый слева ноль после 1. И тоже за один машинный цикл.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="abc",url="/forum/viewtopic.php?p=4596788#p4596788"]

Код: Выделить всё

rrf Rx,f
swapf  Rx,w
andlw  b'00000111'
movwf  OPTION
[/uquote]
AND по маске это понятно, а вот первые две команды как приложить - ума не приложу.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вопрос исходно совсем некорректно задан был!
:facepalm:
Для такого простейшего определения или функция препроцессора (есть в ассемблерах у атмела для авр/mcs51) или программный табличный обработчик - у ПИКовых для такого есть RETLW (табличное преобразование)
8)
Реклама
abc
Друг Кота
Аватара пользователя
Сообщения: 3705
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Сообщение abc »

yor, Rx - это регистр, куда загружено исходное значение 001xxxxx
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Реклама
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Я так и подумал, но этот вариант работает только с этим значением, а если будет другое, 01хххххх, или 0000011хх?

Код: Выделить всё

; 001xxxxx
rrf Rx,f  ; 0001xxxx
swapf  Rx,w ; хххх0001
andlw  b'00000111' : W=xxxxx001
movwf  OPTION
Да даже с этим не работает, или я не понимаю. По-моему, Вы не вникли в глубину проблемы))
Кстати, ещё "когтисто" забыли. Колючелапо - это не визуальный признак))
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Если нужно предельно быстро, то это таблица на 255 значений.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

У 648 всего 256 памяти, или можно в программной разместить?
Предельно быстро не надо, я согласен на 100 тактов))
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4596869#p4596869"]в программной разместить?[/uquote]
Таблицы и размещают в программной.
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Я ж уже выше про RETLW намякивал.
И про прямой доступ к PCL как к обычному регистру в командах, работающих с регистрами ОЗУ.
:wink:
abc
Друг Кота
Аватара пользователя
Сообщения: 3705
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Сообщение abc »

BOB51, не, я только теперь понял.
Там из произвольного байта нужно получить три бита, первый из которых - первая слева единица в исходном байте, а вторые два следуют за ним.
В общем, надо сдвигать байт влево, пока в старшем не будет "1" (или не сдвигать, если там уже 1), а потом можно использовать тот кусок кода, что я приводил.
Как это сделать еще проще - нет времени разбираться, задача вообще не из тривиальных (да и сформулирована была просто охрененно).
Последний раз редактировалось abc Вс июн 30, 2024 15:12:53, всего редактировалось 1 раз.
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Записать возможные состояния в таблице.
И работать как с обычным табличным кодером/декодером.
Максимум добавить маску для удаления неиспользуемых бит.
8)
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Кто скажет, что я не решил эту задачу без табличного чтения и прочих извращений с непрямой адресацией и вычисляемыми переходами, пусть первый бросит в меня камень))

Код: Выделить всё

; Вычисление Rtmp2  >^2, веса бита, следующего за старшим единичным, 7bit=128->256 ... 3bit=8->16 ... 0bit=1->2
<------>movlw<->9h<----><------>; кол-во циклов сдвига * 2
<------>movwf<->Rtmp1
srchHbit: decf<>Rtmp1,F
<------>rlf<--->Rtmp2,F
<------>btfss<->STATUS,C
<------>goto<-->srchHbit
<------>clrw<--><------><------>; Rtmp1 = вес старшего знач бита * 2, иначе вес следующего за старшим знач бита
wght2nmb: addlw>1
<------>decf<-->Rtmp1,F
<------>btfss<->STATUS,C
<------>goto<-->wght2nmb
<------>movwf<->pTMRon<><------>; W = OPTION:00000:PS[2:0]
И даже меньше чем за 20 циклов. Что скажете?
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Можно всё, что угодно, если результат устраивает и формулировка задачи верно указана.
8)
Чего в данном случае хотелось автору - сложно сказать...
:dont_know:
Могу лишь гадать...
Вероятно на кой то спортивный интерес ищем весовой коэффициент (EXP2) битика с 1, который будет следующим за первым встречным битом с 1 в анализируемом байте...
Т. е. сначала находим крайний левый бит с 1, затем следующий за ним со значением 1 и уже для него весовой коэффициент из ряда 128-64-32-16-8-4-2-1...
Или я не угадал?
:roll:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Ну дак я талдычу об этом, со второго раза доходчиво вроде объяснил, чего гадать-то)) Всё так. А теперь скажите тогда для общего развития, во сколько тактов обошлось бы табличное чтение в этом случае? И зачем таблица в 256 ячеек, если я правильно понимаю, то в таблице прописаны значения для OPTION:00000:PS[2:0], и по весу (или вернее, месту) бита в байте читаем из ячеек? То есть таблица тоже 8 байт, и тактов около того же?
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ежли я таки угадал...
То у "спортивной задачи" совершенно иное решение напрашивается.
Только вот нафига оная задача нужна, кроме "чистого спорту"?
Ни с точки зрения алгоритма, ни для практики ничего нового она не даёт.
:dont_know: :sleep:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

В данном случае быстрее оно или нет?
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

DDS по другому алгоритму считается...
:dont_know:
А для "спортивной задачи" табличка лишь одна из составляющих будет...
:roll:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

yor, там выше в твоем коде если Rtmp2 будет ноль, то до clrw не доберешься ... возможно и ниже есть проблемы, но я не смотрел
насколько я понял (пришлось несколько раз перечитать) суть задачи в том, чтобы просто преобразовать номер старшего бита в соответствующее ему число ?
почему бы тогда просто не взять сразу крайнее число и уменьшая/увеличивая его синхронно проверять биты? или я так и не понял суть задачи...

Код: Выделить всё

ip1
	movlw	07h
	movwf	reg
	;
ip1.it1	
	btfsc	val,7
	goto	ip1.rez
	rlf	val,f
	decfsz	reg,f
	goto	ip1.it1
	;
ip1.rez
	movf	reg,w
	movwf	OPTION_REG
Контактная информация:
Ответить

Вернуться в «PIC»