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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

что в IDE компаниии IAR при написании программы для той платформы которую она поддерживает программисту не надо заморачиваться со "стандартами" языков разных компиляторов
Со стандартами нигде не надо заморачиваться, на то они и стандарты. IAR хорош тем, что у него во-первых дофига компиляторов для разных архитектур, во-вторых тем, что всё это собрано в одну IDE, и в третьих - с хорошим отладчиком под всё это дело.
Плох - ценой.
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 223
Зарегистрирован: Вт окт 02, 2007 14:43:23
Откуда: Ростов-на-Дону

Сообщение GRafGRay »

Доброго времени суток!
имеется вот такой кусочек кода:
ldi XH,High(9876)
ldi XL,Low(9876)

ldi ZL,Low(1000)
ldi ZH,High(1000)

clr R16
cp XL,ZL
cpc XH,ZH
brlo PC+5
sub XL,ZL
sbc XH,ZH
inc R16
rjmp PC-6
sts Digit,R16

собственно прога компилируется но выполняется не так как мне бы хотелось, в Digit не записывается значение R16
что я не так делаю?
При наличии отсутствия пропитанных шпал - это будет не трамвай а одно горе!
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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

ldi XH,High(9876)
	ldi XL,Low(9876)

                 ldi ZL,Low(1000)
	ldi ZH,High(1000)

	clr R16
MET2:	cp XL,ZL
	cpc XH,ZH
	brlo MET1
	sub XL,ZL
	sbc XH,ZH
	inc R16
	rjmp MET2
MET1:	sts Digit,R16
А так
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

GRafGRay Хотя, Ваш код заменяется

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

	.equ	digit	=$70
	LDI	R16,(9876/1000)
	sts Digit,R16
но, понимая, что это обучающая программа и она у меня выполняется в AVRSTUDIO 3.21, следует помечать точки переходов как показано выше уважаемым ILYAUL. Возможностями "препроцессора" ассемблера тоже не следует пренебрегать.
Реклама
Эиком - электронные компоненты и радиодетали
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

на данном примере ему наверное хочется в перспективе научиться заменять не как у вас,а LDI на что то типа LDS :)
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Помогите разобраться с командами subi,sbci. Чего-то недогоняю конкретно со сложением,совсем путаюсь как там происходит все.
Как контроллер отличает 255 от -1? Если можно,подскажите в столбик и с яркими картинками :) про дополнительный код.Наверное чего-то упускаю из виду,а что не пойму.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Обратите внимание на разницу мнемоник этих замечательных команд.
Разберите в картинках пример, обращая внимание на флаг переноса C
Спойлер

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

GO:
	LDI	R20,BYTE4(6666666)
	LDI	R21,BYTE3(6666666)
	LDI	R22,HIGH(6666666)
	LDI	R23,LOW(6666666)
	
	SUBI	R23,LOW(-6666666)
	SBCI	R22,HIGH(-6666666)
	SBCI	R21,BYTE3(-6666666)
	SBCI	R20,BYTE4(-6666666)

	STS	$63,R23
	STS	$62,R22
	STS	$61,R21
	STS	$60,R20
	RJMP	GO
Используя различные сочетания значений R20...R23 и констант, убедитесь, что если значения в R20...R23, констант и результата находятся в области определения разрядной сетки (для 4-х байт от -2147483648 до +2147483647) результат будет правильным.
vek писал(а):Как контроллер отличает 255 от -1?
Ему пофиг. Контроллер выполняет действия в зависимости от используемых условий, которые определяются состоянием флагов регистра SREG.
Спойлер
переходы.GIF
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Чего-то непойму как без директив обойтись,так сказать,саму подноготную арифметики непонимаю.
как к 2-х байтовой переменной прибавляется 1-байтовая константа,
Почему-то не канает если так хочу прибавить 6:
subi REG_L, -6
sbci REG_H, 0
Это мягко говоря не совсем очевидено
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Э нее! Попробуйте всё таки с директивами и увидите, что число -6 выглядит иначе.
Изображение
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

У меня крокодил не ловиться,не растет кокос. Почему так?

P.S. А вроде понимать начал,это походу из-за того что я себе представляю число "-6" как однобайтное,
При этом пытаюсь его вычесть из двух байт. А надо приводить константу тоже в 2-х байтное значение.Это совсем не похоже на вычитание положительного значения. Нужно из старшей части не 0 вычитать,а -1.
Как-бы действительно не вполне очевидная вещь(и то до конца не понял :) ).
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Друг Кота
Аватара пользователя
Сообщения: 15790
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для двухбайтовых констант в пределах 0-63 лучше подходят команды
ADIW Rd+1:Rd,k (adiw rd,k) / SBIW Rd+1:Rd,k (sbiw rd,k) с регистровыми парами 25:24, 27:26, 29:28, 31:30
8)
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Ну это понятно,про такие команды мы знаем :) ,я немного про другое спрашивал:)) Разобрался вроде
Но все равно спасибо
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Родился
Сообщения: 7
Зарегистрирован: Сб окт 12, 2013 11:54:42

Сообщение MINSK42 »

Здравствуйте, у меня есть некоторая проблема с переносом ассемблерной вставки bp CCG в AVR. Код взят по этой ссылке http://www.mikrocontroller.net/topic/292775, к слову этот код управляет диодами ws2812.

asm volatile(
" ldi %0,8 \n\t"
"loop%=:lsl %1 \n\t"
" dec %0 \n\t"
" sbi %2, %3 \n\t"

" brcs .+2 \n\t"
" cbi %2, %3 \n\t"

" brcc .+2 \n\t"
" cbi %2, %3 \n\t"
" brne loop%= \n\t"
: "=&d" (ctr)
: "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
);

До этого момента с ассемблером не сталкивался, по CCG мануалов достаточно, так что я разобрался, что происходит в коде, а по CVAVR куций хэлп и больше не нашел.
Вот что получилось у меня.

#asm
ldi r1,curbyte
ldi r2,ws2812_port
ldi r3,ws2812_pin
ldi r0,8
loop :
lsl r1
dec r0
sbi r2, r3

brcs PC+2
cbi r2, r3

brcc PC+2
cbi r2, r3
brne loop
// : "=&d" (ctr)
// : "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
#endasm
И если честно, даже прочитав Allocation of Variables to Registers в хэлпе я не понял, как правильно осуществляется доступ к глобальным переменным или в какой регистр и как их помещать, компилятор ругается. Где мне найти информацию и как правильно транслировать код в Code Vision?
И еще, тут: http://rurandom.org/justintime/index.ph ... _explained рассматривается какая-то более заковыристая реализация этой задачи, код координально рознится, какому стоит доверять?
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Регистры r0-r15 c константами не работают, наверно по-этому компилятор ругается, с константами работают r16-r31, нужно заменить r0,r1,r2,r3 на какие нибудь из r16-r31, но какие из них использует компилятор в своих целях хз, так что с прогой в целом может произойти чтото непонятное, конфликт используемых регистров. Лучше все используемые регистры сохранить в стеке в начале вставки, а по завершении восстановить.
Родился
Сообщения: 7
Зарегистрирован: Сб окт 12, 2013 11:54:42

Сообщение MINSK42 »

Я пытался засунуть их во все возможные регистры, все равно компилятор ругается, можно привести пример кода или рассказать, где можно посмотреть разбор похожего кода.
Родился
Сообщения: 7
Зарегистрирован: Сб окт 12, 2013 11:54:42

Сообщение MINSK42 »

Вроде успешно раскидал по регистрам, но выдает ошибку в sbi r22,r23, в r22 записан 0х15, адрес порта С для атмега8, в r23 0x04- 4й порт. Вот еще такой вопрос, если я закрою инлайновую вставку, напишу то же по функционалу выражение, скажем PORTC.4=1, потеряю ли я такты на его исполнение?
Последний раз редактировалось MINSK42 Ср окт 30, 2013 15:59:49, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

MINSK42 писал(а):Вроде успешно раскидал по регистрам, но выдает ошибку в sbi r22,r23
Вы командой установки бита (от 0 до 7) пытаетесь установить бит с номером 23 (адрес регистра r23). SBI не предусматривает переменную в качестве второго аргумента, только константу. Да и первом аргументе должен быть прямой адрес, а не регистр. Так и пишите SBI PORTC,PC3
Родился
Сообщения: 7
Зарегистрирован: Сб окт 12, 2013 11:54:42

Сообщение MINSK42 »

Получается, мне в сишной части нужно задать эти значения как константы и поместить их в соответствующие регистры r16-r31? что-то в стиле
register const char ws2812_pin=0x15 @16;
или же
const char ws2812_pin;
а потом в инлайновой вставке:
ldi r24,ws2812_pin
чтобы потом использовать sbi ?

Прямой адрес а не регистр? В примере " sbi %2, %3 \n\t", насколько я понимаю используется регистр.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Если у вас конкретный пин конкретного порта, не надо ничего определять, все уже должно быть определено просто пишите как есть SBI PORTC,PC3, если конечно адрес регистра попадает в дозволенный диапазон (иначе компилятор ругнется).
Если в диапазон не попадает, или нужно устанавливать произвольные биты произвольных портов, тогда придется использовать регистровые пары X,Y,Z и команды LD(S), ST(S).
Родился
Сообщения: 7
Зарегистрирован: Сб окт 12, 2013 11:54:42

Сообщение MINSK42 »

получается в CCG для использования значений из основного кода и вывода из инлайновой вставки используется
: "=&d" (ctr)
: "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
а в CVAVR можно напрямую обращаться к переменным?
Мне бы хотелось разобраться, чтобы в будущем подобные вопросы не возникали.
Ответить

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