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

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

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

Сообщение yor »

Скажите пож-ста, ПП многобайтового умножения/деления, в частности с piclist.com, в случае малых операндов быстрее работают, чем под завязку? То есть в ПП 32-разрядного деления 9:3 не будет 100 или 1000 циклов? Догадываюсь, что зависимость не прямая, но всё-таки быстрее?
Реклама
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Можно ли на pic16f648 вычислить за не более чем 2000 тактов такое выражение:

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

X=(A*B+C*D):E
где A, B, C, D, E - двухбайтовые
Это получается, что умножение 2-х байтовых чисел, сложение - 4-х байтовых, а деление - четыре байта на два.
Реклама
Аватара пользователя
Steppe
Друг Кота
Сообщения: 4812
Зарегистрирован: Вс сен 17, 2017 17:44:21
Откуда: 51.7727, 55.0988. Высота над морем 107 м. До границы 161 км.

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

Сообщение Steppe »

[uquote="yor",url="/forum/viewtopic.php?p=4582773#p4582773"]Можно ли на pic16f648 вычислить за не более чем 2000 тактов такое выражение:

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

X=(A*B+C*D):E
где A, B, C, D, E - двухбайтовые
Это получается, что умножение 2-х байтовых чисел, сложение - 4-х байтовых, а деление - четыре байта на два.[/uquote]
Напиши и проверь. В любом IDE под PIC.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Запускаем симулятор МПЛАБа и смотрим...
:roll:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

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

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

[uquote="yor",url="/forum/viewtopic.php?p=4582773#p4582773"]Можно ли[/uquote]
на асме в 1400 укладывается
Реклама
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Подскажите пож-ста идею, а то я завис, как проверить совпадение текущего состояния регистра PORTA (или бита в регистре) с предыдущим Dflag, при первом проходе? Ведь сначала оно ни то ни сё, при последующих понятно.

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

loop-drbzg equ 5 ; кол-во проходов
cnt-loop equ addr
Dflag equ addr
D1 equ 2<--->; RA2 sense in, active LOW ↓↑
D2 equ 3<--->; RA3 sense in, active LOW ↓↑
;;; Начало работы, сканирование обоих датчиков
scanDs0: movlw<>loop-drbzg<---->; установка числа проходов
<------>movwf<->cnt-loop,f
scanDs1: movf<->PORTA,w><------>; RA2 RA3 sense in актив лог0
<------>xorlw<->0xС<---><------>; тест RA2 RA3, инверсия актива в лог1
<------>movwf<->Dflag
<------>btfsc<->Dflag,D1
<------>goto<-->далееД1актив
<------>btfss<->Dflag,D2
<------>goto<-->scanDs0><------>; ничего, входы неактивны
<------>goto<-->далееД2актив
<------>
<------>
<------>decfsz<>cnt-loop,f<---->; один из Д сработал, декремент счётчика проходов
<------>goto<-->scanDs1><------>; на след проход
<------><------><------><------>; в W активный бит Д1/Д2=1, TODO проверка бита на повторяемость
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Так при первом проходе мы только данные в буфер считываем из порта...
Как вариант до запуска сканера установить инициализацию буфера пассивным состоянием контрольных бит.
А уж затем цикл запускать.
:roll:
В принципе... Сначала делаем анализ с предыдущим состоянием (загрузка буфера по инициализации или новые данные от предшествующего цикла), затем по результату (при несовпадении) переносим текущее значение порта в буфер и уходим в следующий цикл...
:tea:
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Да, чего я панику-то поднял... Подумаешь, по первой проверке без предынициализации по ошибке уйдёт на повтор, а дальше уже как надо. Лишний цикл не помешает))
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Расшифруйте, пож-ста, эту строку:

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

andlw  (1<<4)||(1<<5)  ;only want bits 4 and 5
В "MPASM USER'S GUIDE with MPLINK and MPLIB" пишут, что это:

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

<< Left shift     flags = flags << 1
>> Right shift   flags = flags >> 1
Это оно? По этому описанию трудно понять, что имеется в виду. Что за флаги, что за единица? Что к чему? Где описание полнее?
Из команды мне только понятно, что || - это ИЛИ, 4 или 5. И это должна быть числовая константа.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25219
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

[uquote="yor",url="/forum/viewtopic.php?p=4588589#p4588589"]Где описание полнее?[/uquote]
Полнее некуда.
1<<4 означает сдвиг единицы влево на 4 разряда
То есть из 0b00000001 будет 0b00010000
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

yor писал(а):... Что к чему? Где описание полнее?...
рекомендую стародобрую литературу в качественном переводе вот отсюда:
https://web.archive.org/web/20080208141 ... t/?mid=1x0
в частности
https://web.archive.org/web/20080208141 ... /mpasm.pdf
и справочник по железу (это одним файлом - там странице выше есть то же самое из нескольких раздельных файлов)
https://web.archive.org/web/20080208141 ... Manual.pdf
ну и чего там еще интересного найдете :wink:
:beer:
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

КРАМ писал(а):1<<4 означает сдвиг единицы влево на 4 разряда
Это, как его там, макрокоманды? Оно само ассемблируется в последовательность команд? По примеру SKPZ, например, в пару bittest & goto? То есть так прямо в листинге пишется?

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

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

Сообщение BOB51 »

это вычисляет сам компилятор
почитаете в руководстве по ассемблеру
8)
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Да уж, качественные переводы... Половина этого у меня есть. Давно замечал, а тут вот прямо целый раздел отсутствует, в mpasm-rus аппендикс Б из английской версии пропущен, там где описываются сокращения SKPXX, SETXX, NEGF и т.п. И он не древний, свежее оригинала по дате. Дела давно минувших дней, больше 20 лет прошло.

Раздел "MPASM Arithmetic Operators", ввиду недостаточности описания, понимаю только по догадкам и багажу советского образования))
Вот это не понимаю:

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

andlw  (1<<4)||(1<<5)  ;only want bits 4 and 5
Надо сделать И над W и константой. Как

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

(1<<4)||(1<<5)
преобразовывается в константу? Сначала в скобках, ИЛИ правое или левое? Что сдвигается-то в скобках? Во что эту конструкцию развернёт ассемблер?
Или ткните носом, где это описано, пж-ста.
diplodok
Мудрый кот
Сообщения: 1766
Зарегистрирован: Чт авг 10, 2017 20:57:51

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

Сообщение diplodok »

Никогда мне не нравилась запис типа

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

movlw  (1<<4)||(1<<5)
Пример:

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

movlw (~(((1<<7) |  (1<<6)) ^ ((1<<7) |  (1<<6))))+1
равно

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

movlw 0x00
yor писал(а):Надо сделать И над W и константой. Как

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

movlw 0xff
andlw b'00110000'
если хочется shift

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

movlw 0xff
andlw  (1<<4) | (1<<5)  ;only want bits 4 and 5
Обрати внимание на оператор ИЛИ Есть || - логический, а есть и | побитовый

Таким образом код

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

	movlw	0xff
	andlw	(1<<4)||(1<<5)  ; W=0x01
	movlw	0xfe
	andlw	(1<<4)||(1<<5)  ; W=0x00
	movlw	0xfe
	andlw	(1<<4)| (1<<5)  ; W=0x30      
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Не скажу, что стало понятно. Наоборот, ещё больше путаницы. Не могу проследить причины и следствия. Они тут точно есть?
diplodok
Мудрый кот
Сообщения: 1766
Зарегистрирован: Чт авг 10, 2017 20:57:51

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

Сообщение diplodok »

yor писал(а):Не могу проследить причины и следствия. Они тут точно есть?
???????? :dont_know:
Не понимаю
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Я спросил: Как

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

(1<<4)||(1<<5)
преобразовывается в константу?
Это ответ:

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

movlw 0xff
andlw b'00110000'
??? Возникают вопросы: откуда FF и причём тут вообще movlw и почему оба бита, когда ИЛИ?

Просьба объяснять как процессору, который не понимает недоговорок)) Так это где-то описано? Откуда эти знания?
diplodok
Мудрый кот
Сообщения: 1766
Зарегистрирован: Чт авг 10, 2017 20:57:51

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

Сообщение diplodok »

Попытаюсь.
yor писал(а):Как
Код:
(1<<4)||(1<<5)
преобразовывается в константу?
В компиляторе есть "калкулятор" вычисляющий константы.
Откуда он знает что там константа? movlw, andlw и т.д. требуют константу.
Как компилятор вычисляет выражение (1<<4)||(1<<5) - ЛОГИЧЕСКОЕ ИЛИ
1. сдвигает 1 на 4 вправо = 00010000
2. сдвигает 1 на 5 вправо = 00100000
3. выполняет ЛОГИЧЕСКОЕ ИЛИ
- принято если операнд, переменная равна 0 то FALSE (ложь)
в притивном случае TRUE (истина)
00010000 <> 0 TRUE 1
00100000 <> 0 TRUE 1
TRUE || TRUE = TRUE = 1
Таким образом компилятор на место (1<<4)||(1<<5) ставить 0x01
и дальше вся ваша логика идет к .....


Как компилятор вычисляет выражение (1<<4)|(1<<5) - ПОБИТОВОЕ ИЛИ
1. сдвигает 1 на 4 вправо = 00010000
2. сдвигает 1 на 5 вправо = 00100000
3. выполняет ПОБИТОВОЕ ИЛИ
00010000 | 00100000 = 00110000 = 0x30
что тебе и нужно по логике ...
yor писал(а):Возникают вопросы: откуда FF
чтобы показать тебе как работают логическое и побитовое ИЛИ нужно вставить что-то в регистре W.
FF & 0x01 = 0х01
FE & 0x01 = 0х00
FF & 0x30 = 0x30 - что тебе нужно
yor
Говорящий с текстолитом
Сообщения: 1678
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

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

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