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

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

Сообщение Jack_A »

СКАЗОЧНИК писал(а):Т.е. если я задам массив и напишу в нем буквами, у меня скомпилируется в коды символов?
Да. Для латиницы, цифр и знаков препинания. Когда мне нужно было загонять большие массивы кириллических текстов, я поручал эту работу специально обученной программе. Есть что-то подобное в сети, но мне лень было искать, свою накропал.
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

А мне особенно кирилица и не нравится в отображении на таких дисплеях... Кривая какая-то. Поэтому, ее можно и кодами, кому надо. :)))

З.Ы. Сделал! Все прекрасно пашет. Как же это просто оказалось! ))) Теперь моя библиотека для ЖКИ обзавелась выводом сразу строки. Причем так выгоднее писать на дисплее, чем отдельно по букве выводить.
:beer: Благодарю.
Станислав
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

Подскажите пжлст, можно ли значение 16-разрядного таймера\счетчика считывать побайтно?
т.е.

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

mov temp1L, TCNT1L		; Запись младшего байта
mov temp1H, TCNT1H		; запись старшего байта
AVR studio матюгается на эти строки, "invalid register"
Полный чайник.
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Чтение 16-назрядных регистров периферии.
IN XL,TCNT1L
IN XH,TCNT1H

Позор на мою седую. Исправил.
Последний раз редактировалось akl Сб янв 24, 2015 14:22:05, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Елки. Хреново, что в ассемблере нет команды "пропустить, если при сравнении регистра с константой получилось равно"...
Станислав
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

akl писал(а):IN XL,TCNT1L
IN XH,TCNT1H

Исправил.
Разве LDI было неверно?
IN - ввод из порта I/O, регистр счетчика можно назвать портом? О_о
Полный чайник.
Реклама
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Командой LDI загружается адрес порта. А вот для обмена значениями по этим 16-разрядным портам периферии и придумали аппаратные регистры TEMP. Правда, общение стало немного сложнее. Запись значения в такие порты (OUT или STS с соответствующим смещением на +$20) должна быть в формате старший-младший, чтение значения наоборот - младший-старший (IN или LDS с соответствующим смещением на +$20).
Спойлер

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

	LDI	XH,TCNT1H+$20
	LDI	XL,TCNT1L+$20

	LD	R1,X+
	LD	R0,X
	IN	R11,TCNT1L
	IN	R10,TCNT1H

	ST	X,R1
	ST	-X,R0
	OUT	TCNT1H,R11
	OUT	TCNT1L,R10

	LDS	R1,TCNT1L+$20
	LDS	R0,TCNT1H+$20
	IN	R11,TCNT1L
	IN	R10,TCNT1H

	STS	TCNT1H+$20,R1
	STS	TCNT1L+$20,R0
	OUT	TCNT1H,R11
	OUT	TCNT1L,R10
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

akl, спасибо :))
Полный чайник.
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

Подскажите еще :) Если ZH=0, ZL=11111111 и к нему прибавить 1, то ZH=00000001 ? Или просто ZL обнулится и установится флаг переноса/переполнения?
Полный чайник.
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.
Но.

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

	LDI	R16,1
	ADD	ZL,R16
приведёт к обнулению и установке флагов Z и C!
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

akl писал(а): Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.

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

	adiw	ZH:ZL,0b10000000;
:? error: Operand 2 out of range: 0x80
Полный чайник.
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Да ну...? Операнд 2 не может превышать 63.
ADIW Rd+1:Rd,K d ∈ {24,26,28,30}, 0 ≤ K ≤ 63 PC ← PC + 1
СпойлерИзображение
NO_ERROR.GIF
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

Сообщение neoneon »

akl писал(а): Операнд 2 не может превышать 63.
:(
Спасибо! Я тоже хочу быть таким же умным :lol:
Полный чайник.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

zero648 писал(а):
akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.
Поправка , не вычтет а прибавит ибо (минус на минус дает плюс)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Именно вычтет. Потому что 255 - это и есть -1.
Fucking static initialization order fiasco
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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

Сообщение Jack_A »

Вот именно. Если написать пару строчек и попробовать, то будет, конечно, 0 и флаг С не установится. Процессор не призводит никаких тождественных преобразований "минус на минус = плюс", а тупо выполняет предписанное :
SUBI ZL,0xFF => 255 - 255 = 0 безо всяких С.
Один мой знакомый перед тем, как дать кому-то рекомендацию к действию, на себе проверял ....
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

А ну да , он переведёт в hex
Родился
Аватара пользователя
Сообщения: 2
Зарегистрирован: Пн фев 09, 2015 15:55:41
Откуда: Липецк

Сообщение Petr_Vas »

Здравствуйте форумчане!
Подскажите, желательно на примере кода в несколько строк на асме, реализацию следующей задачи.
Порт контроллера подключен 4 пинами к одному устройству, а остальными к другому, причём не подряд, а

вперемешку (d0, d1, d2, d7 - одно устр-во , d3, d4, d5 d6 - другое). Необходимо выводить по команде 4 бита только на

1-е устройство, не затрагивая остальные 4 бита, как реализовать?
Ответить

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