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

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

Сообщение shonty »

Подозреваю, что вы пытаетесь работать с "port_v", как с сущностью, про которую говорить в этой теме нельзя, иначе пост удалят :)
Реклама
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

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

сущностью, про которую говорить в этой теме нельзя - это как в сказке )

запрет - религиозный или практический?
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="Леонид_М",url="/forum/viewtopic.php?p=3832959#p3832959"]запрет - религиозный или практический?[/uquote]
Скорее мировоззренческий, а по тому как исписали много, но к единому так и не пришли :)

Могу ошибаться, но возможно у вас есть опыт работы с языками высокого уровня, и вы пытаетесь этот опыт спроецировать в ассемблер.
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

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

[uquote="shonty",url="/forum/viewtopic.php?p=3832970#p3832970"]у вас есть опыт работы с языками высокого уровня, и вы пытаетесь этот опыт спроецировать в ассемблер.[/uquote]

да, именно так... я ассемблером почти не занимался... но знаком с языками высокого уровня,
а все возможности и ограничения ассемблера пока не знаю, ничего не нашел по своему вопросу,
кроме команды set, но и она не совсем то... может это и не возможно сделать на ассемблере.
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 19103
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

shonty, человеку нужно создать макрос, работающий с любым битом порта, и к упомянутой тобой "сущности" это не имеет никакого отношения.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

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

с макросом заработало, спасибо, но макрос вставляется несколько раз в код (сколько обращений)
и тем самым увеличивает объем подпрограммы по сравнению с подпрограммами - я правильно понял?
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Сайт подвис, потому не ответил сразу. Если ещё актуально, то возможно подойдёт такой вариант:
Можно устанавливать биты в порт командой out - чтение регистра в порт. Но перед этим (возможно) понадобится прочитать порт в регистр (команда in), а потом логическими операциями поправить биты. Это для того, чтобы остальные биты в порту не нарушить, если весь порт задействован.

Приведённый вами пример перепишется типа так:

; установить на PC0 низкий:
in R8, PORTC
ldi R16, 0b111111_1_0
and R8, R16
rcall pppp

; установить на PC1 низкий:
in R8, PORTC
ldi R16, 0b111111_0_1
and R8, R16
rcall pppp

; инвертировать уровни на PC0 и PC1 одновременно:
in R8, PORTC
ldi R16, 0b000000_1_1
eor R8, R16
rcall pppp


pppp:
......
out PORTC, R8
......
ret

В данном примере подпрограмма "pppp" позволяет менять любые биты в PORTC, причём не только сбрасывать, но и устанавливать.
Операторы in, out, and, eor, or работают с регистрами 0...31, что в вашем случае позволит отвести под это отдельный регистр (например R8).

А вот andi и ori работают только с R16...R31, но сокращают запись.

; установить на PC0 низкий:
in R16, PORTC
andi R16, 0b111111_1_0
rcall pppp2

pppp2:
......
out PORTC, R16
......
ret

Нижнее подчёркивание в коде можно не убирать. Так нагляднее, и компилятор принимает.

Опять же, если ситуация позволяет не париться с другими битами порта или 2-7 биты настроены на вход с подтяжкой, то можно просто:
ldi R16, 0b111111_1_0
и на вывод.

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

Сообщение Jack_A »

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

Сообщение Starichok51 »

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

Сообщение shonty »

А причём тут макрос. Макрос работает "здесь и сейчас", то есть параметры вводятся непосредственно. А Леонид(у)_М, судя по его коду, нужно передать параметр из одной подпрограммы в другую.
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 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:
.............
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 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:
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

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

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

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

Сообщение BOB51 »

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

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

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

так я "пожертвовал" регистром )
задаю в нем, а потом в подпрограммах проверяю...
:beer:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1408
Зарегистрирован: Чт авг 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:
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

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

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

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

Сообщение shonty »

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

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

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

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

з.ы. правда тема совсем не отсюда,извиняйте, PIC16F84 и Си ,но в мультисиме нет ,увы AVRок :cry:
Вложения
main.c
(3.5 КБ) 227 скачиваний
Контактная информация:
Ответить

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