как понять эти символы
<< - это вроде смещение влево
а это >> а это вправо
как понять эти символы
<< - это вроде смещение влево
а это >> а это вправо
mastech писал(а):у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.
их вроде можно записать по другому?Код: Выделить всё
#include <avr/io.h> #include <util/delay.h> while ((PIND&(1 << PD0)) == 1){}[/quote] смотрим файл avr/io.h там прописано какой файл контроллера. подключить например mega8 в нем прописано #define PD0 0 это значит что запись (PIND&(1 << PD0)) превращается в (PIND&(1 <<0)) то есть единица смещается на 0 бит влево. компилятором на этапе сборки это значение просто заменяется на константу и получается в итоге (PIND&0b00000001) таким же образом получается PORTD|=((1 << PD0)|(1 << PD4)|(1 << PD5)); PORTD|=0b00000001|0b00010000 |0b00100000 ; что в свою очередь превращается компилятором в PORTD|=0b00110001; исправил ошибку, пока не поздно, чтобы остальных не вводить в заблуждение.
Для удобства чтения через год. Только непонятно, зачем вы модифицируете в этом примере порт ввода. Из него читают состояния на входных пинах.mastech писал(а):значит эту запись (PIND|=((1 << PD0)|(1 << PD4)|1 << PD5) можно сменить на PIND|=0b00110001;?
и зачем их смещать?))
хе, мой косяк, но это не совсем безсмысленно. я таким приемом пользовался, чтобы на этапе симуляции в студии выставлялись начальные состояния ног чтобы мышью не щелкать двести раз.ut1wpr писал(а):Только непонятно, зачем вы модифицируете в этом примере порт ввода.
логическое сложение это значиттак стоп кажись понял допустим 1 << PD0- это означает: присваиваем 1 порту PD0, далее 1 << PD4: присваиваем 1 PD4 и т.д., |(или) - логическое сложение и все это дело присваивается(=) к пинам PIND, верно?
Код: Выделить всё
PORTD=0b0101 0001; //выставили
начальное значение
PORTD&=~((1<<PD0)|(1<< PD5)); //сбрасываем биты 0 и 5
получится
PORTD=0b0101 0000;
остальные биты не трогаютсяКод: Выделить всё
LSL ByteL
ROL ByteHКод: Выделить всё
ByteHi <<= 1;
if (ByteLo & (1<<7))
ByteHi |= (1<<0);
ByteLo <<= 1;Код: Выделить всё
short a = 0x1234;
a = a << 1; // двигаем переменную из 2-х байт
long b = 0x12345678;
b <<= 1; // двигаем переменную из 4-х байтДизассемблировать hex в avr-студии и найти отладчиком место где переменная передается в регистрshads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Циклить не обязательно. Это зависит от задачи отладки.shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Чтобы не зацикливать, нужно в свойствах МК указывать не .НЕХ файл, а объектный файл .OBJ, тогда просто поставил брейкпоинт в нужной строке программы и всё, если прога на С, тогда указывай файл .ELFshads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Это вы про эмуляцию в протеусе???zero648 писал(а):Чтобы не зацикливать, нужно в свойствах МК указывать не .НЕХ файл, а объектный файл .OBJ, тогда просто поставил брейкпоинт в нужной строке программы и всё, если прога на С, тогда указывай файл .ELF