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

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

Сообщение Jetetex »

кто знает как узнать обьем данных, которые будут загружены в МК из HEX файла, сгенерированого TavrAsm.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Реклама
akl
Друг Кота
Сообщения: 4458
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Как вариант, загрузить в программатор
СпойлерИзображение
Вложения
hex.PNG
(28.31 КБ) 1031 скачивание
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

akl, добрый день. У меня есть к Вам вопрос, но Вы отключили личные сообщения. Можно как-то с Вами связаться?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4458
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вопрос решен. Удалил.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Возможности макропрограммирования avrasm2 позволяют делать интересные вещи, вот пример рекурсии в макросах:

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

.macro Ft
.if a != 1
	.set r = r * a
	.set a = a - 1
	Ft a

.endif
.endmacro

.macro Factorial
.set a = @0
.set r = 1
	Ft a

.endmacro

.cseg
	Factorial 7

	ldi r16,byte4(r)
	ldi r16,byte3(r)
	ldi r16,byte2(r)
	ldi r16,byte1(r)
А вот ещё пример макроса для инициализации портов ввода/вывода ATmega, ATtiny.
Не получается добавить вложение, вот прямая ссылка [url]www.avr-assm.ru\files\macro2.zip[/url]
Реклама
Родился
Сообщения: 10
Зарегистрирован: Сб июл 11, 2015 09:22:54

Сообщение dmitriy131313 »

Здравствуйте, Друзья! Помогите пожалуйста. Никак не могу понять код умножения из атмеловской аппноы 200. Принцип действия каждой команды понятен, а вот в логику никак не могу въехать. Заранее спасибо!
.def mc8u =r16
.def mp8u =r17
.def m8uL =r17
.def m8uH =r18
.def mcnt8u =r19


mpy8u_c:
clr m8uH
ldi mcnt8u, 8
lsr mp8u

m8u_1:
brcc m8u_2
add m8uH, mc8u

m8u_2:
ror m8uH
ror m8uL
dec mcnt8u
brne m8u_1
Реклама
akl
Друг Кота
Сообщения: 4458
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Лучше чем в самом AVR200 вряд ли кто напишет.
AVR200_MULT.txt
(728 байт) 140 скачиваний
Родился
Сообщения: 10
Зарегистрирован: Сб июл 11, 2015 09:22:54

Сообщение dmitriy131313 »

akl писал(а):Лучше чем в самом вряд ли кто напишет.
Тут конечно не поспоришь. Заново изобретать велосипед нет смысла. Но всё же с кодом разобраться хочется. В аппноте подробно расписан алгоритм, но отсутствует разъяснение логики действий. Хотелось бы увидеть хотя бы формулу по котой ведётся расчёт. Если кто знает, был бы благодарен за помощь!
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Возьмите два числа в двоичном виде и умножьте их столбиком - как в школе, только в двоичной системе. Вот именно это в коде и реализуется.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

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

.macro	outi
	ldi	r16,@1
	out	@0,r16
.endm
что такое @1 и @0 ?
Tell Me The Truth
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Параметры макроса. Первый (@0), и второй (@1).
Родился
Сообщения: 4
Зарегистрирован: Чт окт 22, 2009 17:41:38

Сообщение Dim-k12 »

Привет форумчанам!
Пока только курю форумы и даташиты, поэтому нужно мнение тех, кто в теме.
Имеется давний проект https://www.drive2.ru/b/1561303/
Вот накарябал код, но надо идти дальше
Вопрос как реализовать контроль переменного напряжения поступающего на вывод МК?
Как прерывание по изменению состояния вывода или измерять ацп?
Нужно начать процесс регулирования только после того, как генератор раскрутится, т.е с обмотки статора начнет поступать напряжение.
Вложения
525ab3cs-960.jpg
(70.23 КБ) 305 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

какая разница между этими формами записи ?

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

out	_SFR_IO_ADDR(USICR), r24

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

out	USICR, r24
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Смотри исходник с дефайном (область объявления констант/имен) в том проекте.
:wink:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

не увидел я там ничего такого
можете изясниться яснее ?
Tell Me The Truth
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

_SFR_IO_ADDR это макрос

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

 #define __SFR_OFFSET 0x20
 #define _SFR_IO_ADDR(sfr) ((sfr) - __SFR_OFFSET)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ок, спасибо :)
ну а почему тогда производится вычитание смиещения ?
http://images.slideplayer.com/16/526396 ... ide_29.jpg
насколько я понимаю то сначала идут GPR а далее SFR
и как по мне то для правильного указания действительного адреса следовало бы записать SFR+0x20
Tell Me The Truth
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Для компилятора avrasm (avrasm2) использование данного макроса не имеет смысла, так как в аппнотовских файлах (.inc) адреса регистров уже скорректированы для использования в инструкциях in/out либо lds/sts. Этот макрос в avrasm и не применяется. Возможно в каких-то других средах программирования что-то как-то происходит иначе. Я знаю только avrasm, пока не было необходимости в чём то другом.
О, вспомнил: в GCC это используется, смотрите в его документации.
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

dimmer писал(а):Для компилятора avrasm (avrasm2) использование данного макроса не имеет смысла, так как в аппнотовских файлах (.inc) адреса регистров уже скорректированы для использования в инструкциях in/out либо lds/sts. Этот макрос в avrasm и не применяется. Возможно в каких-то других средах программирования что-то как-то происходит иначе. Я знаю только avrasm, пока не было необходимости в чём то другом.
О, вспомнил: в GCC это используется, смотрите в его документации.
:shock:
Ой-ой!
Где ж это в инк-файлах "адреса скорректированы"?
Там только встречается комент " ; MEMORY MAPPED" - типа "адресуется исключительно как память".
8)
Стандартно приводится ряд адресации для команд in/out (если все регистры вписываются в область 0х01 -0х3F),
а для работы с РСФ в диапазоне адресов 0х01 -0х3F как с ОЗУ (ld/st lds/sts) используется "имя регистра+0x20".
Плюс особое внимание кристаллам с расширенной областью РСФ, где надо внимательно
в даташит глядеть (что в любом случае не лишним будет) в раздел "register summary".
Ибо "что сывше 0х3F (0х5F как ОЗУ)" доступно исключительно как ОЗУ
и уже не требует пресловутого "+0x20".
:)
очепятку исправил
:wink:
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

Доброго времени суток :) Небольшая загвоздка с таймером1 в меге8 :) Значит, установил режим СТС, разрешил прерывания таймера по совпадению с OCR1A, загрузил числа в OCR1A. По прерыванию инвертируем состояние портаB. В avrstudio4 работает нормально, в протеусе и железе - почему-то частота инвертирования порта не зависит от OCR1AH, т.е. все происходит только по младшему регистру. :dont_know:
Спойлер

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

;разрешим сон idle mode
		in temp, MCUCR
		ori temp, 0b10000000				
		andi temp, 0b10001111
		out MCUCR, temp
;таймер
		ser temp                                           ; устанавливаем числа, с которыми будет сравниваться таймер
		out OCR1AL, temp
		out OCR1AH, temp
		clr temp		 	
		out TCCR1A, temp                             ; ОС1А отключен
		ldi temp, 0b00001001
		out TCCR1B, temp				; режим СТС
		ldi temp, (1<<OCIE1A)
		out TIMSK, temp                                ; разрешаем прерывания по совпадению
		sei
	
Nope1: 
	sleep
	rjmp nope1

tim1_compa:                                                 ; обработка прерывания - ставим в лог. 1 нулевой бит портаB
		ldi temp, 0x0F
		out ddrb, temp
		in temp, portb
		com	temp
		andi temp, 0x0F
		out portb, temp
		reti
Полный чайник.
Ответить

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