30.12.2018, 19:04
|
|
Прописка
Регистрация: 20.10.2008
Сообщений: 103
Сказал спасибо: 95
Сказали Спасибо 25 раз(а) в 18 сообщении(ях)
|
Условие оператора 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.
|
|
|
|
30.12.2018, 19:56
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 409
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
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). Так понятно?
|
|
|
|
30.12.2018, 20:07
|
|
Прописка
Регистрация: 20.10.2008
Сообщений: 103
Сказал спасибо: 95
Сказали Спасибо 25 раз(а) в 18 сообщении(ях)
|
Re: Условие оператора If - непонятка
Не совсем.
Предположим Temp=0b0100 0000, сдвинутая единица, скажем, будет давать число, равное Temp и поразрядное! И двух значений будет равно Temp - т.е. 64, но ни как не 1 или 0.
Как в If в таком случае, выполняется условие? Не доезжает голова моя что то...
Последний раз редактировалось rexdn; 30.12.2018 в 20:15.
|
|
|
|
30.12.2018, 21:05
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Условие оператора If - непонятка
Будет либо истина либо ложь, true или false и не важно 64 там или 32 это все равно true или просто 1, если ложь это просто 0
|
|
|
|
30.12.2018, 21:40
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 409
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
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.
Причина: Добавил фразу.
|
|
|
|
31.12.2018, 01:19
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
|
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
|
|
|
31.12.2018, 07:28
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Условие оператора If - непонятка
rexdn, а привлечь классику блок-схем?
В общем случае есть последовательность байт для передачи по синхронному последовательному интерфейсу.
Выбирается нужный порядок согласно логике передачи.
Для каждого байта производится сравнение по маске на наличие 0/1 в нужной позиции и результат выводится на выход данных с периодом синхронного изменения состояния на выходе CLK.
Если использованный (кстати немного избыточный по коду) механизм вызывает вопросы, то проинициализируйте unsigned char переменную перед циклом (= 0b10000000 или 0b00000001) и сдвигайте ее в нужном направлении после выполнения проверки результата И с байтом данных для передачи.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 31.12.2018 в 13:23.
|
|
|
|
31.12.2018, 11:29
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 409
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Условие оператора If - непонятка
Сообщение от j-Roger
|
Выдать байт, используя ногодрыг, без лишних операций сдвига:
|
- там есть сдвиг.
Автор темы, Вы просто используйте 1-ый код и все - хороший код.
|
|
|
|
31.12.2018, 15:50
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
|
Re: Условие оператора If - непонятка
Сдвиг, конечно, есть, как же без него. Но нет лишних сдвигов, которые можно выкинуть,
если вращать сам байт данных, а не вычислять каждый раз новую маску, причем дважды -
каждое выражение 1‹‹(i-1) разворачивается в свой цикл.
Если нужно выдать байт, начиная с младшего бита, меняем:
PHP код:
|
...
if (value & (uint8_t)0x80)
...
value ‹‹= 1;
...
|
на
PHP код:
|
...
if (value & (uint8_t)0x01)
...
value ››= 1;
...
|
А впрочем, в канун Нового Года это неважно
Всех с наступающим!
|
|
|
Сказали "Спасибо" j-Roger
|
|
|
31.12.2018, 18:37
|
|
Частый гость
Регистрация: 13.07.2006
Сообщений: 34
Сказал спасибо: 6
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: Условие оператора If - непонятка
j-Roger, а можно просто завести массив Mask[8] = {0x80, 0x40 ... 0x02, 0x01} и в условии сделать if (value & Mask[i]). И тогда точно не будет сдвигов. С другой стороны, один сдвиг переменной покрывает по производительности работу с массивом, в то время как они оба будут обгонять по производительности и размеру результирующего бинарного кода оба варианта, предложенных ТС.
Напомню, что конструкции типа (1‹‹X) лучше применять в константах, чтобы они были единоразово вычислены компилятором. В примере ТС эта операция будет вычисляться с каждой итерацией цикла.
Последний раз редактировалось HardWareMan; 31.12.2018 в 19:04.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:58.
|
|