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

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

Сообщение yor »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4598231#p4598231"]вчера ещё подумал, что речь похоже про какой-то "юпитер"...[/uquote]Почти угадал, Юпитер в планах, а вот мой насущный агрегат, последние снимки, и лодка это именно мои. На нём даже первый вариант процессорного зажигания, сбоку на открытой печатке))
https://motorka.org/motory/podvesnie_lo ... et-25.html

[uquote="Родэрик",url="/forum/viewtopic.php?p=4598231#p4598231"]Сколько цилиндров особо значения не имеет ... коленвал то один, и мы говорим о его оборотах ...[/uquote]
Ну можно говорить и о циклах зажигания, кои по пол-оборота. В кои я собираюсь уложиться.

[uquote="Родэрик",url="/forum/viewtopic.php?p=4598231#p4598231"]ты считаешь секундный интервал тиками по одной микросекунде ... до скольки досчитаешь, сколько в секунде микросекунд? -очевидно же что - миллион ... Миллион -это 24 бита[/uquote]
Зачем секундный интервал, я так и не понял. Если 65мс полупериода - это где-то 500 оборотов, а тем более ниже 1000 вычислять УОЗ не надо, он фиксированный около нуля.

Добавлено after 2 hours 8 minutes 26 seconds:
А mpasm, когда сыплет напоминаниями насчёт смены банков, может реально отслеживать необходимость их смены?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

mpasm внутри мплаба контролирует соответствие регистра текущему банку.
Да и по карте в документации на МК эта информация всегда представлена.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="yor",url="/forum/viewtopic.php?p=4598249#p4598249"]А mpasm, когда сыплет напоминаниями насчёт смены банков, может реально отслеживать необходимость их смены?[/uquote]
Если перед каждым обращением к ОЗУ и периферии ставить banksel, то варнинги пропадут.
Но их можно отключить радикально директивой errorlevel -302 в начале листинга.
Естественно. что варнинг это не ошибка. И mpasm не контролирует текущее значение RP0...RP1, поскольку он ничего не знает про рантайм. Он тупо генерирует варнинги, если НЕПОСРЕДСТВЕННО ПЕРЕД обращением нет директивы banksel.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

То есть в этом случае, пример из доки:

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

banksel Var1
movwf Var1
компилятор перед MOVWF сам проставит биты выбора нужного банка? Где объявлена Var1?
То есть просто знай напихивай её в сомнительных местах, эффект будет тот же, что и вручную ставить биты банков?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="yor",url="/forum/viewtopic.php?p=4598466#p4598466"]эффект будет тот же?[/uquote]
Да, патамушта директива banksel тупо генерирует одну или две строки (зависит от МК) с соответствующей аргументу директивы установкой банка.
Реклама
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Ну ведь может же? Как я понял, она смотрит, в каком банке переменная, и соответственно устанавливает биты выбора банка.

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

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

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

Сообщение BOB51 »

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

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4598483#p4598483"]нет никакой необходимости ставить banksel в цикле, например. Достаточно перед циклом. Так же нет никакой необходимости это делать там, где в коде нет смены банков. Например при работе с массивом, который весь расположен в одном банке. Так также нет смысла переключать банк для регистров расположенных в банк-независимой области. Ну и много когда еще.[/uquote]А компилятор об этом может знать?

А ещё лучше возложить это на автоматику, в век цифровых технологий. Конечно, оверхед, если лепить везде, а если с умом, то. Лишний проход компилятора, как минимум, я так понимаю. А может и без него. Однозначно ведь можно вычислить, где нужна смена банков?
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="yor",url="/forum/viewtopic.php?p=4598599#p4598599"]А компилятор об этом может знать?[/uquote]
Нет, не может. Потому что Ассемблер по сути компилятором в полном смысле не является.
Впрочем, и в Си невозможно анализировать рантайм.

Добавлено after 1 minute 57 seconds:
[uquote="yor",url="/forum/viewtopic.php?p=4598599#p4598599"]Однозначно ведь можно вычислить, где нужна смена банков?[/uquote]
Нет, невозможно. В общем случае. Потому что код при исполнении может ветвиться и совершенно непонятно где он окажется. Это зависит от условий возникающих из анализа данных в коде.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

То есть ассtмблер, видя, например, var1, не может понять, что это - или регистр в ОЗУ или вообще левая переменная? А по контексту:

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

movwf var1
incf var1,f

subwf var1
Разве непонятно?
Или портят дело усугубляющие случаи, непрямая адресация, индексное приращение или как там его?
Друг Кота
Аватара пользователя
Сообщения: 26018
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="yor",url="/forum/viewtopic.php?p=4598606#p4598606"]То есть ассtмблер, видя, например, var1, не может понять, что это - или регистр в ОЗУ или вообще левая переменная?[/uquote]
Вы вообще понимаете о чем я вам пишу? :facepalm:
Еще раз.
Нет никакого смысла в автоматическом добавлении banksel, ибо это тупой оверхед.
В подавляющем количестве случаев обращение к ОЗУ делается так, чтобы не нужно было переключать регистры. То есть работают с одним банком. А потом в другом месте кода один раз переключают и работают уже с другим. А разбирать код, предсказывая его работу, Ассемблер не умеет. Линейный код - это частный случай. Чаще всего код ветвится и необходимость banksel является условной.
И вообще, если вам хочется забыть про банки, пишите на С.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

[uquote="yor",url="/forum/viewtopic.php?p=4598606#p4598606"]То есть ассtмблер, видя, например, var1, не может понять[/uquote] а если ты например, видишь movlw 0x05 ... то что это? адрес, константа?
ассtмблер не должен что-то там "видеть", да ещё и домысливать/корректировать/добавлять, упаси его ... было бы довольно странно, если некая автоматика вмешивалась в это ... в том то и смысл асма - тупо заменять написанное (в простых к запоминанию нам словах) на соответствующие числовое представление.

Наверное как минимум в 90% случаях ответы на твои вопросы есть на одной из первых десяти страниц даташита. Я понимаю там, когда вопрос касается нюансов той или иной реализации, методов оптимизации, вариантов организации ... того что не отражено напрямую в документации, но тут то ... основы же.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

movlw 0x05
будет однозначно определяться как загрузка константы 0x05 в регистр w
Что дальше с теми данными будет делаться для этой операции безразлично.
Другое дело операции, где подразумевается загрузка регистра ОЗУ/РСФ - там значение проверяется согласно информации из служебных файлов в составе проекта (для мпасма в мплабе).
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

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

Сообщение yor »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4598723#p4598723"]тупо превратят в соответствующий опкод и поместят по соответствующему адресу, и всего то[/uquote]А могли бы проявить чуть побольше чуткости и предсказательности))

Добавлено after 1 hour 26 minutes 56 seconds:
Есть способ из W вычесть число, в частности единицу? В 648 decf W не работает. И даже регистр из W не вычесть, только наоборот. Вот так аккумулято...
От 8 цикл до нуля, чтобы лишний вспомогательный регистр не заводить.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

делай так:
addlw 0xFF
это незадокументированная специнструкция
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

При обработке мпасмом используется еще и линкер и два файла описания ресурсов *.inc и *_g.lkr - вот там все базовые параметры для вармингов и отработки ошибок искать надо (* - имя соответствующего МК).
Ежли по *.inc все достаточно понятно, то по*_g.lkr желательно у КРАМ данные поспрошать... Я ими только пользуюсь в том виде, что в IDE задан...
:roll:
Насчет вычитания и работ с W у стандартных среднемладших таки малость не так, как у других (то же касается и флага С при вычитании) - но ЭТО ПИКи...
:dont_know:
И никто не запрещает:
inc W -- addlw .1
dec w -- addlw 0xff
setb W.n -- iorlw 1<<n
clr W.n -- andlw 0xff-(0xff&(1<<n))
:wink:
Старая шпора для "быстрых воспоминаний":
шаблон_команд_PIC10_12_16.pdf
(648.72 КБ) 174 скачивания
:sleep:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Инкремент-то понятно, и биты, а вот вычитание - прямо магия!
addlw 0xff на флаг Z как надо подействует? То есть при нуле он 1? Ну и для общего развития, что с флагами С && DC? Через С вычитает?
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ответить

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