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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Табуляция игнорируется при вставке

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


; input ah:al = $8000 .. $FFFF 
;  out ah:al = 0 .. $3FFF


Log_2:
	pushw Z
	pushw X
	pushw B
	push cl
	ldiw Z,(TablLog2*2)
	ldiw X,(1<<15)		
	clr rl
	clr rh
	ldi cl,16																
lgrt_a:	movw bl,xl		 		
	ldi Tmp,17
	sub Tmp,cl
lgrt_b:	lsrw B				
	djnz Tmp,lgrt_b		
	addw X,B
	brcs lgrt_e
	cpw X,A
	brcs lgrt_c
lgrt_e:	subw X,B
	adiw zl,2
	rjmp lgrt_d		
lgrt_c:				
	lpmw B,Z+
	addw R,B
lgrt_d:	djnz cl,lgrt_a		
	movw al,rl
	pop cl
	popw B
	popw X
	popw Z
	ret


TablLog2:
	.dw 4791,2637,1392,716	;8191*Lg(1+(1/2)^^(i+1))/lg(2)	i=0..15
	.dw 364,183,92,46
	.dw 23,12,6,3
	.dw 1,1,0,0



;	.dw 9583,5274,2784,1433	;16383*Lg(1+(1/2)^^(i+1))/lg(2)	i=0..15
;	.dw 727,366,184,92
;	.dw 46,23,12,6
;	.dw 3,1,1,0


Так лучше?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6348
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение BOB51 »

Какая-то смесь команд с макросами...
:dont_know:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

старинные Ченовские (тот что FatFs сделал) AVR макросы:

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

...............
.def	AL	= r16
.def	AH	= r17
.def	BL	= r18
.def	BH	= r19
.def	CL	= r20
.def	CH	= r21
.def	DL	= r22
.def	DH	= r23
.def	EL	= r24
.def	EH	= r25
;------------------------------------------------;
; Push/Pop register pair
;
; 	pushw	Z

.macro	pushw
	push	@0H
	push	@0L
.endm

.macro	popw
	pop	@0L
	pop	@0H
.endm
............
видать x86 ассемблер оказал влияние
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А
djnz r,expr
?
это ж от 51-й
:roll:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3106904#p3106904"]А
djnz r,expr
?[/uquote]
никто не мешает и на AVR изобразить:

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

.macro	djnz
	dec	@0
	brne	@1
.endm

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

djnz cl,lgrt_a
=
dec cl
brne lgrt_a
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

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

Сообщение BOB51 »

Дык ежли макросы в исходник впихерены, то необходимо и их описание вместе с оным исходником выкладывать, дабы не прослыть СУСАНИНЫМ.
8)
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Извини, не подумал. Макросы в отдельном файле.
Хотел показать простоту реализации ориентировочной реализации вычисления.
Занимаюсь нормализацией входного сигнала и масштабированием выходного, посему меняется таблица констант, но алгоритм остается.
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 07, 2011 12:53:26

Сообщение Jonson77 »

Здравствуйте, подскажите пожалуйста собрал измерительный прибор и возникла необходимость перевернуть дисплей вверх ногами. Автор проекта не отвечает, я сам не силен в программировании. Есть исходники проекта, пробовал в WinAVR и AVR Studio но после компиляции даже без каких либо изменений получаемый hex работает только в Proteus-е, а в железе нет - даже экран не включается хотя оригинальный hex работает. Подскажите пожалуйста. В архиве оригинальные исходники, мой в WinAVR и проект Porteus.
Вложения
AmperVolt.7z
(928.13 КБ) 205 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Дык... проект-то СИшный... а не ассемблер...
:?
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

[uquote="Jack_A",url="/forum/viewtopic.php?p=3106493#p3106493"]Давно такого потока сознания на форуме не наблюдал... Особенно впечатлило :
только нужен доступ к соответствующей расчётной программе.
Так вроде ТС и ищет эту "соответствующую расчётную программу"
Или:
Логарифм вызывается одной командой.
я даже подозреваю, эта команда CALL - вызов соответствующей подпрограммы. Вот и выдал бы человек, учитывая его космических высот квалификацию, текст проги - на посрамление нам, неразумным.[/uquote]
Да, это вызов подпрограммы, библиотечного элемента. Я вызываю его так:
Log_10 (x, y)
где х - аргумент, двухбайтная переменная,
y - итог вычисление логарифма, тоже двухбайтная переменная.
Программа основана на разбиение всего диапазона на отдельные участки, а на каждом участке используется линейная аппроксимация.
Собственно, программа приведена в ссылке, берите и пользуйтесь. Только написана на макроассемблере, на АБ.
Для меня классический ассемблер выглядит анахронизмом.
Я не программист, поэтому говорить о какой-то особой моей квалификации, тем более космической, не имеет смысла.
Написать команду займет несколько минут - и задача решена. Причём с гарантированной точностью 0,5 процента в диапазоне от 1 до 64. Думаю, так и работают профессионалы.
Если точности недостаточно, то её можно улучшить. Для этого есть математическая программа, которая по заданной точности и коэффициенту перед логарифмом рассчитывает массивы координат точек разбиения и массивы коэффициентов прямой линии аппроксимации . Остаётся только перенести эти массивы в подпрограмму логарифма - и получите новый логарифм с требуемой точностью.
Но эту математическую программу, думаю, в общем доступе не найти.
Предельная точность этого логарифма, похоже, 0,1 процента. Там единица представляется числом 1024, поэтому единичный шаг соответствует погрешности 0,1 процента.
В принципе, если единицу представлять числом 2048, можно в два раза увеличить точность, только диапазон аргумента уменьшится в два раза.

В общем, решение относительно несложное, никаких космических высот и потоков сознания.
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Заранее прошу прощения за вопрос.
Можно ли в ходе выполнения программы изменять назначение ног контроллера с входа на выход и обратно без ресета, или это одноразовая акция при инициализации контроллера, то есть изменять содержимое регистра DDRB :oops:


МК - Attiny 2313
язык - ассемблер
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

вообще без проблем.

Добавлено after 7 minutes 13 seconds:
также просто как записать значение в порт. так получаем 4 состояния порта и возможность их менять в любой момент, только надо соблюдать очередность - сначала значение, потом направление на вывод или сначала направление на вход, а потом значение - так не будет выбросов (из за того, что эти значения в порт не получится записать одновременно) (сам МК ни каких ограничений не накладывает)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Я правильно понял ваше сообщение?
СпойлерReset:

ldi Temp,0b01111111 ;настройка портов
out DDRB,Temp

бла-бла-бла
инициализация
reti

main: осн цикл
бла-бла-бла
кусок программы

ldi Temp,0b00000000 ;меняем назначение портов
out DDRB,Temp

бла-бла-бла
еще кусок кода в котором применяем новое направление

ldi Temp,0b01111111 ;ставим все на место
out DDRB,Temp

rjmp main
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

да, только порты можно (до определенной буквы, не помню точно какой, но тинькам это точно не грозит) адресовать и побитно например
SBI DDRB,1 (1 нога порта B - на выход) так тоже должно работать.
а если как ты писал - то лучше сначала прочитать состояние, потом изменить нужные биты (при помощи масок), а потом вписать обратно - иначе можно испортить направление других выводов порта.

Добавлено after 5 minutes 12 seconds:
CBI DDRB,1 - его же на вход (на 100% в правильности написания не уверен, я больше по С)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Собственно, один из вариантов эмуляции выхода с открытым стоком на AVR - это выставить PORT в 0, а дальше уже дёргать DDR по необходимости.

В этом случае при DDR=1 будет выдаваться активный 0, а при DDR=0 - Z-состояние, что полностью идентично тому, как если бы это был открытый сток.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

WiseLord писал(а):...полностью идентично тому, как если бы это был открытый сток.
Нет не полностью. Вам все равно на входе нельзя превышать напряжение питания МК.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

подскажите пож. как считать программные задержки.
И почему онлайн калькуляторы некорректно подсчитывают
например
http://www.bretmulvey.com/avrdelay.html

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

; Delay 4 800 000 cycles
; 1s at 4.8 MHz

    ldi  r18, 25
    ldi  r19, 90
    ldi  r20, 178
L1: dec  r20
    brne L1
    dec  r19
    brne L1
    dec  r18
    brne L1
    rjmp PC+1
Почему в строке циклы пишется на порядок больше т.е. 48 000 000 ?
А когда зашиваю в реальный контроллер получается не 1 сек а 7 сек. Контроллер Attiny13A
Естественно пробовал разные частоты генератора.
Пробовал и на Attiny2313, запускал от внешнего резонатора, все тоже самое
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для формирования точных интервалов предназначены аппаратные таймеры.
Программные циклы в качестве задержек имеют крайне ограниченное применение из-за различных факторов.
Кроме прочего сам RC-генератор имеет допустимый диапазон погрешности и касательно тиньки 13-й надо весьма точно считать - с 8-9 знаками после запятой.
:wink:
Особо ежли учесть, что для пониженной частоты генератора константа коррекции должна быть вручную заранее считана и в программе заранее загружена. Автоматом только для основной частоты "по умолчанию" корректируюшша константа загружается.
:twisted:
Ответить

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