Вопросы начинающих PIC ASM
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
[uquote="BOB51",url="/forum/viewtopic.php?p=4596112#p4596112"]с последующей таблицей из GOTO переходов на исполняемые варианты подпрограмм[/uquote]
Это тот самый код нижнего уровня - элементарный мультиплексор.
любой уровень, даже самый верхний, может содержать в себе код любого уровня, даже самого нижнего.
Тут важно отличать уровень реализуемой сущности. Степень ее абстрактности.
В обсуждаемом переходе использован прием перемещения кода. это самая нижняя сущность. В ней нет ничего от конечной задачи. Тупо оффсет во флеше.
Это тот самый код нижнего уровня - элементарный мультиплексор.
любой уровень, даже самый верхний, может содержать в себе код любого уровня, даже самого нижнего.
Тут важно отличать уровень реализуемой сущности. Степень ее абстрактности.
В обсуждаемом переходе использован прием перемещения кода. это самая нижняя сущность. В ней нет ничего от конечной задачи. Тупо оффсет во флеше.
- Реклама
Re: Вопросы начинающих PIC ASM
Аналогия switch case в Си всего то...

Re: Вопросы начинающих PIC ASM
Так и обходите молчанием, что же может (даже не произойдёт), а только может произойти? Биты на байты налезут, или стек через своп в астрал улетит? Если логика продумана, то будет работать железно хоть так хоть этак. На то оно, как там его, железная логика)) Или имеете в виду возможное внесение косяков при изменении программы?
Что будет-то на железном уровне? Просто "харам" - это не доказательство. Или это не для начинающих.
Что будет-то на железном уровне? Просто "харам" - это не доказательство. Или это не для начинающих.
Re: Вопросы начинающих PIC ASM
Если получен тупик в текущем алгоритме почему бы не продумать иной вариант решения задачи?
Ведь проверка условий возможна весьма разными способами.

Ведь проверка условий возможна весьма разными способами.
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
[uquote="yor",url="/forum/viewtopic.php?p=4596116#p4596116"]Если логика продумана[/uquote]
Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.
Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...
Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.
Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...
- Реклама
Re: Вопросы начинающих PIC ASM
У нас исходно сделать выбор в случае с текущим значением бита...
Можно по командам проверки состояния бита, а можно и по условному переходу, представив бит в адрес вектора перехода (табличный селектор).
То уж как интересно будет.
Да и на BTFSS/BTFSC переключатель соорудить можно только по каждой команде свое условие делается, а не два условия с одной команды.

Можно по командам проверки состояния бита, а можно и по условному переходу, представив бит в адрес вектора перехода (табличный селектор).
То уж как интересно будет.
Да и на BTFSS/BTFSC переключатель соорудить можно только по каждой команде свое условие делается, а не два условия с одной команды.
Re: Вопросы начинающих PIC ASM
[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.[/uquote]Ну это только если проццессор слабоват, или ОЗУ недостаточно))
[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...[/uquote]Это да, полностью согласен. Но комментарии спасают.
А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.
Разве только для самых примитивных задач.[/uquote]Ну это только если проццессор слабоват, или ОЗУ недостаточно))
[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...[/uquote]Это да, полностью согласен. Но комментарии спасают.
А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.
Re: Вопросы начинающих PIC ASM
К Вашему примеру селектора:
Надеюсь понятно, почему там CALL за btfss/btfsc не слишком корректна...

Спойлер
Код: Выделить всё
; саму проверку вызываем как 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
Последний раз редактировалось 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. Там есть возможность открыть два экземпляра одного листинга в одной среде. Справа в верхнем углу листинга есть крестик. Потяните за него влево. Дверка с золотым ключиком откроется...
Увы нет. То есть совсем нет. Невозможно описать головоломную конструкцию, где заплатка погоняет заплаткой. У вас не хватит словарного запаса. У языка нет такого словарного запаса.
[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]Два монитора бы спасли, это лучший вариант.[/uquote]
Все давно придумано в MPLABX. Там есть возможность открыть два экземпляра одного листинга в одной среде. Справа в верхнем углу листинга есть крестик. Потяните за него влево. Дверка с золотым ключиком откроется...
Re: Вопросы начинающих PIC ASM
[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]...
А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.[/uquote]
Если метка относится только к некоторому участку кода и нигде более не используется - проблем особо нет. Это объявление локальной метки действующей в ограниченной области кода. Тут главное не сделать повторного объявления ранее уже определенного регистра или данных.
Другое дело, когда определенная где-то в одном месте метка в дальнейшем будет использоваться в других частях программы.
Ежли "ниже по коду" это вполне возможно (хош и путаница в поиске первоисточника самой метки будет еще хуже, чем просмотр единого файла заголовка с определением меток).
А вот ежли "выше по коду" - тогда придется изворачиваться с #define и опять таки со списком определений в отдельном разделе (файле) в начале программы.
Да и никто не ограничивает возможность вставлять в начале текста программы проекта подключаемые файлы, к примеру:
а уже в них укладывать все объявления.
Такой вариант легко просматривается/обрабатывается в любом текстовом редакторе с несколькими одновременно открытыми файлами даже на одном мониторе.

А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.[/uquote]
Если метка относится только к некоторому участку кода и нигде более не используется - проблем особо нет. Это объявление локальной метки действующей в ограниченной области кода. Тут главное не сделать повторного объявления ранее уже определенного регистра или данных.
Другое дело, когда определенная где-то в одном месте метка в дальнейшем будет использоваться в других частях программы.
Ежли "ниже по коду" это вполне возможно (хош и путаница в поиске первоисточника самой метки будет еще хуже, чем просмотр единого файла заголовка с определением меток).
А вот ежли "выше по коду" - тогда придется изворачиваться с #define и опять таки со списком определений в отдельном разделе (файле) в начале программы.
Да и никто не ограничивает возможность вставлять в начале текста программы проекта подключаемые файлы, к примеру:
Код: Выделить всё
#include <def_name_project.txt> ; файл объявленных имен, бит и констант
#include <mac_name_project.txt> ; файл описания макросов
; вместо name_project подставляется имя файла соответствующего проектаТакой вариант легко просматривается/обрабатывается в любом текстовом редакторе с несколькими одновременно открытыми файлами даже на одном мониторе.
Re: Вопросы начинающих PIC ASM
Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Что значит определить?
Перейти по условию? Тогда это btfss.
И что такое"долго и муторно"?
Опять же все зависит от семейства МК. В 18-х и 24-х есть иные варианты.
Перейти по условию? Тогда это btfss.
И что такое"долго и муторно"?
Опять же все зависит от семейства МК. В 18-х и 24-х есть иные варианты.
Re: Вопросы начинающих PIC ASM
Почему долго?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
[uquote="BOB51",url="/forum/viewtopic.php?p=4596763#p4596763"]Чтой-то у Вас "творческий спад" наблюдается...[/uquote]
А был ли подъем?
А был ли подъем?
Re: Вопросы начинающих PIC ASM
Вам тоже надо как процессору объяснять))КРАМ писал(а):Что значит определить?
Определить позицию старшего единичного бита в байте, для вычисления его веса (^2), 128 64 ... 2 1, 16f648.yor писал(а):Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
[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.Код: Выделить всё
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Код: Выделить всё
00000101 -> OPTIONRe: Вопросы начинающих PIC ASM
Код: Выделить всё
rrf Rx,f
swapf Rx,w
andlw b'00000111'
movwf OPTION>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
- КРАМ
- Друг Кота
- Сообщения: 25261
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
[uquote="yor",url="/forum/viewtopic.php?p=4596783#p4596783"]
Наверное нужно сначала думать, а лишь потом формулировать вопрос.
Определить старший единичный байт и определить позицию старшего единичного байта - это две большие разницы.
Однако да, подобные задачи не компактны, поэтому в системе команд PIC24/dsPIC есть специальные инструкции FF1L/FF1R позволяющие вернуть позицию первого единичного бита слева или справа. Причем за один машинный цикл.
Так же есть инструкция определяющая позицию первого слева ИЗМЕНИВШЕГОСЯ бита - FBCL. Для положительных значений это будет первая слева 1 после 0, а для отрицательных - первый слева ноль после 1. И тоже за один машинный цикл.
Определить позицию старшего единичного бита в байте, для вычисления его веса (^2), 128 64 ... 2 1, 16f648.[/uquote]yor писал(а):Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Наверное нужно сначала думать, а лишь потом формулировать вопрос.
Определить старший единичный байт и определить позицию старшего единичного байта - это две большие разницы.
Однако да, подобные задачи не компактны, поэтому в системе команд PIC24/dsPIC есть специальные инструкции FF1L/FF1R позволяющие вернуть позицию первого единичного бита слева или справа. Причем за один машинный цикл.
Так же есть инструкция определяющая позицию первого слева ИЗМЕНИВШЕГОСЯ бита - FBCL. Для положительных значений это будет первая слева 1 после 0, а для отрицательных - первый слева ноль после 1. И тоже за один машинный цикл.
Re: Вопросы начинающих PIC ASM
[uquote="abc",url="/forum/viewtopic.php?p=4596788#p4596788"][/uquote]
AND по маске это понятно, а вот первые две команды как приложить - ума не приложу.
Код: Выделить всё
rrf Rx,f
swapf Rx,w
andlw b'00000111'
movwf OPTIONAND по маске это понятно, а вот первые две команды как приложить - ума не приложу.
Re: Вопросы начинающих PIC ASM
Вопрос исходно совсем некорректно задан был!
Для такого простейшего определения или функция препроцессора (есть в ассемблерах у атмела для авр/mcs51) или программный табличный обработчик - у ПИКовых для такого есть RETLW (табличное преобразование)

Для такого простейшего определения или функция препроцессора (есть в ассемблерах у атмела для авр/mcs51) или программный табличный обработчик - у ПИКовых для такого есть RETLW (табличное преобразование)
Re: Вопросы начинающих PIC ASM
yor, Rx - это регистр, куда загружено исходное значение 001xxxxx
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)


