Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Леонид_М",url="/forum/viewtopic.php?p=3833016#p3833016"]макрос вставляется несколько раз в код и тем самым увеличивает объем подпрограммы[/uquote]
Если макрос из 1..2 команд, то замена его на подпрограмму не уменьшит размер кода. А время выполнения (если оно критично) увеличится: вызов п/п - выполнение функции - возврат в программу.
Если макрос из 1..2 команд, то замена его на подпрограмму не уменьшит размер кода. А время выполнения (если оно критично) увеличится: вызов п/п - выполнение функции - возврат в программу.
- Реклама
- Starichok51
- Модератор
- Сообщения: 19055
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
покажи созданный макрос.Леонид_М писал(а):с макросом заработало, спасибо, но макрос вставляется несколько раз в код (сколько обращений)
и тем самым увеличивает объем подпрограммы
в теле макроса должна быть всего одна строка.
и макрос вставит вместо строки
cbi PORTC,port_v
всего одну строку с номером конкретного бита, что вообще ни как не увеличит размер кода подпрограммы.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А причём тут макрос. Макрос работает "здесь и сейчас", то есть параметры вводятся непосредственно. А Леонид(у)_М, судя по его коду, нужно передать параметр из одной подпрограммы в другую.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[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:
.............
Как то так...[/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:
.............
Re: Ассемблер (ASM) для AVR в вопросах и ответах
К примеру вот такой макрос:
.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
В случае с ассемблером в отличии от ЯВУ функции компилятора
в отношении построения алгоритмов переходят к программисту.

.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
В случае с ассемблером в отличии от ЯВУ функции компилятора
в отношении построения алгоритмов переходят к программисту.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="BOB51",url="/forum/viewtopic.php?p=3833244#p3833244"]Если бы cbi PORTC,port_v стояло в начале (или в конце) подпрограммы[/uquote]
так у меня эти обращения (и установка, и чтение) происходят не а вызываемой подпрограмме, а в
подпрограммах ,которые вызывает эта подпрограмма.
так у меня эти обращения (и установка, и чтение) происходят не а вызываемой подпрограмме, а в
подпрограммах ,которые вызывает эта подпрограмма.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тогда меняем алгоритм, встраивая регистр с модифицируемой маской ("скользящая 1" к примеру).
Команда
cbi $P.b
не предусматривает динамической модификации составляющих.
И адрес порта назначения результата и номер модифицируемого бита жестко и однозначно задан.
Изменение любого параметра - это уже другая команда (другой код)
Значит надо искать решение, где в состав команды включена ячейка памяти или регистр.
А вот содержимое той ячейки - штука доступная для динамической модификации.
Потому одна и та же физическая команда (один и тот же код) может дать разные результаты в зависимости от содержимого ячейки.

Правда придется принести в жертву один регистр (или ячейку ОЗУ).

Команда
cbi $P.b
не предусматривает динамической модификации составляющих.
И адрес порта назначения результата и номер модифицируемого бита жестко и однозначно задан.
Изменение любого параметра - это уже другая команда (другой код)
Значит надо искать решение, где в состав команды включена ячейка памяти или регистр.
А вот содержимое той ячейки - штука доступная для динамической модификации.
Потому одна и та же физическая команда (один и тот же код) может дать разные результаты в зависимости от содержимого ячейки.
Правда придется принести в жертву один регистр (или ячейку ОЗУ).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="BOB51",url="/forum/viewtopic.php?p=3833288#p3833288"]Правда придется принести в жертву один регистр (или ячейку ОЗУ).
[/uquote]
так я "пожертвовал" регистром )
задаю в нем, а потом в подпрограммах проверяю...

так я "пожертвовал" регистром )
задаю в нем, а потом в подпрограммах проверяю...
- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1338
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.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

.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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А где инициализация Z, без которой LPM смысл теряет?

- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1338
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А как его инициализировать?
p.s. Понимаю, та программа лишена всякого смысла,просто собрал в кучу чужие готовые куски,немного от себя,и добился чтобы компилировалась без ошибок. А так,полный бред. Просто первые шаги...
p.s. Понимаю, та программа лишена всякого смысла,просто собрал в кучу чужие готовые куски,немного от себя,и добился чтобы компилировалась без ошибок. А так,полный бред. Просто первые шаги...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я первые шаги делал так: брал чужой рабочий исходник и потихоньку менял в нём то то, то сё. Тут же смотрел на результат. Оно хоть осмысленней.главный колбасист писал(а):А так,полный бред. Просто первые шаги...
В результате с шага перешёл на бег.
- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1338
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
АгА, по вашему совету в мультисиме наменял чего то,на свою голову. Что перестала программка работать.Вывод бегущей строки на HT44780 . А так красиво буковки бегали. Хоть и виртуально,но как настоящие.
И пока восстановить безуспешно.
Есть,конечно ,кардинальный способ,переустановить мультисим из архива, (сохранить изуродованную копию и сравнить потом) но не хочу.
Если найду косяк самостоятельно ,значит чему то научился.
з.ы. правда тема совсем не отсюда,извиняйте, PIC16F84 и Си ,но в мультисиме нет ,увы AVRок
Есть,конечно ,кардинальный способ,переустановить мультисим из архива, (сохранить изуродованную копию и сравнить потом) но не хочу.
Если найду косяк самостоятельно ,значит чему то научился.
з.ы. правда тема совсем не отсюда,извиняйте, PIC16F84 и Си ,но в мультисиме нет ,увы AVRок
- Вложения
-
- main.c
- (3.5 КБ) 217 скачиваний
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Прочитал все свои сообщения за последние 30 лет на всех форумах, включая форумы знакомств, и не нашёл, где бы я упоминал мультисим или прочие трассировщики и виртуальщики.главный колбасист писал(а):АгА, по вашему совету в мультисиме наменял чего то,на свою голову.
Я проверяю исключительно на стендах и в железе. Есть свой определённый алгоритм поиска ошибок.
Прежде чем что-то менять, нужно знать для чего это нужно. Но если принципиально, то могу дать ссылку на форум, где я как раз что-то менял на первых шагах и что из этого вышло. Но это в лс.
Забейте в свой код тыщу раз "nop" и всё откомпилится на раз-два. Если целью стоит только чтобы компилятор принял. Но ни один светодиод при этом так и не зажжется.
Двигаться нужно к какойто цели, решать какую-то задачу, тогда и результат будет. А не просто бродить сам не зная куда.
Вот ответьте: зачем вам инициализация Z?
- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1338
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="shonty",url="/forum/viewtopic.php?p=3848212#p3848212"]Прежде чем что-то менять, нужно знать для чего это нужно.[/uquote]
Разумеется это так.
Мультисим это моя идея была. Я никого не обвиняю. А что,удобно. железо,железом,а это тоже хорошая вещь.мультисим и прочие протеусы.
Как же зачем инициализация ? Все надо знать. так и постигаем ,шаг за шагом. По быстрому хотел найти
в нете, ничего не попалось.
Разумеется это так.
Мультисим это моя идея была. Я никого не обвиняю. А что,удобно. железо,железом,а это тоже хорошая вещь.мультисим и прочие протеусы.
Как же зачем инициализация ? Все надо знать. так и постигаем ,шаг за шагом. По быстрому хотел найти
в нете, ничего не попалось.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну тогда lpm это загрузка байта с адреса програмной памяти, которая определена в Z (регистрах R30:R31) .
Опять же нужно знать какой байт с какого адреса вам нужен, и что вы хотите с ним сделать в последствии.
А просто так написать lpm (load programm memory кажется), это равно что написать nop. И ошибки нет и чЮдно время провели.

PS: первое, на чём я споткнулся по незнанию, исправляя чужие коды это когда написал
adiw Z, 96
Знаний 0, но цель была.
Исправил на
adiw Z, 48
adiw Z, 48
Лаконично так
Опять же нужно знать какой байт с какого адреса вам нужен, и что вы хотите с ним сделать в последствии.
А просто так написать lpm (load programm memory кажется), это равно что написать nop. И ошибки нет и чЮдно время провели.
PS: первое, на чём я споткнулся по незнанию, исправляя чужие коды это когда написал
adiw Z, 96
Знаний 0, но цель была.
Исправил на
adiw Z, 48
adiw Z, 48
Лаконично так
- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1338
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.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
Этого достаточно ?
.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
Этого достаточно ?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Смотря для чего. Для того, что бы откомпилировалось, то вообще шедевр.главный колбасист писал(а):Этого достаточно ?
Правда и манипуляции с флагом T тоже не понятны...
Всё таки цель определяет направление.
А она у вас какая?
- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1338
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Цель,свалить отсюда.Всё таки цель определяет направление.
А она у вас какая?
навсегда...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
главный колбасист, то что вы хотите научиться программировать и достичь определённой независимости - это очень хорошо.
Но процесс самообразования бывает двух типов:
Первый - с начала, с азов. Он более медленный, но основательный.
Второй - с конца. Более скоростной. Обращение к азам происходит в процессе, для решения возникающих затруднений и устранения пробелов в знаниях. Опять же, затруднения возникают при движении по определённому маршруту. При выбранном направлении.
Вы же сразу притянули конец к началу и оказались в глубокой... середине, потерявшись в направлениях. В такой ситуации даже затруднений для импульса к следующему движению возникнуть не может.
Здесь или в начало или в конец, третьего не дано.
Но процесс самообразования бывает двух типов:
Первый - с начала, с азов. Он более медленный, но основательный.
Второй - с конца. Более скоростной. Обращение к азам происходит в процессе, для решения возникающих затруднений и устранения пробелов в знаниях. Опять же, затруднения возникают при движении по определённому маршруту. При выбранном направлении.
Вы же сразу притянули конец к началу и оказались в глубокой... середине, потерявшись в направлениях. В такой ситуации даже затруднений для импульса к следующему движению возникнуть не может.
Здесь или в начало или в конец, третьего не дано.



