Страница 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
СКАЗОЧНИК
Да, вроде как не ненавижу. Просто думал покороче записать. )))
Ладно. Спасибо. )

С организацией памяти и словами у меня все время проблемы... тяжко воспринимается.

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
Во как! Спасибо, не знал, теперь легче жить будет

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
СКАЗОЧНИК
Ага. Спасибо.
Вот так:
Код: Выделить всё
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 на старшей половине? Это надо бы учесть, если имеет смысл.
Прерывания задействованы в программе? В прерывании могут быть изменены биты старшего полубайта в порту? Это я к тому, что может в начале запретить прерывания, а в конце разрешить.
Это вам должно быть видней, в зависимости от программы.

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

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
СКАЗОЧНИК
Блин. Точно!
Как это я сам недопетрил?!
Спасибо.

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