Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн ноя 05, 2018 08:54:45

На то и стек - следить за содержимым надо в обязательном порядке.
А пересылку РСФ-регистр-память ОЗУ надо потом также и назад делать.
Что касательно SREG штука весьма избыточная (ибо надо также и указатель адреса хранить - то ли в явном виде как содержимое регистровой пары, то-ли в неявном в составе соответствующих команд).
Подбирается решение под конкретную программу с учетом всех за и против.
8)

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

Вт ноя 06, 2018 03:45:27

BOB51
Из выше изложенного, я мало чего понял (можно сказать вообще ничего)
1) "Сброс в ОЗУ для SREG это единственно возможный вариант "быстрого сохранения" (то ли командой IN/OUT, то ли через "отображение РСФ на память")" - РСФ это - регистр состояния флагов? != SREG?, и как понять "отображение РСФ на память"?
2) "Посему лучше создать область "теневого стека", которая при необходимости дублируется в штатном стеке" - что такое "теневой стек" - как он реализован?, еще и в штатном стеке?
3) "В тот "теневой стек" можно и иные регистры копипастить, а не только SREG - на то есть две вкусняшки - MOV r,r и MOW r,r" ("MOW r,r" -возможно очепятка?, имелось ввиду "MOVW r,r"?) - если "теневой стек" находится в SRAM-е (ОЗУ) - то каким боком "вкусняшки - mov(w) r,r" - это-же AVR - ?

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

Вт ноя 06, 2018 12:49:45

РСФ - регистры специальных функций (порты, управление и прочие начиная с адреса 0x20 и до первых ячеек ОЗУ данных).
Они же (область РСФ) доступны также и как пространство ввода-вывода командами in и out.
К регистру управления можно обратится или как к УВВ (командами in и out) или как к области памяти командами работы с памятью LD/ST , но тогда к имени регистра добавляем 0x20 к примеру
in r16,portb = lds r16,(portb+0x20) /исправил :oops:
Как область памяти ОЗУ могут также адресоваться и регистры регистрового банка R0-R31.
Помимо того для регистров R0-R31 предусмотрены специальные скоростные пересылки регистр-регистр (mov r,r) и регистровая пара-регистровая пара (movw rp,rp), что весьма удобно при скоростном копировании блоков рабочих регистров.
Такой вариант - скоростное хранение выборочного количества данных и называется "теневым стеком" - правда само название позаимствовано у ПИКов - там это аппаратный модуль, работающий по прерываниям, но сам принцип ускоренного сохранения критических данных применим и в программной реализации для любого МК.
как пример...
в программе прерывания нужно сменить значение регистров-указателей, а затем восстановить.
Можно и через обычный стек, а можно и по иному (если есть запас "пустующих" регистров в младшей области регистрового файла)
movw r14,zl
movw r12,yl
movw r10,xl
собственно тело подпрограмы
movw xl,r10
movw yl,r12
movw zl,r14
ну и подобные операции в зависимости от расперделения ресурсов программы.
:roll:
Последний раз редактировалось BOB51 Ср ноя 07, 2018 11:47:04, всего редактировалось 1 раз.

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

Ср ноя 07, 2018 10:25:37

РСФ - регистры специальных функций (порты, управление и прочие начиная с адреса 0x20 и до первых ячеек ОЗУ данных).
Они же (область РСФ) доступны также и как пространство ввода-вывода командами in и out.
К регистру управления можно обратится или как к УВВ (командами in и out) или как к области памяти командами работы с памятью LD/ST , но тогда к имени регистра добавляем 0x20 к примеру
in r16,portb = ld r16,(portb+0x20)

Для команд IN OUT доступны адреса 0...0x3F. Адресное пространство ОЗУ у младшеньких AVR 0x60 или 0x100(0x200), которые постарше
Код:
   LDS r16,(portb+0x20)
;   LD r16,(portb+0x20)   ;это ошибка

   LDI   YH,HIGH(PORTB+0x20)
   LDI   YL,LOW(PORTB+0x20)

   LDI   R20,$55   ; к примеру
   ST Y,R20      ;R20 -> portb

   LDI   YH,HIGH(PINB+0x20)
   LDI   YL,LOW(PINB+0x20)

   LD   R0,Y   ;
   STS   RAMEND-32,R0

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

Ср дек 12, 2018 11:40:13

Всем добрый день, ребят подскажите новичку.. пытаюсь привязать ресурс МК к слову, но при компилировании выбивает сообщение -
Код:
Warning   1   Register r26 already defined by the .DEF directive   

Я понимаю что ошибка гласит о том что регистр уже используется в m8def.inc
А именно тут -
Код:
.def   XH   = r27
.def   XL   = r26
.def   YH   = r29
.def   YL   = r28
.def   ZH   = r31
.def   ZL   = r30


Я же просто пытаюсь подвязаться к ресурсам, т.е. вот -
Код:
.def Timer = r27
.def TimeoutPassive = r28
.def TimeoutActive = r29
.def temp = r30
.def BounceCounter = r31


Что я делаю не так?

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

Ср дек 12, 2018 13:10:37

Можно закоментировать в m8def.inc, а можно применить директиву .undef, но всё это не позволит пользоваться регистрами с XH по ZL.
Корректней использовать для своих целей другие регистры.

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

Ср дек 12, 2018 14:07:37

Это не ошибка, а предупреждение. Ничего страшного, определяйте как Вам нравится, но пользоваться командами ADIW, SBIW, LD(D), ST(D) ... будет нельзя.

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

Ср дек 12, 2018 14:46:13

А если так?
.def Timer = XH

Добавлено after 3 minutes 55 seconds:
Это не ошибка, а предупреждение.
Это предупреждение с точки зрения синтаксиса, но ошибка с точки зрения программирвания. ИМХО, варнинги нельзя игнорировать, я так когда-то делал и зря :).

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

Ср дек 12, 2018 18:49:15

Не получится...
Для регистров только через undef...
:(
Другое дело, ежли регистр как ячейка памяти....
Однако проверять надо, и это несколько иной тип обращения, нежли к регистру должен будет применяться.
:roll:

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

Ср дек 12, 2018 21:21:12

Что-то тут не так. 9RIK то не выложил код где он r26 переопределяет и я предположу, что он наверное перепутал местами левый и правый операнды директивы.

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

Ср дек 12, 2018 21:52:40

давненько я ассемблером не маялся... но по-моему тут поможет директива .equ

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

Ср дек 12, 2018 22:06:22

Не проходит.
8)
Это ж не ячейка памяти, а регистр.
У них несколько иной смысл для дефайна.
Более оптимально заранее подготовить модель регистров и дальше в проекте уже ею руководствоваться.
С присвонеием имен ячейкам ОЗУ значительно проще. Хотя и там могут иметься неприятности.
:roll:

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

Ср дек 12, 2018 23:32:40

Да делов-то... игнорируй это предупреждение. Всё будет хорошо, если ты не пользуешься регистрами X,Y,Z ведь ты можешь ненароком попортить указатели если они где-то используются глобально обращаясь к своим переменным... Лучше, конечно, этого не делать.
Можно убрать или сделать .undef для этих регистров, чтобы не ругалось, но тогда НЕЛЬЗЯ БУДЕТ обращаться к индексным регистрам - вы попортите свои переменные. Если у вас в программе не задействованы индексные регистры глобально - можно убрать соответствующие определения, а если используется временно и только по месту, то перед использованием обязательно сделать PUSH для пары регистров, а по окончанию POP чтобы не портить свои переменные.

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

Чт дек 13, 2018 05:14:36

...по-моему тут поможет директива .equ
Вполне возможно именно это и было нужно
Код:
.equ   CONST=16
.equ   Timer=RAMEND-CONST

   LDI   XH,HIGH(Timer)
   LDI   XL,LOW(Timer)

   LD   R0,X
Z_h_e писал(а):...ошибка с точки зрения программирвания. ИМХО, варнинги нельзя игнорировать, я так когда-то делал и зря
К варнингам отношусь очень серьёзно. Регистрам новые бессмысленные имена типа
Код:
.def temp=r30
не даю. Смысловые да. Типа
Код:
.def   _FF=R14
.def   ZERO=R15

   CLR   _FF
   COM   _FF      ;всегда -1
   CLR   ZERO   ;всегда 0

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

Чт дек 13, 2018 06:53:20

пытаюсь привязать ресурс...

AVR Assembler Preprocessor: #define
https://www.microchip.com/webdoc/avrass ... efine.html
Изображение

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

Чт дек 13, 2018 11:19:34

Млин...
Там же без знака равенства...
:oops:
Воть что отсутствие непрерывной практики делаеть..
:(
Последний раз редактировалось BOB51 Чт дек 13, 2018 18:55:13, всего редактировалось 1 раз.

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

Чт дек 13, 2018 13:46:32

Вот это да, не ожидал такого большого количества откликнувшихся, большое вам всем спасибоо) может кто то еще в протеусе смыслит?) отпшитесь в лс)

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

Вт дек 18, 2018 13:07:07

Привет знатокам ассемблера.
Нигде не нашел, но может все таки что и пропустил: нужна директива препроцессора позволяющая вставить в программу группу строк n раз.
Сейчас необходимо для разработки шаблона программ быстрого умножения/деления больших чисел. Проблема там в том, что при организации циклом очень большие накладные расходы на сохранение флага C (он используется в многобайтных ADC, SBC, CPC, ROL/ROR и т.д., но при этом портится в DEC), поэтому перед DEC его нужно куда то сохранять, а после - восстанавливать.
Поэтому пришел к мысли развернуть циклы - и время сэкономлю и от геморроя избавлюсь. Но затруднился с автоматизацией разворачивания (пока сделал 8 операций умножения для вариантов {1-8} байт на оператор), хочется написать что нибудь вроде

.macro zzz
LD R1,X
ROL R1
ST X+,R1
.endm

.cycle zzz(5)


чтобы сгенерить сдвиг для пяти байт.
Кто нибудь может подсказать: возможно ли такое?
Спасибо.

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

Вт дек 18, 2018 13:47:02

средствами avr-assembler из "студии" от Atmel такое невозможно.
а вот средствами GNU AS - легко, вот небольшая моя статья об этом: https://simple-devices.ru/articles/7-so ... ler-reviev (правда, по ссылке поменялся движок сайта и врезки кода стали уродскими... я не виноват)
работать с этим ассемблером посложнее будет, чем со "студийным"

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

Вт дек 18, 2018 13:54:30

Угу, спасибо.
Вдогонку:
WinAVR это интегрированная среда разработки со своими отладчиком, симуляторами и т.д.?
Или после препроцессинга результат грузится в студию и допиливается там? Просто никогда дела с ним не имел.
Ответить