Страница 259 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт авг 25, 2015 21:11:00
BlYur
Здравствуйте.
Помогите, плz, вкурить в такую вот строчку
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
Я знаю, что здесь связано что-то со сдвигами и побитовыми "или"...
Можно ли разжевать на примере?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт авг 25, 2015 21:18:41
НАПАЛМ
RXEN, TXEN, RXCIE, TXCIE, UDRIE - имена битов, за ними скрываются их номера.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт авг 25, 2015 21:33:41
BlYur
НАПАЛМ писал(а):RXEN, TXEN, RXCIE, TXCIE, UDRIE - имена битов, за ними скрываются их номера.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
Тафайте для наглядности заменим RXEN на какой-нибудь номер бита.
Тогда что же грузится в регистр R16?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт авг 25, 2015 21:39:18
НАПАЛМ
ldi r16, (1<<7)|(1<<1)
В r16 загрузится 0b10000010
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт авг 25, 2015 22:08:56
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, и т.д
А вот с минусом , что-то я затупил не по детски. Кто хочет поразмять мозг?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср авг 26, 2015 05:11:24
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.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср авг 26, 2015 05:53:49
WiseLord
То, что 0<<N всегда равно нулю, не означает, что выражение это лишено смысла. Смысл в том, что в подобном выражении мы видим все необходимые биты регистра и их значения, а также в том, что такая запись легко редактируется.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср авг 26, 2015 10:05:06
BOB51
Зато прекрасно можно на "медвежачу помощ" нарваться.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср авг 26, 2015 11:05:40
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) */
действительно становится опасной и может сослужить медвежью услугу.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср авг 26, 2015 11:19:47
ARV
спорщики, посмотрите на мою подпись

самое простое решение, ведущее к нужному результату, и будет самым правильным

сдвиг нуля - лишнее, ибо усложняет, ничего не давая взамен.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср авг 26, 2015 20:59:40
ILYAUL
Кто хочет поразмять мозг?
Таки сделал

Теперь у меня два счетчика BCD в
+ и
-
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 03, 2015 20:43:22
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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 03, 2015 23:59:11
baghear
Бутлоудер нужен для заливки программы в микроконтроллер без программатора, по сути бутлоудер это программа располагающаяся по опр адресу. Когда Вы прыгните по адресу в котором должен находиться бутлоудер, если он там есть Вы сможете с помощью специальной программы связаться с МК и передать ему прошивку которую хотите залить в МК.
После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера
Нет, таблица располагается по определенному адресу и перенести её нельзя, вернее будет сказать, что вектора прерываний имеют фиксированный адрес.
те нужно пользоваться 2-я независимыми таблицами прерываний, это возможно?
Нет, таблица всего одна.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 04, 2015 07:07:07
BOB51
Положение бутлоадера и его размер а также положение адреса исполняемого вектора сброса (reset) у АВР определяется фузами и не может быть переопределено программой по ходу ее выполнения.
А вот положение адресов таблицы исполняемых векторов прерываний вполне можно переопределить программой "на лету".
(Выполняется не в каждом из МК - требуется почитывать даташиты на наличие как команды SPM, так и соответствующих средств для работы с загрузчиком).
Однако...
При выборе областей размещения следует также учитывать деление ПЗУ на области the Read-While-Write (RWW) section and the No Read-While-Write (NRWW) section и их соответствующие различия.
Дополнительно... никто не мешает вместо целевого вектора подставит указатель (да еще и "по условию") для перехода в другую заранее определенную зону "общей совместимости".

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 04, 2015 07:16:59
bob1
Kill17 писал(а): После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера, а после выхода из бутлоадера, я могу переключится на таблицу прерываний находящуюся в основной программе?
Да. Изменением бита IVSEL в регистре MCUCR для данного камня. Устанавливаете бит IVCE в "1" и затем в течении 4 тактов нужно занести нужное значение в IVSEL.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 04, 2015 08:00:06
Kill17
Что-то Вы меня запутали
Атмега зашита на старт из бутлоадера. Я хочу использовать прерывания в бутлоадере, а после выхода из бутлоадера и перехода на адрес $0000, я хочу пользоваться прерываниями в основной программе, но своими (не зависящими от прерываний в бутлоадере). Это возможно?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 04, 2015 08:53:15
bob1
Стартуете с бутлоадера. Устанавливаете IVSEL=1. Вектора прерываний в загрузчике. Когда перейдете на адрес $0000, то установите IVSEL=0. Вектора прерываний в основной проге.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 04, 2015 19:17:54
Kill17
Спасибо! Все получилось!

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 10, 2015 19:59:31
СКАЗОЧНИК
ААааа....
Коты! Кто подскажет, как обрезать в ассемблере переменную по маске? Тупо надо сбросить старшие 4 бита в переменной.
Помню, что раньше делал как-то (ANDI что ли), но забыл, а время 2 ночи, уже туплю...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 10, 2015 20:08:12
ILYAUL
andi temp,0x0F