Страница 276 из 400

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

Добавлено: Сб июн 04, 2016 17:17:04
Demiurg
call, jmp, lds, sts - занимают по 2 слова. Открываете даташит, смотрите список всех команд. Там указано, за сколько тактов и сколько занимает каждая команда.

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

ldi r16, 55
out PORTD, r16

Label:
in r16, PINC
sts VAL, r16

sbic PINA,0
rjmp PC-3

rjmp Label // В этом случае никаких ошибок не будет.
В этому случае будет ошибка, так как sts занимает 2 слова. Потому нужно применять метки, даже если ты их ненавидишь. Просто в корне исключает ошибки.

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

Добавлено: Сб июн 04, 2016 17:20:55
СКАЗОЧНИК
Да, вроде как не ненавижу. Просто думал покороче записать. )))
Ладно. Спасибо. ) :beer: С организацией памяти и словами у меня все время проблемы... тяжко воспринимается. :)

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

Добавлено: Сб июн 04, 2016 17:54:49
dgrett
Вот где-то видел про использование меток в макросах. Это возможно в принципе или это бред? Пока в макросах использую PC, к счастью не нарвался на двухсловные инструкции. Буду иметь ввиду.

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

Добавлено: Сб июн 04, 2016 17:56:34
Demiurg
Метки спокойно можно использовать. И они будут уникальны для каждого макроса, хотя название одно и то же. Другое дело, если вы используете метки на подпрограммы вне макроса.

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

Добавлено: Сб июн 04, 2016 17:59:56
dgrett
Во как! Спасибо, не знал, теперь легче жить будет :beer:

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

Добавлено: Пн июн 06, 2016 16:47:15
СКАЗОЧНИК
Очередной тупой вопрос.

Есть переменная, у которой старший полубайт нули, а младший полубайт имеет некое значение.
Теперь надо вывести эту переменную в порт, но так, чтобы старший полубайт в порту остался не тронутый, а младший изменился в соответствии с младшим этой переменной.
Как это правильно сделать?

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

Добавлено: Пн июн 06, 2016 16:51:42
dr.doc
Переменная в r17
in r16,Portx
andi r16,0xF0
ori r16,r17
out Portx,r16

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

Добавлено: Пн июн 06, 2016 16:55:18
dgrett
Компилер,наверно, матюкнётся на ori

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

Добавлено: Пн июн 06, 2016 16:56:19
dr.doc
Инерция, эйфория...

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

Добавлено: Пн июн 06, 2016 16:57:20
СКАЗОЧНИК
Ага. Спасибо. :beer:

Вот так:

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

in temp1,PIND
andi temp1,0xF0
or temp1,temp
out PORTD,temp1	

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

Добавлено: Пн июн 06, 2016 18:42:58
Demiurg

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

in temp1,PIND
andi temp1,0xF0
andi temp, 0x0F
or temp1,temp
out PORTD,temp1

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

Добавлено: Пн июн 06, 2016 18:56:10
Z_h_e
Demiurg писал(а):andi temp, 0x0F
СКАЗОЧНИК писал(а):Есть переменная, у которой старший полубайт нули, а младший полубайт имеет некое значение.

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

Добавлено: Пн июн 06, 2016 19:23:32
Kavka
СКАЗОЧНИК, а порт весь на вывод настроен? Или есть пины на вход? Не собьётся ли "подтяжка" в PORTx на старшей половине? Это надо бы учесть, если имеет смысл.
Прерывания задействованы в программе? В прерывании могут быть изменены биты старшего полубайта в порту? Это я к тому, что может в начале запретить прерывания, а в конце разрешить.
Это вам должно быть видней, в зависимости от программы.

:tea:

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

Добавлено: Пн июн 06, 2016 19:52:55
СКАЗОЧНИК
И прерывания есть и порт вход/выход настроен. Как и сказали. :)
Однако, в старшем полубайте входы и на них кнопки (подтяжки), которые в прерывании опрашиваются.
А вторая младшая половина настроена на выход, которая тоже меняется в том же прерывании...

Почему я и хотел, чтобы старшая половина была без изменений, когда младшая перезаписывается. :roll:

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

Добавлено: Пн июн 06, 2016 19:56:23
Z_h_e
Тогда in temp1,PIND не стоит использовать, используйте in temp1,PORTD. А то будете включать выключать подтяжку в зависимости от нажатия кнопок.

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

Добавлено: Пн июн 06, 2016 19:57:50
СКАЗОЧНИК
Блин. Точно! :facepalm: :? :shock:
Как это я сам недопетрил?!

Спасибо.
:beer:

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

Добавлено: Пн июн 06, 2016 20:13:17
Demiurg
Z_h_e писал(а):Тогда in temp1,PIND не стоит использовать, используйте in temp1,PORTD. А то будете включать выключать подтяжку в зависимости от нажатия кнопок.
И я сразу не обратил внимание. Устал, тупо скопировал, добавил и отправил.
На самом деле не так уж и ошибочно. PINx - физическое состояние порта. PORTx - что выводится в порт. За счет PINx можно следить за КЗ портов на питание.

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

Добавлено: Пн июн 06, 2016 20:26:41
dr.doc
А если используется АЦП на этом порту? Иногда подтяжку лучше включить отдельно, перед опросом кнопок.

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

Добавлено: Пн июн 06, 2016 20:34:10
Z_h_e
Если есть свободный регистр и старшая половина порта неизменна, то код можно сократить на одну команду.

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

//Переменная в r17
//R16 в старшем полубайте старший полубайт порта

andi r16,0xF0
or r16,r17
out PortD,r16

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

Добавлено: Вт июн 07, 2016 04:43:28
akl
Как вариант

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

.def	R_KEY=R2
.def	R_OUT=R1

ISR_Y:
; В R_OUT предварительно подготовленные данные x
	OUT	PORTB,R_OUT	; R_OUT=0b1111xxxx 
	IN	R_KEY,PINB	; приём данных с кнопок
;*****
;*****
;*****
	RETI