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

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

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

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

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

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


 
Опции темы
Непрочитано 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
Сообщений: 408
Сказал спасибо: 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,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Будет либо истина либо ложь, true или false и не важно 64 там или 32 это все равно true или просто 1, если ложь это просто 0
realid вне форума  
Непрочитано 30.12.2018, 21:40  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 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.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 674
Сказал спасибо: 360
Сказали Спасибо 753 раз(а) в 358 сообщении(ях)
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
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
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
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Условие оператора If - непонятка

Сообщение от j-Roger Посмотреть сообщение
Выдать байт, используя ногодрыг, без лишних операций сдвига:
- там есть сдвиг.
Автор темы, Вы просто используйте 1-ый код и все - хороший код.
Signalshik2 вне форума  
Непрочитано 31.12.2018, 15:50  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 674
Сказал спасибо: 360
Сказали Спасибо 753 раз(а) в 358 сообщении(ях)
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, время: 09:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot