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

 
 
> Вопрос по С по AVR
impuls-v
сообщение Feb 12 2006, 01:54
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Извиняюсь сразу может вопрос показаться глупым. Просто всегда программировал ни ASM а теперь понадобилось перейти на С. Не могу понять что означает запись !( UCSRA & (1<<UDRE)),
а точнее 1<<UDRE ведь << это сдвиг регистра влево, поэтому и непонятно. А тупо использовать без понимания процесса не мой стиль.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Feb 12 2006, 06:08
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(impuls-v @ Feb 12 2006, 03:54) *
!( UCSRA & (1<<UDRE)),

эта запись обозначает - проинвертировать значение байта прочитанного из UCSRA из которого выделен только бит UDRE.

Цитата
а точнее 1<<UDRE ведь << это сдвиг регистра влево

не регистра, а 1 на некоторое число UDRE. UDRE - константа, которая соответствует позиции бита UDRE в регистре UCSRA.

Сообщение отредактировал defunct - Feb 12 2006, 07:05
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Feb 12 2006, 10:28
Сообщение #3


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата(defunct @ Feb 12 2006, 08:08) *
Цитата(impuls-v @ Feb 12 2006, 03:54) *

!( UCSRA & (1<<UDRE)),

эта запись обозначает - проинвертировать значение байта прочитанного из UCSRA из которого выделен только бит UDRE.

Цитата
а точнее 1<<UDRE ведь << это сдвиг регистра влево

не регистра, а 1 на некоторое число UDRE. UDRE - константа, которая соответствует позиции бита UDRE в регистре UCSRA.

! - логическое НЕ, а не побитовое, т.е. значит "инвертировать логическое значение выражения ( UCSRA & (1<<UDRE))" , что в свою очередь определяется умолчанием, принятым в С для результатов выражений при использовании их как логическое значение - "всё, что не ноль есть единица", точнее TRUE. Не во всех языках такое умолчание есть.
Далее UDRE - не просто число, а действительно позиция (по сути номер бита в байте), т.е. (1<<UDRE) обозначает получить маску для сравнения нужного бита в байте. Производится сдвиг левой части (в данном случае 1, но может вполне быть что-то другоеwink.gif на число, указанное в правой части (UDRE), а не наоборот. Помнится, что в ATmega128 UDRE0 5-й (от 0 до 7) бит в байте UCSR0A, соответственно (1<<UDRE) эквивалентно (1<<5), эквивалентно (0x01<<5), эквивалентно 0x20 (00100000). Соответственно проверка значения регистра на флаг осуществляется путём наложения маски на его значение (побитовое И - зануление всех "ненужных" битов), т.е. UCSRA0 & 0x20 даст число отличное от нуля (а именно 0x20) при установленном 5-м бите (UDRE0), иначе будет нуль. 0 - FALSE, 0x20 - TRUE, соответственно !(FALSE) будет эквивалентно TRUE, и наоборот - !(TRUE) эквивалентно FALSE.
Т.е. запись !( UCSRA & (1<<UDRE)) обозначает "не установлен бит UDRE в байте UCSRA".


--------------------
aka Vit
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 08:06
Рейтинг@Mail.ru


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