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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

[uquote="Леонид_М",url="/forum/viewtopic.php?p=3833016#p3833016"]макрос вставляется несколько раз в код и тем самым увеличивает объем подпрограммы[/uquote]
Если макрос из 1..2 команд, то замена его на подпрограмму не уменьшит размер кода. А время выполнения (если оно критично) увеличится: вызов п/п - выполнение функции - возврат в программу.
Изображение
Реклама
Модератор
Аватара пользователя
Сообщения: 19079
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Леонид_М писал(а):с макросом заработало, спасибо, но макрос вставляется несколько раз в код (сколько обращений)
и тем самым увеличивает объем подпрограммы
покажи созданный макрос.
в теле макроса должна быть всего одна строка.
и макрос вставит вместо строки
cbi PORTC,port_v
всего одну строку с номером конкретного бита, что вообще ни как не увеличит размер кода подпрограммы.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

А причём тут макрос. Макрос работает "здесь и сейчас", то есть параметры вводятся непосредственно. А Леонид(у)_М, судя по его коду, нужно передать параметр из одной подпрограммы в другую.
Грызет канифоль
Сообщения: 257
Зарегистрирован: Пн окт 03, 2016 10:06:09

Сообщение Леонид_М »

[uquote="shonty",url="/forum/viewtopic.php?p=3833029#p3833029"]ситуация позволяет не париться с другими битами порта или 2-7 биты настроены на вход с подтяжкой

Как то так...[/uquote]

я понял, спасибо, но тут я использую cbi, SBRC - т.к. пока не определился как остальные биты у меня будут использоваться, пока делаю только часть схемы...

[uquote="Starichok51",url="/forum/viewtopic.php?p=3833084#p3833084"]cbi PORTC,port_v
всего одну строку с номером конкретного бита, что вообще ни как не увеличит размер кода подпрограммы.[/uquote]
[uquote="shonty",url="/forum/viewtopic.php?p=3833096#p3833096"]А причём тут макрос. Макрос работает "здесь и сейчас", то есть параметры вводятся непосредственно. А Леонид(у)_М, судя по его коду, нужно передать параметр из одной подпрограммы в другую.[/uquote]

Я вызываю подпрограмму, которая обращается к нескольким подпрограммам, в которых уже идет изменение битов порта, при чем в одном случае нужно менять один разряд, в другом - другой.
Я все же решил отказаться от макроса, т.к. понял, что он мне тут не подойдет, потому я просто сделал так, что данные о бите кидаю в регистр, а непосредственно перед изменением смотрю какой надо обработать. Подпрограмма обращается еще к трем подпрограммам, в которых уже по несколько раз идет изменение или опрос определенного бита - нулевого или первого, всего этих мест в 3-х подпрограммах штук 15.

sss:
in temp,PINC
tst r25
brne no_04
SBRC temp,0
rjmp sss
rjmp sss1
no_04:
SBRC temp,1

rjmp sss


sss1:
.............
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15705
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

К примеру вот такой макрос:

.macro trep
ldi tmp1,~(1<<@0)
rcall pppp
.endm

pppp:
......
in tmp2,PORTC ; cbi PORTC,port_v
and tmp2,tmp1
out PORTC,tmp2
......
ret

и затем вызов:

trep 0

trep 1

можно было бы заявить именованные линии порта
.equ port_v0 = 0
.equ port_v1 = 1

и использовать в макросе конструкцию вида
cbi PORTC,@0
однако у нас единая подпрограмма обработки вне макроса
а параметры туда не передаются - обработка только в пределах макроса
перед вызовом подпрограммы.
Поэтому используем маску и РВХ для хранения параметров, полученных при
вызова макроса.
Если бы cbi PORTC,port_v стояло в начале (или в конце) подпрограммы
pppp
то вполне возможно и более удачное построение макроса:

pppp:
cbi PORTC,port_v
......
......
ret

или

pppp:
......
......
cbi PORTC,port_v
ret

.macro trep
cbi PORTC,@0
rcall pppp
.endm

или

.macro trep
rcall pppp
cbi PORTC,@0
.endm

В случае с ассемблером в отличии от ЯВУ функции компилятора
в отношении построения алгоритмов переходят к программисту.
:beer:
Реклама
Грызет канифоль
Сообщения: 257
Зарегистрирован: Пн окт 03, 2016 10:06:09

Сообщение Леонид_М »

[uquote="BOB51",url="/forum/viewtopic.php?p=3833244#p3833244"]Если бы cbi PORTC,port_v стояло в начале (или в конце) подпрограммы[/uquote]

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

Сообщение BOB51 »

Тогда меняем алгоритм, встраивая регистр с модифицируемой маской ("скользящая 1" к примеру).
Команда
cbi $P.b
не предусматривает динамической модификации составляющих.
И адрес порта назначения результата и номер модифицируемого бита жестко и однозначно задан.
Изменение любого параметра - это уже другая команда (другой код)
Значит надо искать решение, где в состав команды включена ячейка памяти или регистр.
А вот содержимое той ячейки - штука доступная для динамической модификации.
Потому одна и та же физическая команда (один и тот же код) может дать разные результаты в зависимости от содержимого ячейки.
8)
Правда придется принести в жертву один регистр (или ячейку ОЗУ).
:wink:
Грызет канифоль
Сообщения: 257
Зарегистрирован: Пн окт 03, 2016 10:06:09

Сообщение Леонид_М »

[uquote="BOB51",url="/forum/viewtopic.php?p=3833288#p3833288"]Правда придется принести в жертву один регистр (или ячейку ОЗУ).
:wink:[/uquote]

так я "пожертвовал" регистром )
задаю в нем, а потом в подпрограммах проверяю...
:beer:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1358
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

.device mega8
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
.list

;==
;объявления
.def temp=r16 ;колбасное изделие
.def counter=r17
.eseg
.db 0x05
.cseg
.equ DisplayPort=PORTB

enTa:
ldi counter,0b00110011
ldi temp,0x05
fmul temp,counter
out tccr0,temp
dec temp
inc counter
out 0x33,temp
ldi r18,0x01
bld r18,0x01
inc temp
lpm
ld r18,x
out DisplayPort,r0
add r0, temp
adiw r24,0x0a
rjmp enTa
:shock:
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15705
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А где инициализация Z, без которой LPM смысл теряет?
8)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1358
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

А как его инициализировать?

p.s. Понимаю, та программа лишена всякого смысла,просто собрал в кучу чужие готовые куски,немного от себя,и добился чтобы компилировалась без ошибок. А так,полный бред. Просто первые шаги...
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

главный колбасист писал(а):А так,полный бред. Просто первые шаги...
Я первые шаги делал так: брал чужой рабочий исходник и потихоньку менял в нём то то, то сё. Тут же смотрел на результат. Оно хоть осмысленней.

В результате с шага перешёл на бег. :)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1358
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

АгА, по вашему совету в мультисиме наменял чего то,на свою голову. Что перестала программка работать.Вывод бегущей строки на HT44780 . А так красиво буковки бегали. Хоть и виртуально,но как настоящие. :) И пока восстановить безуспешно. :(
Есть,конечно ,кардинальный способ,переустановить мультисим из архива, (сохранить изуродованную копию и сравнить потом) но не хочу.
Если найду косяк самостоятельно ,значит чему то научился.

з.ы. правда тема совсем не отсюда,извиняйте, PIC16F84 и Си ,но в мультисиме нет ,увы AVRок :cry:
Вложения
main.c
(3.5 КБ) 217 скачиваний
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

главный колбасист писал(а):АгА, по вашему совету в мультисиме наменял чего то,на свою голову.
Прочитал все свои сообщения за последние 30 лет на всех форумах, включая форумы знакомств, и не нашёл, где бы я упоминал мультисим или прочие трассировщики и виртуальщики.
Я проверяю исключительно на стендах и в железе. Есть свой определённый алгоритм поиска ошибок.
Прежде чем что-то менять, нужно знать для чего это нужно. Но если принципиально, то могу дать ссылку на форум, где я как раз что-то менял на первых шагах и что из этого вышло. Но это в лс.

Забейте в свой код тыщу раз "nop" и всё откомпилится на раз-два. Если целью стоит только чтобы компилятор принял. Но ни один светодиод при этом так и не зажжется.

Двигаться нужно к какойто цели, решать какую-то задачу, тогда и результат будет. А не просто бродить сам не зная куда.

Вот ответьте: зачем вам инициализация Z?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1358
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

[uquote="shonty",url="/forum/viewtopic.php?p=3848212#p3848212"]Прежде чем что-то менять, нужно знать для чего это нужно.[/uquote]
Разумеется это так.

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

Как же зачем инициализация ? Все надо знать. так и постигаем ,шаг за шагом. По быстрому хотел найти
в нете, ничего не попалось. :?
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Ну тогда lpm это загрузка байта с адреса програмной памяти, которая определена в Z (регистрах R30:R31) .

Опять же нужно знать какой байт с какого адреса вам нужен, и что вы хотите с ним сделать в последствии.
А просто так написать lpm (load programm memory кажется), это равно что написать nop. И ошибки нет и чЮдно время провели.
:)

PS: первое, на чём я споткнулся по незнанию, исправляя чужие коды это когда написал
adiw Z, 96
Знаний 0, но цель была.
Исправил на
adiw Z, 48
adiw Z, 48
Лаконично так :)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1358
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

.device mega8
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
.list

;==
;объявления
.def temp=r16 ;колбасное изделие
.def counter=r17
.eseg
.db 0x05
.cseg
.equ DisplayPort=PORTB

enTa:
ldi counter,0b00110011
ldi temp,0x05
fmul temp,counter
out tccr0,temp
dec temp
inc counter
out 0x33,temp
ldi r18,0x01
bld r18,0x01
inc temp
ldi r30,0x01
lpm
ld r18,x
out DisplayPort,r0
add r0, temp
adiw r24,0x0a
rjmp enTa

Этого достаточно ?
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

главный колбасист писал(а):Этого достаточно ?
Смотря для чего. Для того, что бы откомпилировалось, то вообще шедевр.
Правда и манипуляции с флагом T тоже не понятны...

Всё таки цель определяет направление.
А она у вас какая?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1358
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

Всё таки цель определяет направление.
А она у вас какая?
Цель,свалить отсюда.
навсегда...
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

главный колбасист, то что вы хотите научиться программировать и достичь определённой независимости - это очень хорошо.
Но процесс самообразования бывает двух типов:
Первый - с начала, с азов. Он более медленный, но основательный.
Второй - с конца. Более скоростной. Обращение к азам происходит в процессе, для решения возникающих затруднений и устранения пробелов в знаниях. Опять же, затруднения возникают при движении по определённому маршруту. При выбранном направлении.
Вы же сразу притянули конец к началу и оказались в глубокой... середине, потерявшись в направлениях. В такой ситуации даже затруднений для импульса к следующему движению возникнуть не может.
Здесь или в начало или в конец, третьего не дано.
Ответить

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