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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

[uquote="BOB51",url="/forum/viewtopic.php?p=4596112#p4596112"]с последующей таблицей из GOTO переходов на исполняемые варианты подпрограмм[/uquote]
Это тот самый код нижнего уровня - элементарный мультиплексор.
любой уровень, даже самый верхний, может содержать в себе код любого уровня, даже самого нижнего.
Тут важно отличать уровень реализуемой сущности. Степень ее абстрактности.
В обсуждаемом переходе использован прием перемещения кода. это самая нижняя сущность. В ней нет ничего от конечной задачи. Тупо оффсет во флеше.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Аналогия switch case в Си всего то...
:tea:
Реклама
yor
Говорящий с текстолитом
Сообщения: 1679
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Так и обходите молчанием, что же может (даже не произойдёт), а только может произойти? Биты на байты налезут, или стек через своп в астрал улетит? Если логика продумана, то будет работать железно хоть так хоть этак. На то оно, как там его, железная логика)) Или имеете в виду возможное внесение косяков при изменении программы?
Что будет-то на железном уровне? Просто "харам" - это не доказательство. Или это не для начинающих.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Если получен тупик в текущем алгоритме почему бы не продумать иной вариант решения задачи?
Ведь проверка условий возможна весьма разными способами.
8)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

[uquote="yor",url="/forum/viewtopic.php?p=4596116#p4596116"]Если логика продумана[/uquote]
Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.
Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

У нас исходно сделать выбор в случае с текущим значением бита...
Можно по командам проверки состояния бита, а можно и по условному переходу, представив бит в адрес вектора перехода (табличный селектор).
То уж как интересно будет.
Да и на BTFSS/BTFSC переключатель соорудить можно только по каждой команде свое условие делается, а не два условия с одной команды.
8)
Реклама
yor
Говорящий с текстолитом
Сообщения: 1679
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.[/uquote]Ну это только если проццессор слабоват, или ОЗУ недостаточно))

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...[/uquote]Это да, полностью согласен. Но комментарии спасают.

А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

К Вашему примеру селектора:
Спойлер

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

; саму проверку вызываем как CALL TEST ибо надо фиксировать точку возврата
; к исходной программе (а она таки одна)
CALL TEST

TEST
BTFSS R0,N ; проверка на 1
BTFSC R0,N; если не 1 то проверяем на 0
goto point_a ; безусловный переход на точку
                   ; вызова подпрограммы при бите = 1
point_b ; точка вызова подпрограммы при бите = 0
       ;ТЕЛО ПРОГРАММЫ ДЛЯ БИТА РАВНОГО 0
       ;..............
ret ; или reti

point_a ; точка вызова подпрограммы при бите = 1
       ;ТЕЛО ПРОГРАММЫ ДЛЯ БИТА РАВНОГО 1
        ;..............
ret ; или reti
Надеюсь понятно, почему там CALL за btfss/btfsc не слишком корректна...
:wink:
Последний раз редактировалось BOB51 Пт июн 28, 2024 16:18:38, всего редактировалось 3 раза.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]Но комментарии спасают.[/uquote]
Увы нет. То есть совсем нет. Невозможно описать головоломную конструкцию, где заплатка погоняет заплаткой. У вас не хватит словарного запаса. У языка нет такого словарного запаса.
:)
[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]Два монитора бы спасли, это лучший вариант.[/uquote]
Все давно придумано в MPLABX. Там есть возможность открыть два экземпляра одного листинга в одной среде. Справа в верхнем углу листинга есть крестик. Потяните за него влево. Дверка с золотым ключиком откроется... :music:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]...

А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.[/uquote]
Если метка относится только к некоторому участку кода и нигде более не используется - проблем особо нет. Это объявление локальной метки действующей в ограниченной области кода. Тут главное не сделать повторного объявления ранее уже определенного регистра или данных.
Другое дело, когда определенная где-то в одном месте метка в дальнейшем будет использоваться в других частях программы.
Ежли "ниже по коду" это вполне возможно (хош и путаница в поиске первоисточника самой метки будет еще хуже, чем просмотр единого файла заголовка с определением меток).
А вот ежли "выше по коду" - тогда придется изворачиваться с #define и опять таки со списком определений в отдельном разделе (файле) в начале программы.
Да и никто не ограничивает возможность вставлять в начале текста программы проекта подключаемые файлы, к примеру:

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

#include <def_name_project.txt> ; файл объявленных имен, бит и констант
#include <mac_name_project.txt> ; файл описания макросов
;    вместо name_project подставляется имя файла соответствующего проекта
а уже в них укладывать все объявления.
Такой вариант легко просматривается/обрабатывается в любом текстовом редакторе с несколькими одновременно открытыми файлами даже на одном мониторе.
8)
yor
Говорящий с текстолитом
Сообщения: 1679
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

Что значит определить?
Перейти по условию? Тогда это btfss.
И что такое"долго и муторно"?
Опять же все зависит от семейства МК. В 18-х и 24-х есть иные варианты.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

yor писал(а):Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Почему долго?
Одного btfss (или btfsc -зависит от логики задачи) вполне достаточно.
Другое дело если тот бит контролируется в комплекте с остальным содержимым регистра или с дополнительными параметрами.
Альтернатива - сдвиг RLF Rx,w с последующей проверкой флага C регистра status.
Или хочется классическую инверсию бита в зависимости от его исходного состояния с помощью связки из тех btfss/btfsc замутить?
Чтой-то у Вас "творческий спад" наблюдается...
Не захворали ли часом?
:?
Аватара пользователя
Steppe
Друг Кота
Сообщения: 4812
Зарегистрирован: Вс сен 17, 2017 17:44:21
Откуда: 51.7727, 55.0988. Высота над морем 107 м. До границы 161 км.

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

Сообщение Steppe »

[uquote="BOB51",url="/forum/viewtopic.php?p=4596763#p4596763"]Чтой-то у Вас "творческий спад" наблюдается...[/uquote]
А был ли подъем?
yor
Говорящий с текстолитом
Сообщения: 1679
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение 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
Друг Кота
Сообщения: 3685
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

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

Сообщение abc »

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

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

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

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

[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
Говорящий с текстолитом
Сообщения: 1679
Зарегистрирован: Сб янв 19, 2008 23:57:27

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

Сообщение yor »

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

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

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

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

Сообщение BOB51 »

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

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

Сообщение abc »

yor, Rx - это регистр, куда загружено исходное значение 001xxxxx
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Ответить

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