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

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

Сообщение BOB51 »

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

Сообщение bob1 »

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

Сообщение Kill17 »

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

Сообщение bob1 »

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

Сообщение Kill17 »

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

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

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

Сообщение ILYAUL »

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

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

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

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

ЕПРСТ. Очередной вопрос.
Вот есть у меня 4 байта в ОЗУ, каждый обозван каким-то словом.
Если я пытаюсь на них наложить маску (обрезать по маске), то мне хрен с маслом говорит... Только регистры можно так резать.
Что делать?

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

Сообщение zero648 »

С помощью команды LDS загружаете байт из памяти в регистр, обрезаете регистр по маске и выгружаете его обратно в память командой STS:

LDS r16,ram1
andi r16,mask
STS ram1,r16
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Да, в том-то и дело, что хотел освободить рабочих регистров... И сделать попроще... А тут как всегда, через... и тактов больше и времени. :facepalm: еще и регистры опять заняты.
Станислав
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

error: Relative branch out of reach

Вот такую штуку выдала Студия. Теперь вопрос: "На сколько может команда BREQ и ей подобные скакать?"

З.Ы. Тупо не могу найти информацию или не внимательно смотрю...
Станислав
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18809
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):Тупо не могу найти информацию
странно, в AVRASM.CHM, входящем в комплект Avrstudio 4.1x для каждой подобной команды написано
This instruction branches relatively to PC in either direction (PC - 63 ≤ destination ≤ PC + 64).
т.е. прыгает он не далее 64 однословных команд.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Спасибо, добрый человек! :beer:

З.Ы. Может еще тупость спрошу. Вот есть переменная, т.е. какое-то число в двоичном виде. МК ТИНИ2313, у которого нету деления и умножения, кроме как сдвиг влево/вправо.
Можно ли как-то по быстрому раскидать это число на сотни, десятки и единицы?
Станислав
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

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

; Переделанная под себя программа преобразования от UMUP
; http://electronix.ru/forum/index.php?s=&showtopic=10934&view=findpost&p=324208
; изменил по предложению avreal!!!
; формат старший-младший!!!

	LDS	R17,$70		; HEX IN

	CLR	R30		; BCD OUT 1'000,100
	CLR	R31		; BCD OUT 10,1

	LDI	R28,8
bin8_bcd3:
	subi r31,-0x33	;add 0x33
	sbrs r31, 3	;if carry to bit 3
	subi r31, 3	;subtract 3
	sbrs r31, 7	;if carry to bit 7
	subi r31, 0x30	;subtract 0x30

	subi r30,-0x33      ; \n" /*add 0x33*/
	sbrs r30, 3         ; \n" /*if carry to bit 3,*/
	subi r30, 3         ; \n" /*subtract 3*/
	sbrs r30, 7         ; \n" /*if carry to bit 7,*/
	subi r30, 0x30      ; \n" /*subtract 0x30*/

	LSL R17		;shift input*/

	rol r31
	rol r30		; \n" /*shift out buffer*/

	dec R28		;\n"
	brne bin8_bcd3	;repeat for all bits*/

	MOV	R29,R30	; сотни в R29
	MOV	R30,R31	; десятки и единицы в R30
	SWAP	R30	; десятки в мл. тетраду
	ANDI	R30,$0F	; выделить десятки
	ANDI	R31,$0F	; выделить единицы

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

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

Еще вопросик...
Не работает вот такая штука:

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

; -------- Проверка выхода за приделы занчения ---------------		

		cpi ZUUM, 125 		; Сравниваем с наибольшим
		brsh NORM			; Если больше, то уходим на исправление
		rjmp TT
		NORM: ldi ZUUM, 125	; Исправляем и уходим дальше
		rjmp TT

		cpi ZUUM, -55		; Сравниваем с наименьшим
		brlo NORMM			; Если мньше, то уходим на исправление
		rjmp TT				
		NORMM: ldi ZUUM, -55

			
; -------- Конец проверки ------------------------------------

	TT:
Если закомментировать нижнее сравнение (-55), то все работает для верхнего придела, иначе вообще не хочет работать.
Переменная ZUUM меняется кнопками простой Инкремент и Декремент. Если ушла ниже НУЛЯ, то начинает считать числа в дополнительном коде, что меня устраивает, только как сделать, чтобы не могла считать ниже чем -55?
Станислав
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Если ушла ниже НУЛЯ
применяется команда neg и все как для положительного
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Не совсем понял...
Надо перевести из дополнительного кода? Или просто инвертировать переменную и сравнить ее с.... чем? :oops: :dont_know:

З.Ы. Еще ошибку у себя увидел... Он до сравнения с отрицательным вообще никогда не дойдет... :))) :))) :))) Наисправлялся. :facepalm:
Вот так, вроде надо:

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

cpi ZUUM, 125 		; Сравниваем с наибольшим
		brsh NORM			; Если больше или равно, то уходим на исправление
		cpi ZUUM, -55		; Иначе, Сравниваем с наименьшим
		brlo NORMM			; Если мньше, то уходим на исправление
		rjmp TT				; Иначе выходим вообще

		NORM: ldi ZUUM, 125	; Исправляем и уходим 
		rjmp TT
		NORMM: ldi ZUUM, -55
Станислав
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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

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

Все равно не понимаю... Если ушел ниже нуля, то пошли дополнительные коды, где старший разряд - знак числа (единица - минус). А чтобы перевести его в обычное число надо вычесть единицу, а затем уже инвертировать... А если я его просто инвертирую, то получится какое-то другое число?

З.Ы. Блин, сглючил программатор, залочил МК... :kill: :facepalm: Теперь все разбирать. :cry:

З.З.Ы. Пересобрал. Сделал негатив, потом в двоичном написал, один фиг не хочет работать. :kill:
Станислав
Ответить

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