Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте.
Помогите, плz, вкурить в такую вот строчку
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
Я знаю, что здесь связано что-то со сдвигами и побитовыми "или"...
Можно ли разжевать на примере?
Помогите, плz, вкурить в такую вот строчку
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
Я знаю, что здесь связано что-то со сдвигами и побитовыми "или"...
Можно ли разжевать на примере?
- Реклама
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: Ассемблер (ASM) для AVR в вопросах и ответах
RXEN, TXEN, RXCIE, TXCIE, UDRIE - имена битов, за ними скрываются их номера.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тафайте для наглядности заменим RXEN на какой-нибудь номер бита.НАПАЛМ писал(а):RXEN, TXEN, RXCIE, TXCIE, UDRIE - имена битов, за ними скрываются их номера.
(1<<RXEN) - это означает, что бит под номером RXEN будет установлен в 1. Все остальные биты, которые не прописаны у вас, или прописаны с нулями, будут установлены в 0.
Тогда что же грузится в регистр R16?
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ldi r16, (1<<7)|(1<<1)
В r16 загрузится 0b10000010
В r16 загрузится 0b10000010
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот эта штука , в упрощённом слеганца виде , меняет установку часов и прочего от DS1307 и последующего семейства RTC. Естественно не прибегая к дурным преобразованиям BCD->HEX->BCD
В реале она конечно по другому выглядит , просто скомпилил под симулятор
Это если увеличивать 1,2, 3, и т.д
А вот с минусом , что-то я затупил не по детски. Кто хочет поразмять мозг?
В реале она конечно по другому выглядит , просто скомпилил под симулятор
Код: Выделить всё
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
А вот с минусом , что-то я затупил не по детски. Кто хочет поразмять мозг?
Последний раз редактировалось ILYAUL Ср авг 26, 2015 20:55:34, всего редактировалось 1 раз.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В части 0<<N выражение лишено смысла, так как исходно значение берется равным 0. Таким способом можно устанавливать единицы в заданном разряде или "оптом" сбросить всё содержимое в 0 если будет присутствовать всего один элемент вида 0<<N.BlYur писал(а):
LDI R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
К примеру:
LDI R16, (0<<RXEN)
загрузит в R16 0х00.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
То, что 0<<N всегда равно нулю, не означает, что выражение это лишено смысла. Смысл в том, что в подобном выражении мы видим все необходимые биты регистра и их значения, а также в том, что такая запись легко редактируется.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Зато прекрасно можно на "медвежачу помощ" нарваться.

- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В данном использовании (прямое присваивание) - ничуть.
В C, например:Безопасно и понятно, и выглядит лучше чем TCCR0 = (1<<CS01), например. Но вот запись (модификация) типа
действительно становится опасной и может сослужить медвежью услугу.
В C, например:
Код: Выделить всё
TCCR0 = (0<<CS02) | (1<<CS01) | (0<<CS00); /* Set timer prescaller to 8 (2MHz) */Код: Выделить всё
TCCR0 |= (0<<CS02) | (1<<CS01) | (0<<CS00); /* Set timer prescaller to 8 (2MHz) */- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
спорщики, посмотрите на мою подпись
самое простое решение, ведущее к нужному результату, и будет самым правильным 
сдвиг нуля - лишнее, ибо усложняет, ничего не давая взамен.
сдвиг нуля - лишнее, ибо усложняет, ничего не давая взамен.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Кто хочет поразмять мозг?
Таки сделал
- Kill17
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 30, 2010 20:27:33
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Люди добрые, помогите советом!
Атмега168, алгоритм работы такой - входим в Bootloader - по выходу идем в основную программу.
Вопрос в следующем. После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера, а после выхода из бутлоадера, я могу переключится на таблицу прерываний находящуюся в основной программе? те нужно пользоваться 2-я независимыми таблицами прерываний, это возможно? Если да, то перенос векторов функцией -
Атмега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 в вопросах и ответах
Бутлоудер нужен для заливки программы в микроконтроллер без программатора, по сути бутлоудер это программа располагающаяся по опр адресу. Когда Вы прыгните по адресу в котором должен находиться бутлоудер, если он там есть Вы сможете с помощью специальной программы связаться с МК и передать ему прошивку которую хотите залить в МК.
Нет, таблица располагается по определенному адресу и перенести её нельзя, вернее будет сказать, что вектора прерываний имеют фиксированный адрес.После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера
Нет, таблица всего одна.те нужно пользоваться 2-я независимыми таблицами прерываний, это возможно?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Положение бутлоадера и его размер а также положение адреса исполняемого вектора сброса (reset) у АВР определяется фузами и не может быть переопределено программой по ходу ее выполнения.
А вот положение адресов таблицы исполняемых векторов прерываний вполне можно переопределить программой "на лету".
(Выполняется не в каждом из МК - требуется почитывать даташиты на наличие как команды SPM, так и соответствующих средств для работы с загрузчиком).
Однако...
При выборе областей размещения следует также учитывать деление ПЗУ на области the Read-While-Write (RWW) section and the No Read-While-Write (NRWW) section и их соответствующие различия.
Дополнительно... никто не мешает вместо целевого вектора подставит указатель (да еще и "по условию") для перехода в другую заранее определенную зону "общей совместимости".

А вот положение адресов таблицы исполняемых векторов прерываний вполне можно переопределить программой "на лету".
(Выполняется не в каждом из МК - требуется почитывать даташиты на наличие как команды SPM, так и соответствующих средств для работы с загрузчиком).
Однако...
При выборе областей размещения следует также учитывать деление ПЗУ на области the Read-While-Write (RWW) section and the No Read-While-Write (NRWW) section и их соответствующие различия.
Дополнительно... никто не мешает вместо целевого вектора подставит указатель (да еще и "по условию") для перехода в другую заранее определенную зону "общей совместимости".
-
bob1
- Мучитель микросхем
- Сообщения: 453
- Зарегистрирован: Ср июн 08, 2011 20:25:20
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да. Изменением бита IVSEL в регистре MCUCR для данного камня. Устанавливаете бит IVCE в "1" и затем в течении 4 тактов нужно занести нужное значение в IVSEL.Kill17 писал(а): После попадания в BOOTLOADER я могу перенести таблицу прерывания в область Бутлоадера, а после выхода из бутлоадера, я могу переключится на таблицу прерываний находящуюся в основной программе?
- Kill17
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 30, 2010 20:27:33
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Что-то Вы меня запутали
Атмега зашита на старт из бутлоадера. Я хочу использовать прерывания в бутлоадере, а после выхода из бутлоадера и перехода на адрес $0000, я хочу пользоваться прерываниями в основной программе, но своими (не зависящими от прерываний в бутлоадере). Это возможно?
Атмега зашита на старт из бутлоадера. Я хочу использовать прерывания в бутлоадере, а после выхода из бутлоадера и перехода на адрес $0000, я хочу пользоваться прерываниями в основной программе, но своими (не зависящими от прерываний в бутлоадере). Это возможно?
-
bob1
- Мучитель микросхем
- Сообщения: 453
- Зарегистрирован: Ср июн 08, 2011 20:25:20
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Стартуете с бутлоадера. Устанавливаете IVSEL=1. Вектора прерываний в загрузчике. Когда перейдете на адрес $0000, то установите IVSEL=0. Вектора прерываний в основной проге.
- Kill17
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Вс май 30, 2010 20:27:33
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо! Все получилось! 
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ААааа....
Коты! Кто подскажет, как обрезать в ассемблере переменную по маске? Тупо надо сбросить старшие 4 бита в переменной.
Помню, что раньше делал как-то (ANDI что ли), но забыл, а время 2 ночи, уже туплю...
Коты! Кто подскажет, как обрезать в ассемблере переменную по маске? Тупо надо сбросить старшие 4 бита в переменной.
Помню, что раньше делал как-то (ANDI что ли), но забыл, а время 2 ночи, уже туплю...
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
andi temp,0x0F


