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

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

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

Сообщение neoneon »

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

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

Сообщение neoneon »

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

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

Сообщение akl »

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

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

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

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

Сообщение neoneon »

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

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

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

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

Сообщение akl »

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

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

Сообщение neoneon »

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

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

Сообщение zero648 »

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

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

Сообщение ILYAUL »

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

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

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

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

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

Сообщение ILYAUL »

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

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

Сообщение Jack_A »

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

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

Сообщение ILYAUL »

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

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

Сообщение Petr_Vas »

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

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

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

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

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

Особо вариантов не много. Либо сначала читать состояние порта, потом накладывать маску, изменять нужные, а остальные возвращать обратно и все это опять выводить в порт. Либо отдельно каждым пином управлять. :)
Если хочется примеры программ, то вот моя реализация второго варианта (там найдете, где объявлены линии порта, так и вывод в порт(ы)):
http://radiokot.ru/forum/viewtopic.php? ... 8#p2254028
И у ДИ-Халта на сайте тоже есть описание его библиотеки подобной, там сделано по первому варианту работы с портом.

И еще, несколько страниц назад, вроде описывали это уже.
и если лень будет ковырять мою писинину, то вот:

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

DB_LINE:							; Выводим тетраду в линии дисплея
				rcall OUT_PORT                 ; Делает пины, которые используются на ВЫХОД и обнуляет их... 
				
				sbrc 	R18, 4 			; Пропустить слудующую, еслли бит сброшен
				sbi		DB4port, DB4pin	; Ставим бит
				sbrc 	R18, 5 			; Пропустить слудующую, еслли бит сброшен
				sbi		DB5port, DB5pin	; Ставим бит
				sbrc 	R18, 6 			; Пропустить слудующую, еслли бит сброшен
				sbi		DB6port, DB6pin	; Ставим бит
				sbrc 	R18, 7 			; Пропустить слудующую, еслли бит сброшен
				sbi		DB7port, DB7pin	; Ставим бит			
	ret
Станислав
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Petr_Vas писал(а):Необходимо выводить по команде 4 бита только на

1-е устройство, не затрагивая остальные 4 бита, как реализовать?
Почитай у Ди-Хальта сталью про виртуальные порты. Под твою задачу - само то.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Petr_Vas
Родился
Сообщения: 2
Зарегистрирован: Пн фев 09, 2015 15:55:41
Откуда: Липецк

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

Сообщение Petr_Vas »

СКАЗОЧНИК
Seriyvolk
Спасибо за ответы! Буду вкуривать.
Аватара пользователя
neoneon
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср окт 22, 2014 07:39:26
Откуда: Омск

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

Сообщение neoneon »

Здравствуйте :) Задача была - на ATtiny13 собрать устройство, которое включало бы светодиод на 3 минуты. Т.к. требовалось сильное энергосбережение - всё сделал на на прерываниях и сне :) Но дебаггер (avr studio 4) ругается на переполнение стека, как и протеус. В общем, суть программы на псевдокоде такая:
Спойлер

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

$000 nach (переход при сбросе\включении питания)
$001 knopka (при наличии 0 на входе INT0)
$003 timer (переполнение таймера\счетчика)

nach:
       sei
       разрешение прерыв. от Int0
       rjmp start
Knopka:
       запрет прерыв. от Int0
       sei
       разрешение прерыв. от переполнения
       разрешение idle mode
       rjmp bla
Timer:
       sei
       inc REG
       _проверка REG на совпадение с некоторым числом(для формирования задержки)
       если REG<числа, то rjmp bla
       иначе
       запрет прерыв. по переполнению
       разрешение прерыв. от Int0
       sei
       rjmp start
Start:
       разрешение Power-down
       sleep
       rjmp start
Bla:
      sleep (был разрешен Idle mode)
      rjmp bla
Для полного понимания - вся прога:
Спойлер

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

.device		ATtiny13
.nolist
.include	"C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc"
.list

.def	temp=r16;
.def	srl=r17;
.def	srh=r18;

.cseg						
						
.org	$000
rjmp nach					; (reset)

.org	$001					
rjmp	Knopka				; 

.org    $002
reti

.org	$003				
rjmp	timer				; Timer\counter overflow				

Nach:
	ldi		temp, low(ramend);
	out		spl,temp
	ldi		temp,0x80		; выкл. комп.
	out 	ACSR,temp		; 

	ldi		temp,0b11111111 ; 
	out		DDRB,temp		; 
	ldi		temp,0b00000011	; 
	out		PortB, temp		;

	sei						;
	ldi		temp,0b01000000	;раз. прер. от Int0
	out		GIMSK, temp		;

	rjmp 	start
; =========

Knopka:
	ldi		temp,0b00000000	; запрещ прер INT0
	out		GIMSK, temp		;

	ldi		temp,0b00000010	;вкл LED
	out		PortB, temp		;

	ldi		temp,0b00100000	; разр. sleep, idle 
	out		MCUCR, temp		;

	sei						; 

	ldi		zh,$00	; вводим числа, с которыми будет сравниваться т.н. REG
	ldi		zl,$02	;

	ldi		temp,0b00000010 ;
	out		TIMSK0, temp	;разр прер по переполнению

	ldi		temp,0b00000001 ;		
	out		TCCR0B,temp		; clk/1024

	ldi		srL, $00		
	ldi		srH, $00
	rjmp 	bla				
Timer: ;проверка
	inc		srL
	brvc 	PC+3			;
	inc		srh
	clr		srl

	sei						;
	cp		srh, zh			;
	brlo	bla				; 
	cp		srl,zl			;
	brlo	bla				; 
	;проверку прошел
	ldi		temp,0b00000011	; выкл LED
	out		PortB, temp		;

	ldi		temp,0b00000000 ;
	out		TIMSK0, temp	; запр прер по переполнениню


	ldi		temp,0b01000000	; разр прерыв INT0
	out		GIMSK, temp		;	

	rjmp start;
; =========
Start:
	ldi		temp,0b00110000	; sleep, Power-down, проснется от 0 на Int0
	out		MCUCR, temp		;
	sleep
	nop;
	rjmp start
Bla:						
	sleep;
	rjmp bla
.exit
тут схемка
Спойлер[url=http://img.radiokot.ru/files/100717/medium/kqb7q9qmr.PNG]
Есть мысль, что это из-за прерывания в прерывании, но не более того :dont_know: В дебаггере работает верно, если не считать ошибки переполнения стека :dont_know:
Полный чайник.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

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

Сообщение neoneon »

ChipKiller писал(а):.. а где в обработчиках reti?
В обработчике Timer его нет, да. Если поставить reti, то после окончания задержки возвращается на bla...поэтому поставил rjmp start, а перед ним sei. Просто здесь sei еще не дописал :) Прерывание в прерывании, поэтому в конце два раза писать reti? О__о
Полный чайник.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия
Ответить

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