Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Условие оператора If - непонятка

Непрочитано 30.12.2018, 19:04  
rexdn
Прописка
 
Регистрация: 20.10.2008
Сообщений: 103
Сказал спасибо: 95
Сказали Спасибо 25 раз(а) в 18 сообщении(ях)
rexdn на пути к лучшему
По умолчанию Условие оператора If - непонятка

Привет всем. Не ругайтесь если чушь, но не понимаю я.
есть 74164 (сдвиговый рег. пишется и сдвигается по фронту) вход - ножка DATA_REG, Clk - CLK_REG
анализирую переменную Temp и побитово выталкиваю в 74164. старшим битом вперед.
----цикл, который заработал -----------------------------------------
for (i=8; i›=1 ; i--)
{
if (Temp & (1‹‹(i-1))) DATA_REG=1;
else DATA_REG=0;
delay_ms(100);CLK_REG=1; delay_ms(100); CLK_REG=0; delay_ms(100);
}
----цикл, который НЕ заработал -----------------------------------------
for (i=8; i›=1 ; i--)
{
if ((Temp & (1‹‹(i-1))) == 1‹‹(i-1)) DATA_REG=1;
else DATA_REG=0;
delay_ms(100);CLK_REG=1; delay_ms(100); CLK_REG=0; delay_ms(100);
}

Собственно непонятно значение выражения (Temp & (1‹‹(i-1))).
Символ & - побитовое И, и результат выражения никак не может 1 или 0
Поэтому изначально был написана проверка на равенство. но не заработало.
И да, проверено в железе, на ATTiny13.
Реклама:

Последний раз редактировалось rexdn; 30.12.2018 в 19:06.
rexdn вне форума  
Непрочитано 30.12.2018, 19:56  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 409
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Сообщение от rexdn Посмотреть сообщение
и результат выражения никак не может 1 или 0
- как это не может быть? Все зависит от битов в Temp.
(Temp & (1‹‹(i-1))) - Берем i - от 1 до 8, отнимаем 1, получаем i = 0...7 - значения(номера) битов в байте справа налево. Теперь сдвигаем 1 на это число бит(от 0 до 7). И дальше накладываем эту 1 сверху на регистр Temp оператором & - поразрядное И, если там была 1, то и на выходе будет 1 и условие if даст 1. Иначе, если там 0, то и условие сработает по 0(ветка else). Так понятно?
Signalshik2 вне форума  
Непрочитано 30.12.2018, 20:07  
rexdn
Прописка
 
Регистрация: 20.10.2008
Сообщений: 103
Сказал спасибо: 95
Сказали Спасибо 25 раз(а) в 18 сообщении(ях)
rexdn на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Не совсем.
Предположим Temp=0b0100 0000, сдвинутая единица, скажем, будет давать число, равное Temp и поразрядное! И двух значений будет равно Temp - т.е. 64, но ни как не 1 или 0.
Как в If в таком случае, выполняется условие? Не доезжает голова моя что то...

Последний раз редактировалось rexdn; 30.12.2018 в 20:15.
rexdn вне форума  
Непрочитано 30.12.2018, 21:05  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Будет либо истина либо ложь, true или false и не важно 64 там или 32 это все равно true или просто 1, если ложь это просто 0
realid вне форума  
Непрочитано 30.12.2018, 21:40  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 409
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Сообщение от rexdn Посмотреть сообщение
Как в If в таком случае, выполняется условие? Не доезжает голова моя что то...
- вот недоезжает - это точно. if смотрит, есть ли какое-нибудь число отличное от нуля - это будет воспринято за true или точнее за 1.Т.е. неважно что там будет: хоть 64, хоть что - 1 сдвинутая на любое число бит. А 0 будет воспринято за false.
- Так понятно?
А что это Вы, Rexdn, говорите, что 2-ой код не работает - все работает:
Код:
#include ‹iostream›
using namespace std;

int main()
{
	//Your code goes here
	int i;
	unsigned char Temp = 0x55;
	
	for(i=8; i›=1 ; i--) 
	{
		if((Temp & (1‹‹(i-1))) == 1‹‹(i-1))
		  cout ‹‹ "DATA_REG = 1\n";
		else
		  cout ‹‹ "DATA_REG = 0\n";
	}
	return 0;
}
https://ideone.com/IQhwDS

Последний раз редактировалось Signalshik2; 30.12.2018 в 21:51. Причина: Добавил фразу.
Signalshik2 вне форума  
Непрочитано 31.12.2018, 01:19  
j-Roger
Гражданин KAZUS.RUN
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 839
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Выдать байт, используя ногодрыг , без лишних операций сдвига:

PHP код:
void SendByte(uint8_t value){
    uint8_t bit_counter = 8;

    do
    {
        if (value & (uint8_t)0x80)
            DATA_PIN_HIGH(); // высокий уровень
        else
            DATA_PIN_LOW();  // низкий уровень

        value ‹‹= 1;
        CLK_PIN_PULSE();     // строб
    } while(--bit_counter); 
j-Roger вне форума  
Сказали "Спасибо" j-Roger
-vitalik- (02.01.2019)
Непрочитано 31.12.2018, 07:28  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,858
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

rexdn, а привлечь классику блок-схем?
В общем случае есть последовательность байт для передачи по синхронному последовательному интерфейсу.
Выбирается нужный порядок согласно логике передачи.
Для каждого байта производится сравнение по маске на наличие 0/1 в нужной позиции и результат выводится на выход данных с периодом синхронного изменения состояния на выходе CLK.
Если использованный (кстати немного избыточный по коду) механизм вызывает вопросы, то проинициализируйте unsigned char переменную перед циклом (= 0b10000000 или 0b00000001) и сдвигайте ее в нужном направлении после выполнения проверки результата И с байтом данных для передачи.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 31.12.2018 в 13:23.
mike-y-k вне форума  
Непрочитано 31.12.2018, 11:29  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 409
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Сообщение от j-Roger Посмотреть сообщение
Выдать байт, используя ногодрыг, без лишних операций сдвига:
- там есть сдвиг.
Автор темы, Вы просто используйте 1-ый код и все - хороший код.
Signalshik2 вне форума  
Непрочитано 31.12.2018, 15:50  
j-Roger
Гражданин KAZUS.RUN
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 839
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
j-Roger на пути к лучшему
Стрелка Re: Условие оператора If - непонятка

Сдвиг, конечно, есть, как же без него. Но нет лишних сдвигов, которые можно выкинуть,
если вращать сам байт данных, а не вычислять каждый раз новую маску, причем дважды -
каждое выражение 1‹‹(i-1) разворачивается в свой цикл.

Если нужно выдать байт, начиная с младшего бита, меняем:
PHP код:
  ...
   if (value & (uint8_t)0x80)
   ...
   value ‹‹= 1;
   ... 
на

PHP код:
   ...
   if (value & (uint8_t)0x01)
   ...
   value ››= 1;
   ... 

А впрочем, в канун Нового Года это неважно

Всех с наступающим!
j-Roger вне форума  
Сказали "Спасибо" j-Roger
-vitalik- (02.01.2019)
Непрочитано 31.12.2018, 18:37  
HardWareMan
Частый гость
 
Регистрация: 13.07.2006
Сообщений: 34
Сказал спасибо: 6
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
HardWareMan на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

j-Roger, а можно просто завести массив Mask[8] = {0x80, 0x40 ... 0x02, 0x01} и в условии сделать if (value & Mask[i]). И тогда точно не будет сдвигов. С другой стороны, один сдвиг переменной покрывает по производительности работу с массивом, в то время как они оба будут обгонять по производительности и размеру результирующего бинарного кода оба варианта, предложенных ТС.

Напомню, что конструкции типа (1‹‹X) лучше применять в константах, чтобы они были единоразово вычислены компилятором. В примере ТС эта операция будет вычисляться с каждой итерацией цикла.

Последний раз редактировалось HardWareMan; 31.12.2018 в 19:04.
HardWareMan вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятка с моб. номером - это сюда ? Jack_A Отвлекитесь, эмбеддеры! 15 18.10.2018 13:44
Школа АRMрестлинга Uragan90 Микроконтроллеры, АЦП, память и т.д 54 22.08.2011 16:13


Часовой пояс GMT +4, время: 11:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.