Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение shonty »

BOB51 писал(а):Может про мой ""слэнг" в работе с многофайловыми проектами" под ассемблером потрындеть?
Поддерживаю :beer:

Добавлено after 2 minutes 6 seconds:
BOB51 писал(а):мой ""слэнг"
главное, что бы в "слэнге" слов неприличных не было :))
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Так меня порой за "отступление от стандартных наименований" и матюкают.
8)
В общем то ...
Исходная проблема стандарта применения нескольких файлов вытекает из необходимости прописывать все файлы в запускающей командной строке компилятора... А мне то оченно вломуушки было...
Да и работа с "быстрым переходом" между тремя компиляторами - mcs51, PIC и AVR требовала использования максимально удобного обобщения для работы с исходниками для всех применяемых компиляторов. Вроде таки получилось относительно удобненько.
Для АВРок еще одно интересное замечание - "карта переназначения регистров регистрового банка" - собственно с теми регистрами можно выбрать модель, соответствующую раскладке и функционалу регистров других МК/МП (аналогия воде только у ПИК24 - но те я лишь очень бегло смотрел - могу и ошибиться).
Плюс карты- подсказки по системам команд, чтоб быстрее вспоминалось "недавно забытое" и на закусь конспекты по самим МК и системам команд.
:write:
Начну с той карты...
Собственно добавляю ее в каждый проект в разделе дефайнов (или позже отдельным файлом дефайнов*)
Спойлер

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

;________________________
;таблица объявленных имен - переназначение регистров РОН
;
;             принята базовая модель:
; область ограниченного функционала
; .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 и под ПИК чего другого самодельного "прировнять"...
А уж затем и применяемые алгоритмы легче переносить в другую систему команд.
Воть как то так для начала...
Если интересно - дальше продолжу...
:roll:
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ДядяВован »

BOB51 писал(а):Если интересно
Конечно интересно!

В своих проектах один из регистров "делаю нулевым" (для AVR)

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

.def    rZero           = R15   ; всегда ноль
Очень пригождается в математике, оперативного обнуления переменных в памяти (sts var, rZero), в команде CPSE.
Последний раз редактировалось ДядяВован Ср дек 11, 2024 15:55:24, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Там много интересного можно делать - к примеру "область быстрого стека" с использованием mov/movw...
Единственно аккуратно относиться к использованию R0-R1 и адресно - индексных R26-R31. Они могут в очень многих интересно-полезных случаях использоваться.
8)
Второй добавкой, является использование в заголовке главного файла описания конфигурационных бит применяемого МК как "по умолчанию", так и то, что в текущем проекте использоваться будет.
Эта "шапка" заимствована из практики ПИКов. Хоть практически фузы не меняет - такой приятности у avrasm2 нету, но позволяет заранее знать конфигурацию проекта (и сохранить в документации).
Минус - пришлось посидеть за даташитами на свой комплект "проработанных" МК...
К примеру "шапки" шаблонов главного файла проекта для тинек:
shaps_tn13prj.asm
(4.02 КБ) 106 скачиваний
shaps_tn2313prj.asm
(4.34 КБ) 98 скачиваний
и меги8515
shaps_m8515prj.asm
(3.33 КБ) 103 скачивания
Есть еще для нескольких МК, но те пока не проверялись в проектах.
8)
Ну и выкопировка *.inc файлов описания ресурсов из каталога
ДИСК:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes
это обычный минимум для любого варианта написания.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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)
Последний раз редактировалось akl Ср дек 11, 2024 15:10:34, всего редактировалось 2 раза.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Jack_A »

[uquote="ДядяВован",url="/forum/viewtopic.php?p=4659196#p4659196"]сравнении с нулем "младших" регистров (cp r2, rZero)[/uquote]
Для этого есть специальная команда TST Rn - хоть для младших, хоть для старших.
Изображение
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ДядяВован »

Jack_A писал(а):специальная команда TST Rn
Хорошо, этот вариант применения вычеркиваем!

Добавлено after 5 minutes 53 seconds:
akl писал(а):не только дефайнить, но и обнулять его
Это обязательное условие!!!.
Вставляю в начало кода макро: установка стека и обнуление регистров.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение shonty »

BOB51 писал(а):Есть еще для нескольких МК, но те пока не проверялись в проектах.
AT90S2313 ?

Уселся вчера изучать :facepalm: . Продавец давно вместо тиньки этих подсунул.. :))
Два проектика под них придумал.. Нужно распаять, да место освободить..))

Добавлено after 1 minute 40 seconds:
Да пойдут для мелочёвки, типа часы/кухонный_таймер и т.п.. :dont_know:


PS
сижу пока, медитирую :))

Изображение
Думаю, может стенд хороший замутить.. или ну его.. :facepalm: :))
Последний раз редактировалось shonty Ср дек 11, 2024 17:34:40, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Нет - ATtiny2313...
AT90S2313 это вроде из самых старых... Такой даже в "пробниках" не было.
Заготовки вот на эти (не факт, что без возможных ошибок - не проверял пока):
shaps_tnX5prj.txt
(4.99 КБ) 113 скачиваний
shaps_m8_8aprj.asm
(7.41 КБ) 99 скачиваний
shaps_m48_88_168prj.asm
(7.5 КБ) 87 скачиваний
shaps_m162prj.asm
(3.98 КБ) 75 скачиваний
Просто делалось только то, на что распечатка док и сами кристаллы имелись.
Собственно цель ассемблерных конструкций прикладная самодельная периферия.
:roll:
Далее уже было изменение самой структуры файлов проекта.
Для "слишком мелких" простых конечно и одного файла достаточно. А вот для более крупных используется та шапка и несколько дополнительных файликов:
собственно *.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 файл текстовых вставок (компилятор их так и воспринимает).
Сама папка проекта также разделена на несколько подразделов...
К примеру вот такой проектик (из старых):
tnX5_2812_mm.rar
(26.27 КБ) 97 скачиваний
Правда из него вся графика и дополнительная документация удалены (слишком велики) - просто для понимания как все стыкуется и обзывается.
Вобшчемссс... посмотрямс на интерес - может еще чего добавлю...
:tea:
Или выслушаю матюков со вниманием.
:wink:
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Starichok51 »

ДядяВован писал(а):В своих проектах один из регистров "делаю нулевым" (для AVR)
в проектах для АТмега8 я нулевым делаю ZH, так как все данные у меня лежат в начале ОЗУ (0x60 - 0xFF), когда ZH = 0. поэтому у меня нет необходимости выделять отдельный регистр для нуля.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ДядяВован »

Starichok51 писал(а):нулевым делаю ZH
Мудро!!!
Но в этом случае ИМХО лучше ограничить использование ОЗУ адресом (0xFF - 1), иначе может "что-то пойти не так" после команд RD Rx, Z+ / ST Z+, Rx.
Хотя, обычно в конце ОЗУ стек, поэтому способ безопасный.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение shonty »

Starichok51 писал(а):в проектах для АТмега8 я нулевым делаю ZH, так как все данные у меня лежат в начале ОЗУ
Это если не обращаться к данным во флэше или индексные переходы не использовать.

Нее.. Z по прямому назначению.
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ДядяВован »

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Нуль можно и в варианте константы определить.
Да и весь младший блок регистров с ограниченным функционалом за исключением R0-R1 вполне сгодиться.
Зачем полнофункциональные занимать?
8)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

А я бы советовал использовать распределение регистров полностью совпадающее с распределением GCC. Тогда меньше проблем, если вдруг приспичит поработать с ассемблерными модулями в Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Это хорошо, если используется модель АВР.
Но ведь возможно и иное переназначение регистров файла под наиболее удобную модель распределения регистров...
это все таки "чистый ассемблер".
К примеру тот же "быстрый стек" под отдельные подпрограммы в младшей части регистрового банка...
:roll:
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ДядяВован »

BOB51 писал(а):Зачем полнофункциональные занимать?
С этой точки зрения и выбрал R15.
Идея Старичка хороша тем, что при малом объеме ОЗУ ноль образуется "автоматически" (XH,YH,ZH) и вообще не нужно выделять отдельный регистр.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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
(по мотивам данного форума)
:))
Аватара пользователя
ДядяВован
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс окт 25, 2020 22:13:25
Откуда: Смоленск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ДядяВован »

Аналогично. Подобный (и тоже не мой) код добавляю при старте сразу после установки стека

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

    .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
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение shonty »

ДядяВован писал(а):Аналогично. Подобный
Точно.. :facepalm: "clr ZL" же тоже лишняя в конце
Ответить

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