Страница 393 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт дек 10, 2024 16:58:58
shonty
BOB51 писал(а):Может про мой ""слэнг" в работе с многофайловыми проектами" под ассемблером потрындеть?
Поддерживаю
Добавлено after 2 minutes 6 seconds:
BOB51 писал(а):мой ""слэнг"
главное, что бы в "слэнге" слов неприличных не было

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 11:50:20
BOB51
Так меня порой за "отступление от стандартных наименований" и матюкают.
В общем то ...
Исходная проблема стандарта применения нескольких файлов вытекает из необходимости прописывать все файлы в запускающей командной строке компилятора... А мне то оченно вломуушки было...
Да и работа с "быстрым переходом" между тремя компиляторами - mcs51, PIC и AVR требовала использования максимально удобного обобщения для работы с исходниками для всех применяемых компиляторов. Вроде таки получилось относительно удобненько.
Для АВРок еще одно интересное замечание - "карта переназначения регистров регистрового банка" - собственно с теми регистрами можно выбрать модель, соответствующую раскладке и функционалу регистров других МК/МП (аналогия воде только у ПИК24 - но те я лишь очень бегло смотрел - могу и ошибиться).
Плюс карты- подсказки по системам команд, чтоб быстрее вспоминалось "недавно забытое" и на закусь конспекты по самим МК и системам команд.
Начну с той карты...
Собственно добавляю ее в каждый проект в разделе дефайнов (или позже отдельным файлом дефайнов*)
Спойлер
Код: Выделить всё
;________________________
;таблица объявленных имен - переназначение регистров РОН
;
; принята базовая модель:
; область ограниченного функционала
; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def = r2 ;(ограниченный функционал)
; .def = r3 ;(ограниченный функционал)
; .def = r4 ;(ограниченный функционал)
; .def = r5 ;(ограниченный функционал)
; .def = r6 ;(ограниченный функционал)
; .def = r7 ;(ограниченный функционал)
; .def = r8 ;(ограниченный функционал)
; .def = r9 ;(ограниченный функционал)
; .def = r10 ;(ограниченный функционал)
; .def = r11 ;(ограниченный функционал)
; .def = r12 ;(ограниченный функционал)
; .def = r13 ;(ограниченный функционал)
; .def = r14 ;(ограниченный функционал)
; .def = r15 ;(ограниченный функционал)
; область полного функционала
.def tmp0 = r16 ; рабочий регистр (полный функционал)
.def tmp1 = r17 ; рабочий регистр (полный функционал)
; .def = r18 ;(полный функционал)
; .def = r19 ;(полный функционал)
; .def = r20 ;(полный функционал)
; .def = r21 ;(полный функционал)
; .def = r22 ;(полный функционал)
; .def = r23 ;(полный функционал)
; .def = r24 ;("указатель базы" полный функционал)
; .def = r25 ;("указатель базы" полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ
; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового
; файла одновременно (без "подкачки" наборов параметров через ОЗУ)
; рекомендовано переназначение индивидуальных имен регистров
; согласно текущей задачи
;
собственно регистру присваиваем условное имя для последующего использования в проекте уже по тому имени.
Даже для тиньки 13 можно переделить так, как удобнее (с учетом особенности работы каждой группы регистров в системе команд АВР) для прикладного проекта.
Можно модель распределения регистров и под 51ю и под 580 и под Z80 и под ПИК чего другого самодельного "прировнять"...
А уж затем и применяемые алгоритмы легче переносить в другую систему команд.
Воть как то так для начала...
Если интересно - дальше продолжу...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 12:32:01
ДядяВован
BOB51 писал(а):Если интересно
Конечно интересно!
В своих проектах один из регистров "делаю нулевым" (для AVR)
Очень пригождается в математике, оперативного обнуления переменных в памяти (sts var, rZero), в команде CPSE.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 13:15:14
BOB51
Там много интересного можно делать - к примеру "область быстрого стека" с использованием mov/movw...
Единственно аккуратно относиться к использованию R0-R1 и адресно - индексных R26-R31. Они могут в очень многих интересно-полезных случаях использоваться.
Второй добавкой, является использование в заголовке главного файла описания конфигурационных бит применяемого МК как "по умолчанию", так и то, что в текущем проекте использоваться будет.
Эта "шапка" заимствована из практики ПИКов. Хоть практически фузы не меняет - такой приятности у avrasm2 нету, но позволяет заранее знать конфигурацию проекта (и сохранить в документации).
Минус - пришлось посидеть за даташитами на свой комплект "проработанных" МК...
К примеру "шапки" шаблонов главного файла проекта для тинек:
и меги8515
Есть еще для нескольких МК, но те пока не проверялись в проектах.
Ну и выкопировка *.inc файлов описания ресурсов из каталога
ДИСК:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes
это обычный минимум для любого варианта написания.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 14:50:19
akl
[uquote="ДядяВован",url="/forum/viewtopic.php?p=4659196#p4659196"]...Очень пригождается в математике, сравнении с нулем "младших" регистров (cp r2, rZero), оперативного обнуления переменных в памяти (sts var, rZero), в команде CPSE.[/uquote]Тоже использую R15=0, главное не только дефайнить, но и обнулять его

Для сравнения с 0 и определения знака использую команду TST.
Нравится команда сравнения слова с нулем ADIW RL,0 (RL может R24, XL,Y,L,ZL)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 14:54:40
Jack_A
[uquote="ДядяВован",url="/forum/viewtopic.php?p=4659196#p4659196"]сравнении с нулем "младших" регистров (cp r2, rZero)[/uquote]
Для этого есть специальная команда TST Rn - хоть для младших, хоть для старших.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 16:00:41
ДядяВован
Jack_A писал(а):специальная команда TST Rn
Хорошо, этот вариант применения вычеркиваем!
Добавлено after 5 minutes 53 seconds:
akl писал(а):не только дефайнить, но и обнулять его
Это обязательное условие!!!.
Вставляю в начало кода макро: установка стека и обнуление регистров.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 16:05:45
shonty
BOB51 писал(а):Есть еще для нескольких МК, но те пока не проверялись в проектах.
AT90S2313 ?
Уселся вчера изучать

. Продавец давно вместо тиньки этих подсунул..
Два проектика под них придумал.. Нужно распаять, да место освободить..))
Добавлено after 1 minute 40 seconds:
Да пойдут для мелочёвки, типа часы/кухонный_таймер и т.п..
PS
сижу пока, медитирую

Думаю, может стенд хороший замутить.. или ну его..

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср дек 11, 2024 17:15:44
BOB51
Нет - ATtiny2313...
AT90S2313 это вроде из самых старых... Такой даже в "пробниках" не было.
Заготовки вот на эти (не факт, что без возможных ошибок - не проверял пока):
Просто делалось только то, на что распечатка док и сами кристаллы имелись.
Собственно цель ассемблерных конструкций прикладная самодельная периферия.
Далее уже было изменение самой структуры файлов проекта.
Для "слишком мелких" простых конечно и одного файла достаточно. А вот для более крупных используется та шапка и несколько дополнительных файликов:
собственно *.inc из комплекта компилятора (иногда и его корректировать приходится, но крайне осторожно) ;
файл распределения ресурсов mdf_avr.txt (включает и карту регистров и карту разметки ОЗУ и чего там еще ...);
Спойлер
Код: Выделить всё
;
; "mdf_avr.txt" файл объявленных имен, бит и констант
; (шаблон основного файла определений проекта)
;
;------------------------------------------------------
; variable definitions
;(таблица обьявленных имен)
;
; определение метки многофайлового проекта
; ставится только в основном файле определений проекта
#ifndef disposit
#define disposit
#endif
;
;
;________________________
;таблица обьявленных имен - пользовательские константы
;
; .equ name/label = const / expr
; define datas
;________________________
; блок определений
;
;таблица обьявленных имен - переназначение регистров РОН
;
;
; принята базовая модель:
; область ограниченного функционала
; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def s_sreg = r2 ; зеркало SREG(ограниченный функционал)
; .def sys_flag = r3 ; системные флаги(ограниченный функционал)
; .def = r4 ; (ограниченный функционал)
; .def = r5 ; (ограниченный функционал)
; .def = r6 ; (ограниченный функционал)
; .def = r7 ; (ограниченный функционал)
;
; .def = r8 ; (ограниченный функционал)
; .def = r9 ; (ограниченный функционал)
; .def = r10 ; (ограниченный функционал)
; .def = r11 ; (ограниченный функционал)
; .def = r12 ;(ограниченный функционал)
; .def = r13 ;(ограниченный функционал)
; .def = r14 ;(ограниченный функционал)
; .def = r15 ;(ограниченный функционал)
;
; область полного функционала
.def tmp0 = r16 ; рабочий регистр(полный функционал)
.def tmp1 = r17 ; рабочий регистр(полный функционал)
.def tmp2 = r18 ; рабочий регистр(полный функционал)
.def tmp3 = r19 ; рабочий регистр(полный функционал)
.def tmp4 = r20 ; рабочий регистр(полный функционал)
.def tmp5 = r21 ; рабочий регистр(полный функционал)
.def tmp6 = r22 ; рабочий регистр(полный функционал)
.def tmp7 = r23 ; рабочий регистр полный функционал)
;
.def Bl = r24 ; "указатель базы"(полный функционал)
.def Bh = r25 ; "указатель базы"(полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ
; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового
; файла одновременно (без "подкачки" наборов параметров через ОЗУ)
; рекомендовано переназначение индивидуальных имен регистров
; согласно текущей задачи
;
;________________________
;таблица обьявленных имен - секция флагов пользователя
;
; .equ name/label = expr
;
; флаги в регистре flags
;________________________
;таблица обьявленных имен - секция определенных данных (ОЗУ)
;
.dseg
.org SRAM_START
;
; label: .byte expr
;________________________
;таблица обьявленных имен - секция определенных данных (EEPROM)
;
.eseg
; label: .byte expr
;________________________
файл макросов macros_proto.txt (или как-то иначе называть можно)...
Спойлер
Код: Выделить всё
;
; "macross__proto.txt" ; файл описания макросов (шаблон)
;
.macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром"
eor @0,@1 ; вызывается как xchrr rd,rs
eor @1,@0
eor @0,@1
.endmacro
;
.macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/"
ldi @0l,low(@1) ; вызывается как ldiw rp,0xnnnn или ldiw rp,name
ldi @0h,high(@1) ; (где name=0xnnnn, rp=x,y,z)
.endmacro
;
Далее собственно файлы программ подключаются - тоже с расширением*.txt
Для расширения используются именно *.txt, а не *.inc, *.asm или *.s - чтоб компилятор их не путал и не матюкался.
Собственно идет подстановка в *.asm файл текстовых вставок (компилятор их так и воспринимает).
Сама папка проекта также разделена на несколько подразделов...
К примеру вот такой проектик (из старых):
Правда из него вся графика и дополнительная документация удалены (слишком велики) - просто для понимания как все стыкуется и обзывается.
Вобшчемссс... посмотрямс на интерес - может еще чего добавлю...

Или выслушаю матюков со вниманием.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 08:40:54
Starichok51
ДядяВован писал(а):В своих проектах один из регистров "делаю нулевым" (для AVR)
в проектах для АТмега8 я нулевым делаю ZH, так как все данные у меня лежат в начале ОЗУ (0x60 - 0xFF), когда ZH = 0. поэтому у меня нет необходимости выделять отдельный регистр для нуля.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 10:38:33
ДядяВован
Starichok51 писал(а):нулевым делаю ZH
Мудр
о!!!
Но в этом случае ИМХО лучше ограничить использование ОЗУ адресом (0xFF - 1), иначе может "что-то пойти не так" после команд RD Rx, Z+ / ST Z+, Rx.
Хотя, обычно в конце ОЗУ стек, поэтому способ безопасный.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 10:55:18
shonty
Starichok51 писал(а):в проектах для АТмега8 я нулевым делаю ZH, так как все данные у меня лежат в начале ОЗУ
Это если не обращаться к данным во флэше или индексные переходы не использовать.
Нее.. Z по прямому назначению.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 11:09:32
ДядяВован
Ценное замечание!
Для большей свободы действий нулевым лучше оставить XH или YH
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 11:20:37
BOB51
Нуль можно и в варианте константы определить.
Да и весь младший блок регистров с ограниченным функционалом за исключением R0-R1 вполне сгодиться.
Зачем полнофункциональные занимать?

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 13:40:33
ARV
А я бы советовал использовать распределение регистров полностью совпадающее с распределением GCC. Тогда меньше проблем, если вдруг приспичит поработать с ассемблерными модулями в Си.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 14:11:21
BOB51
Это хорошо, если используется модель АВР.
Но ведь возможно и иное переназначение регистров файла под наиболее удобную модель распределения регистров...
это все таки "чистый ассемблер".
К примеру тот же "быстрый стек" под отдельные подпрограммы в младшей части регистрового банка...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 15:28:35
ДядяВован
BOB51 писал(а):Зачем полнофункциональные занимать?
С этой точки зрения и выбрал R15.
Идея Старичка хороша тем, что при малом объеме ОЗУ ноль образуется "автоматически" (XH,YH,ZH) и вообще не нужно выделять отдельный регистр.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 15:51:00
shonty
По ресет, после инициализации стёка:
Код: Выделить всё
; Очистка регистров R0-R31
ldi ZL, (0x1F-2) ; Адрес регистра R29
clr ZH
st Z, ZH
dec ZL
brne PC-2
clr ZL
clr ZH
все регистры в ноль
(код не мой)
Добавлено after 2 minutes 20 seconds:
последняя строка "clr ZH" походу лишняя даже..
Добавлено after 2 minutes 27 seconds:
Да, лишняя
Добавлено after 5 minutes 12 seconds:
Тогда законченная композиция:
Код: Выделить всё
; Очистка регистров R0-R31
ldi ZL, (0x1F-2) ; Адрес регистра R29
clr ZH
st Z, ZH
dec ZL
brne PC-2
clr ZL
; ------------------------------------
; Выключить аналоговый компаратор
ldi R16, (1<<ACD)
out ACSR, R16
(по мотивам данного форума)

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 15:57:52
ДядяВован
Аналогично. Подобный (и тоже не мой) код добавляю при старте сразу после установки стека
Код: Выделить всё
.ifdef SPH
LDI R16, High ( RAMEND )
OUT SPH, R16
.endif
LDI R16, Low ( RAMEND )
OUT SPL, R16
; очистка регистров
LDI ZL, 30
CLR ZH
DEC ZL
ST Z, ZH
BRNE PC - 2
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт дек 12, 2024 16:08:54
shonty
ДядяВован писал(а):Аналогично. Подобный
Точно..

"clr ZL" же тоже лишняя в конце