реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Ассемблер AVR
vvvalarm
сообщение Jul 11 2012, 19:55
Сообщение #1





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



Не взыщите но глупых вопросов не бывает.
Как на ассемблере расшифровать две следующие записи (точне значки << |).
1. 1<<USIOIF
2.( 1<<USIOIF)|( 1<<USICS1)
Заранее спасибо.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 11 2012, 20:22
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Вот
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 11 2012, 20:22
Сообщение #3


Гуру
******

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



Это не ассемблер, а C. Сдвиг единички влево на указанное число разрядов, где USIOIF, USICS1 и др. - номера битов (начиная с 0), определенные в каком-то из хидеров.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 11 2012, 20:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 позиций)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 11 2012, 20:27
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Xenia @ Jul 12 2012, 00:22) *
Это не ассемблер, это C.

Не совсем верно , в asm такое на каждом шаге


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 11 2012, 20:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Xenia @ Jul 11 2012, 23:22) *
Это не ассемблер, а C

Нет, вы не правы: это вполне может быть ассембером. IAR AVR ассемблер вполне поймет такое например:
Код
andi R16, (1<<2) | (1<<7)

также как и #if, #define и тд по списку.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 11 2012, 20:42
Сообщение #7


Гуру
******

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



Цитата(_Артём_ @ Jul 12 2012, 00:33) *
Нет, вы не правы: это вполне может быть ассембером. IAR AVR ассемблер вполне поймет такое например:
andi R16, (1<<2) | (1<<7)
также как и #if, #define и тд по списку.


Ясное дело - из C спёрли. sm.gif
А что это за ассемблер? AVR Studio или какой-еще?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 11 2012, 21:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Xenia @ Jul 11 2012, 23:42) *
Ясное дело - из C спёрли. sm.gif

Унифицыровали, а не сперли.

Цитата(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-ов не скажу - не знаю.
Go to the top of the page
 
+Quote Post
V_G
сообщение Jul 11 2012, 23:00
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Xenia @ Jul 12 2012, 06:42) *
Ясное дело - из C спёрли. sm.gif
А что это за ассемблер? AVR Studio или какой-еще?

Да, в AVRAssembler 2 уже много Си-подобных директив. В 3 версию, наверно, половина Си перекочует
Go to the top of the page
 
+Quote Post
SmarTrunk
сообщение Jul 12 2012, 00:30
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 22-05-11
Из: Москва
Пользователь №: 65 195



Как раз сейчас осваиваю не спеша ассемблер AVR. Начитавшись умных и глупых книжек, скажу:

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

Теоретически это улучшает читаемость и (что важно) переносимость программы, поэтому активно рекомендуется так делать.

Разумеется, нужно включить командой .INCLUDE файл, соответствующий данному МК (например "M32DEF.INC"), в котором, как уже писали, этим константам соответствуют некоторые числа. Иначе работать не будет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2012, 05:58
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 12 2012, 06:44
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Мне больше "нравится" когда написано так и по всему коду
Код
UCSR0B = 0b10011000


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2012, 08:17
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 12 2012, 09:27
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Так слово нравится я написал в ковычках - т.е как один из примеров , что хоть и можно так , но лучше не надо


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 12 2012, 11:16
Сообщение #15


Гуру
******

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



Цитата(ILYAUL @ Jul 12 2012, 10:44) *
Мне больше "нравится" когда написано так и по всему коду
UCSR0B = 0b10011000


Э! Мне так тоже нравится. sm.gif Я в свое время голову ломала - зачем так вычурно биты определены, что каждый раз при их использовании приходится единицу влево сдвигать? А потом догадалась - это особенность специфических команд AVR, работающих с отдельными битами, типа:
sbi PORTA, PINA2
cbi PORTA, PINA2
где в качестве аргумента должен быть указан НОМЕР бита, а не маска.
В тех архитектурах, где подобных инструкций нет, битовые константы опредяляют, как маски, а единиц не двигают.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016