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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BlYur
Открыл глаза
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

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

Сообщение BlYur »

Здравствуйте.
Помогите, плz, вкурить в такую вот строчку

LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)

Я знаю, что здесь связано что-то со сдвигами и побитовыми "или"...
Можно ли разжевать на примере?
Реклама
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

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

Сообщение НАПАЛМ »

RXEN, TXEN, RXCIE, TXCIE, UDRIE - имена битов, за ними скрываются их номера.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
Реклама
Аватара пользователя
BlYur
Открыл глаза
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

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

Сообщение BlYur »

НАПАЛМ писал(а):RXEN, TXEN, RXCIE, TXCIE, UDRIE - имена битов, за ними скрываются их номера.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
Тафайте для наглядности заменим RXEN на какой-нибудь номер бита.
Тогда что же грузится в регистр R16?
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

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

Сообщение НАПАЛМ »

ldi r16, (1<<7)|(1<<1)
В r16 загрузится 0b10000010
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вот эта штука , в упрощённом слеганца виде , меняет установку часов и прочего от DS1307 и последующего семейства RTC. Естественно не прибегая к дурным преобразованиям BCD->HEX->BCD
В реале она конечно по другому выглядит , просто скомпилил под симулятор

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

Clock_Plus:
;+ В temp текущее значение в BCD формате, которое мы получили нажав
;+ кнопку SET
	;	push	temp
		ldwi	X,(BUFDS1337+dsDay)
		ldwi	Z,Setting_Clock*2
		clr		temp
		lpm		rab,Z+				;- Получаем границы изменения
		lpm		rab1,Z+
		add		temp,rab
		subi	temp,-1
		brhc	INIT_ZNASHENIE
SUN4:
		sub		temp,rab
		st		X+,temp
		pop		temp
		ret
INIT_ZNASHENIE:
		subi	temp,-6
		rjmp	SUN4
Setting_Clock: .db 0x66,0x24,0x60,8,0x32,0x13,0x99
Это если увеличивать 1,2, 3, и т.д
А вот с минусом , что-то я затупил не по детски. Кто хочет поразмять мозг?
Последний раз редактировалось ILYAUL Ср авг 26, 2015 20:55:34, всего редактировалось 1 раз.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15577
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

BlYur писал(а):
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
В части 0<<N выражение лишено смысла, так как исходно значение берется равным 0. Таким способом можно устанавливать единицы в заданном разряде или "оптом" сбросить всё содержимое в 0 если будет присутствовать всего один элемент вида 0<<N.
К примеру:
LDI R16, (0<<RXEN)
загрузит в R16 0х00.
8)
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

То, что 0<<N всегда равно нулю, не означает, что выражение это лишено смысла. Смысл в том, что в подобном выражении мы видим все необходимые биты регистра и их значения, а также в том, что такая запись легко редактируется.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15577
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Зато прекрасно можно на "медвежачу помощ" нарваться.
8)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

В данном использовании (прямое присваивание) - ничуть.
В C, например:

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

TCCR0 = (0<<CS02) | (1<<CS01) | (0<<CS00);			/* Set timer prescaller to 8 (2MHz) */
Безопасно и понятно, и выглядит лучше чем TCCR0 = (1<<CS01), например. Но вот запись (модификация) типа

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

TCCR0 |= (0<<CS02) | (1<<CS01) | (0<<CS00);			/* Set timer prescaller to 8 (2MHz) */
действительно становится опасной и может сослужить медвежью услугу.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

спорщики, посмотрите на мою подпись :) самое простое решение, ведущее к нужному результату, и будет самым правильным :)))
сдвиг нуля - лишнее, ибо усложняет, ничего не давая взамен.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Кто хочет поразмять мозг?
:cry:
Таки сделал :))) Теперь у меня два счетчика BCD в + и -
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Kill17 »

Люди добрые, помогите советом!
Атмега168, алгоритм работы такой - входим в Bootloader - по выходу идем в основную программу.
Вопрос в следующем. После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера, а после выхода из бутлоадера, я могу переключится на таблицу прерываний находящуюся в основной программе? те нужно пользоваться 2-я независимыми таблицами прерываний, это возможно? Если да, то перенос векторов функцией -

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

Move_interrupts:
; Enable change of Interrupt Vectors
ldi r16, (1<<IVCE)
out MCUCR, r16
; Move interrupts to Boot Flash section
ldi r16, (1<<IVSEL)
out MCUCR, r16
ret
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Бутлоудер нужен для заливки программы в микроконтроллер без программатора, по сути бутлоудер это программа располагающаяся по опр адресу. Когда Вы прыгните по адресу в котором должен находиться бутлоудер, если он там есть Вы сможете с помощью специальной программы связаться с МК и передать ему прошивку которую хотите залить в МК.
После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера
Нет, таблица располагается по определенному адресу и перенести её нельзя, вернее будет сказать, что вектора прерываний имеют фиксированный адрес.
те нужно пользоваться 2-я независимыми таблицами прерываний, это возможно?
Нет, таблица всего одна.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15577
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Положение бутлоадера и его размер а также положение адреса исполняемого вектора сброса (reset) у АВР определяется фузами и не может быть переопределено программой по ходу ее выполнения.
А вот положение адресов таблицы исполняемых векторов прерываний вполне можно переопределить программой "на лету".
(Выполняется не в каждом из МК - требуется почитывать даташиты на наличие как команды SPM, так и соответствующих средств для работы с загрузчиком).
Однако...
При выборе областей размещения следует также учитывать деление ПЗУ на области the Read-While-Write (RWW) section and the No Read-While-Write (NRWW) section и их соответствующие различия.
Дополнительно... никто не мешает вместо целевого вектора подставит указатель (да еще и "по условию") для перехода в другую заранее определенную зону "общей совместимости".
:beer:
bob1
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20
Контактная информация:

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

Сообщение bob1 »

Kill17 писал(а): После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера, а после выхода из бутлоадера, я могу переключится на таблицу прерываний находящуюся в основной программе?
Да. Изменением бита IVSEL в регистре MCUCR для данного камня. Устанавливаете бит IVCE в "1" и затем в течении 4 тактов нужно занести нужное значение в IVSEL.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Kill17 »

Что-то Вы меня запутали :)))
Атмега зашита на старт из бутлоадера. Я хочу использовать прерывания в бутлоадере, а после выхода из бутлоадера и перехода на адрес $0000, я хочу пользоваться прерываниями в основной программе, но своими (не зависящими от прерываний в бутлоадере). Это возможно?
bob1
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20
Контактная информация:

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

Сообщение bob1 »

Стартуете с бутлоадера. Устанавливаете IVSEL=1. Вектора прерываний в загрузчике. Когда перейдете на адрес $0000, то установите IVSEL=0. Вектора прерываний в основной проге.
Аватара пользователя
Kill17
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс май 30, 2010 20:27:33
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Kill17 »

Спасибо! Все получилось! :))
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

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

ААааа....
Коты! Кто подскажет, как обрезать в ассемблере переменную по маске? Тупо надо сбросить старшие 4 бита в переменной. :oops:
Помню, что раньше делал как-то (ANDI что ли), но забыл, а время 2 ночи, уже туплю... :facepalm:
Станислав
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

andi temp,0x0F
Ответить

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