|
|
  |
Ассемблер AVR |
|
|
|
Jul 11 2012, 19:55
|
Группа: Новичок
Сообщений: 2
Регистрация: 11-07-12
Пользователь №: 72 725

|
Не взыщите но глупых вопросов не бывает. Как на ассемблере расшифровать две следующие записи (точне значки << |). 1. 1<<USIOIF 2.( 1<<USIOIF)|( 1<<USICS1) Заранее спасибо.
|
|
|
|
|
Jul 11 2012, 20:23
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(vvvalarm @ Jul 11 2012, 22:55)  Не взыщите но глупых вопросов не бывает. Понять-то не мудрено: Цитата(vvvalarm @ Jul 11 2012, 22:55)  Не взыщите но глупых вопросов не бывает. Как на ассемблере расшифровать две следующие записи (точне значки << |). 1. 1<<USIOIF Где-нибудь в inc-файле (или каком-другом) определена константа USIOIF. Допустим так: Код .equ USIOIF = 6 1<<USIOIF=1<<USIOIF=единица сдвинутая влево на позиция=0x40=40H=64(dec) Цитата(vvvalarm @ Jul 11 2012, 22:55)  2.( 1<<USIOIF)|( 1<<USICS1) ( 1<<USIOIF)|( 1<<USICS1)=(1 сдвинутая влево на USIOIF позиций) логическое ИЛИ с (1 сдвинутая влево на USICS1 позиций)
|
|
|
|
|
Jul 11 2012, 20:33
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Xenia @ Jul 11 2012, 23:22)  Это не ассемблер, а C Нет, вы не правы: это вполне может быть ассембером. IAR AVR ассемблер вполне поймет такое например: Код andi R16, (1<<2) | (1<<7) также как и #if, #define и тд по списку.
|
|
|
|
|
Jul 11 2012, 21:54
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Xenia @ Jul 11 2012, 23:42)  Ясное дело - из C спёрли.  Унифицыровали, а не сперли. Цитата(Xenia @ Jul 11 2012, 23:42)  А что это за ассемблер? Вы что-нибудь про IAR слышали? Они выпускают такой продукт: IAR Embedded Workbench for Atmel AVR. Ассемблер бесплатно (может уже и не бесплатно), остальное за деньги. Цитата(Xenia @ Jul 11 2012, 23:42)  AVR Studio или какой-еще? Наверняка также у AVR GCC, AVR assembler v2. Как там у ImageCraftow, и прочих codevison-ов не скажу - не знаю.
|
|
|
|
|
Jul 12 2012, 00:30
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 22-05-11
Из: Москва
Пользователь №: 65 195

|
Как раз сейчас осваиваю не спеша ассемблер AVR. Начитавшись умных и глупых книжек, скажу:
Такое широко используется в ассемблере AVR (в частности, в AVR Studio), чтобы установить нужные биты в разных служебных регистрах. А это всегда требуется при инициализации МК или изменении каких-то режимов (включении-выключении прерываний, интерфейсов и пр.) Поскольку точное положение управляющего бита в служебном регистре не запомнить, да еще в разных МК AVR они могут быть в разных местах, то так и делают, например операция (1<<USIOIF)|(1<<USICS1) дает байт с единицами на месте битов USIOF и USICS1, а остальные нули. Осталось записать этот байт в нужный служебный регистр, ну или сделать операцию ИЛИ, если остальные биты трогать не надо.
Теоретически это улучшает читаемость и (что важно) переносимость программы, поэтому активно рекомендуется так делать.
Разумеется, нужно включить командой .INCLUDE файл, соответствующий данному МК (например "M32DEF.INC"), в котором, как уже писали, этим константам соответствуют некоторые числа. Иначе работать не будет.
|
|
|
|
|
Jul 12 2012, 05:58
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (SmarTrunk @ Jul 12 2012, 03:30)  Теоретически это улучшает читаемость ... программы, поэтому активно рекомендуется так делать. А вы попробуйте написать один проект используя только записи вида CODE UCSR0B = 0x98 вместо CODE UCSR0B = (1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02); Я даже не говорю о том, чтобы что-то исправить в этом проекте через неделю - просто дописать его до конца и отладить. Думаю, вы очень быстро поймете, что такая запись улучшает читаемость не теоретически, а практически.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 12 2012, 08:17
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (ILYAUL @ Jul 12 2012, 09:44)  Мне больше "нравится" когда написано так и по всему коду CODE UCSR0B = 0b10011000 И даже в этом случае невозможно понять, что тут происходит, не заглядывая в даташит. А значит нужно отвлекаться, что совсем не способствует сосредоточенному написанию/отладке программы, даже теоретически. А в процессе написания не защищает от ошибок/описок.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 12 2012, 11:16
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(ILYAUL @ Jul 12 2012, 10:44)  Мне больше "нравится" когда написано так и по всему коду UCSR0B = 0b10011000 Э! Мне так тоже нравится.  Я в свое время голову ломала - зачем так вычурно биты определены, что каждый раз при их использовании приходится единицу влево сдвигать? А потом догадалась - это особенность специфических команд AVR, работающих с отдельными битами, типа: sbi PORTA, PINA2 cbi PORTA, PINA2 где в качестве аргумента должен быть указан НОМЕР бита, а не маска. В тех архитектурах, где подобных инструкций нет, битовые константы опредяляют, как маски, а единиц не двигают.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|