Bitwise operations | Microcontrollers from scratch #11

Поділитися
Вставка
  • Опубліковано 2 лис 2024

КОМЕНТАРІ • 102

  • @Программированиемикроконтролле

    Программирование микроконтроллеров. Полный курс для начинающих: diodov.net/programmirovanie-mikrokontrollerov-avr/
    Электроника для начинающих. Мощный курс. diodov.net/elektronika-dlya-nachinayushhih/

  • @bozhkou
    @bozhkou 3 роки тому +38

    Вот хорошая серия роликов... но не без ложки дегтя в этом ролике.
    В начале у нас в PORTD записано число 0001 1100.
    Рассмотрим пример: PORTD = PORTD | (1

    • @olegrusski8646
      @olegrusski8646 2 роки тому +3

      Вот теперь я понял как это работает.

    • @bozhkou
      @bozhkou 2 роки тому +3

      @@olegrusski8646 вводит в заблуждение то, что все сразу пытаются сокращённый вариант записи использовать. Продолжая пример из моего первого комментария. Если заменить PORTD после равно, например на число, логические операции на привычные арифметические (+,-,/,*) и запись (1

    • @olegrusski8646
      @olegrusski8646 2 роки тому +3

      @@bozhkou Я уже после вашего объяснения понял, что эта запись и есть арифметическая операция, где данные порта - это одно число, элемент ИЛИ - это сложение, а выражение в скобках - это второе число))) Пересмотрел второй раз, после того, как понял всю суть, и видео стало еще понятнее. По вашему примеру я даже расписал себе в тетради арифметические операции с ноликами и единичками, чтобы осмыслить, как получается конечный результат. Теперь все встало на свои места!

    • @romanbru9504
      @romanbru9504 2 роки тому

      Не совсем тогда понятна запись ноля во все биты ...&=~..., например было PORTB=00001111;
      00001111
      &
      11111111
      =
      00001111
      ~
      11110000 (вместо желаемых 00000000)

    • @romanbru9504
      @romanbru9504 2 роки тому

      Или 0 принудительно не записать в бит независимо от имевшегося значения? Если 0 уже был то при попытке записи 0 получим 1?

  • @user-race-Vulcan
    @user-race-Vulcan 2 роки тому +5

    Друг ты не представляешь на сколько ты красавчик!! :))

  • @codefinder2232
    @codefinder2232 4 роки тому +8

    Очень прошу выпустить 2-ю часть этого урока. Ибо идти дальше не вижу смысла. Это база. Судя по комментам тема актуальна для многих.

  • @microsoft8792
    @microsoft8792 2 роки тому +3

    ВО! Теперь я понял почему на авто делают управление по массе! А то встречались какие-то невнятные объяснения. Спасибо за полезную инфу.

  • @АндрейИванов-е6о4т
    @АндрейИванов-е6о4т 6 років тому +4

    Самые лучшее объяснение для начинающих. Все остальные многое упускают.

  • @aleksivanov9137
    @aleksivanov9137 4 роки тому +3

    Спасибо огромное!Самые толковые и понятные уроки по микроконтроллерам Удачных Вам проектов..

  • @Тесла-ф3в
    @Тесла-ф3в 3 роки тому +2

    Огроомное вам спасибо за предоставленный вам подробный урок!!!!

  • @ЄвгенБойко-р6в
    @ЄвгенБойко-р6в 6 років тому +4

    Автор просто молодец !!! Долго я искал такое понятное видео.

  • @engineer39notebook
    @engineer39notebook 5 років тому +13

    вот как надо объяснять!! Автор, спасибо!

  • @deceiveitself7275
    @deceiveitself7275 4 роки тому +2

    Здравствуйте. Спасибо Вам за ваши труды. Всё очень подробно объясняете.

  • @DrGeorgiy
    @DrGeorgiy 3 роки тому +2

    Алгоритмика очень увлекательная дисциплина. С детства ее обожаю..

  • @МеняЗовутМитяйРаспздяйВторой

    Гутт!!!
    Хоть кто-то рассказал как менять один бит

  • @ac-alex
    @ac-alex 5 років тому +1

    Красавчик! Всё четко и ясно!!!! Восхищаюсь!))))

  • @alangilels6311
    @alangilels6311 4 роки тому +1

    автор молодец. всё понятно даже мне.

  • @vitalyivanov7228
    @vitalyivanov7228 4 роки тому +1

    спасибо за уроки хорошие. может что и упустили, как нам про сброс в ноль, но мне очень все нравиться

  • @catcher9310
    @catcher9310 5 років тому +13

    Совершенно непонятно откуда вдруг берется выражение 1

    • @sergeyrink3003
      @sergeyrink3003 4 роки тому

      Предыдущая тема. У него кнопка на 0 бите порта PORTB. Хотя можно было просто 1 написать вместо (1

    • @bozhkou
      @bozhkou 3 роки тому

      Разобрались?)

    • @КириллСердюк-л6ш
      @КириллСердюк-л6ш 3 роки тому +1

      @@sergeyrink3003 нет, нельзя было. Такая запись означает «установить единицу на нулевой бит». А просто 1 установит единицу на весь порт б

  • @Биба-р9н
    @Биба-р9н 5 років тому +3

    Вы эти светодиоды установите в трафарет из картона например. И подпишите х0, х1 .... не надо будет считать каждый раз и нам наглядно будет!. но так чтобы они не торчали высоко. А то засвечивает друг друга.

  • @AndreyChigisheff
    @AndreyChigisheff 2 роки тому +2

    if и while не взаимозаменяемы. if выполняется один раз, а while будет проверяться каждый раз, как только указатель доберется до конца тела while в коде. Т.е. в постоянном цикле. if в коде используется для разветвления программы, а while для ее зацикливания.

  • @РоманАнатолійович
    @РоманАнатолійович Місяць тому

    Странно, у меня код со знаком инверсии работает, а с "восклицательным знаком и равно" - не работает! Считывает сходу как будто кнопка уже нажата. Почему так? (причем в Протеус все варианты работают корректно, а в реальном железе нет; вместе с тем, в реальном железе знак инверсии и просто восклицательный знак выполняются корректно)

  • @avr_stm_pro2955
    @avr_stm_pro2955 6 років тому +2

    Спасибо за урок!!

  • @ПавелИванцов-б5л
    @ПавелИванцов-б5л 5 років тому +6

    Спасибо за уроки, очень хорошо объясняете.Но по моему тут ошибка в разборе ожидания сброса или установки в цикле while . Вам не кажется что нужно наоборот.while (~PINB & (1

    • @TrasherFCR
      @TrasherFCR 3 роки тому

      Я не силен в C, но по логике и той и той записью можно любое значение проверять, например:
      while (PINB & (1

  • @avr_stm_pro2955
    @avr_stm_pro2955 6 років тому +2

    Спасибо за труд!!!!

  • @_0322
    @_0322 5 років тому +1

    Здравствуйте! Очень хорошо все объясняете. Не могу только разобраться, как сделать операции с несколькими кнопками , чтобы команды с них не влияли друг на друга. У меня от нажатия мигают по частоте, видимо кольцуются команды. Что делать не подскажете? К слову я совсем новичок, только по видео и научился.

  • @АндрейИванов-е6о4т
    @АндрейИванов-е6о4т 3 роки тому +1

    if(0 !=(PIND &(1

  • @ИванЩёлоков-ы9х
    @ИванЩёлоков-ы9х 2 роки тому +1

    Доброе время суток. Спасибо за ваш труд. if(~PINB & ((1

  • @КириллДенисов-ю3р
    @КириллДенисов-ю3р 5 років тому +7

    Вообще ничего не понял. Какая связь между И, ИЛИ, НЕ, искл. ИЛИ и тем кодом на видео?
    Как расшифровывается PORTD =PORTD | (1

    • @ДмитрийЦветов-в5э
      @ДмитрийЦветов-в5э 5 років тому +4

      PORTD это 0b0010000 (для примера),
      (1

    • @КириллДенисов-ю3р
      @КириллДенисов-ю3р 5 років тому +1

      Дмитрий Цветов вот то то и непонятно, зачем сдвиг, если он ничего не сдвигает.
      А оператор ИЛИ какую роль играет? Как я понял, он должен сравнивать два бита и если в одном из них 1, то на выходе должна быть единица. Но непонятно что и с чем он сравнивает

    • @ДмитрийЦветов-в5э
      @ДмитрийЦветов-в5э 5 років тому +3

      ​@@КириллДенисов-ю3р ,
      Оператор "ИЛИ" сравнивает два бита в каждом разряде двоичных чисел. В примере выше:
      8 7 6 5 4 3 2 1 - номер разряда,
      0b 0 0 0 1 0 0 0 0 - PORTD (установлен бит в пятом разряде в 1),
      0b 0 0 0 0 0 0 0 1 - (1

    • @КириллДенисов-ю3р
      @КириллДенисов-ю3р 5 років тому

      Дмитрий Цветов то есть при помощи оператора ИЛИ мы сравниваем текущее значение порта D 0b00010000 со значением
      0b00000001, при этом в результате получаем
      0b00010001.
      Значит при записи
      PORTD &=(1

    • @КириллДенисов-ю3р
      @КириллДенисов-ю3р 5 років тому

      Дмитрий Цветов по поводу того, какой код прочесть легче, я бы поспорил. Я сейчас только при помощи бумаги и ручки записав значения 0b1000000 | 0b00000100, вычислив результат и произведя над ним инверсию, смог понять что это тоже самое что записать
      (0b00000000 | 0b01111011). Во втором случае всё более наглядно и понятно

  • @MrAndrk83
    @MrAndrk83 3 роки тому

    Привет. Я не совсем понял, а как реализовать. Одна кнопка и один светодиод. Нажимаю один раз на кнопку, светодиод горит постоянно, нажимаю второй раз на кнопку, начинает мигать светодиод с частотой 1секкнла. Ещё раз нажимаю на кнопку, светодиод тухнет.

  • @СергейРакитин-и2й
    @СергейРакитин-и2й 3 роки тому

    Здравствуйте, у меня порт B при считывание положительного потенциала, при нажатии кнопки подаётся +5, ни одна из команд не работают, на протеусе, и на камне. А при другом варианте работы порта, когда заземляется ножка порта, всё отлично, работает. Почему так?

  • @ussrfeniks
    @ussrfeniks Рік тому

    Не понимаю почему бы не записать в порт нужный байт и не извращаться с логическими операциями? Ведь одинаковое процессорное время это займет? Или нет?

    • @ehomen9310
      @ehomen9310 6 місяців тому

      В данный момент это не очень нужно. Но постепенно с усложнением программ это будет становится всё полезней и полезней

  • @alextar8489
    @alextar8489 5 років тому +1

    как открыть сохраненный проект в Atmel и изменить его?

    • @digitalminister5687
      @digitalminister5687 4 роки тому

      Не знаю актуально ли ещё, открываете проект и включается пустое окно Atmel Studio. Справа есть окно вертикальное, в нём есть меню где надо выбрать Solution Explorer и тогда появятся файлы из проекта, далее выбираете программу main.c и работаете дальше

  • @Локомотив1520
    @Локомотив1520 4 роки тому

    Подскажите пожалуйста а как проверить одновременно несколько битов? Ну к примеру нажатие сразу двух и более кнопок? while (~PINB & (1

  • @catcher9310
    @catcher9310 5 років тому

    Здравствуйте. А я не совсем понял логику действий программы со сдвигом нулевого бита влево и логического или. Ну сдвигаем мы нулевой бит влево, там как был ноль, так и остается и в изначально сконфигурированном порту тоже ноль там, откуда единица берется?

  • @codefinder2232
    @codefinder2232 4 роки тому +1

    Здпавствуйте, автор. Очень благодарен Вам за подробные уроки, включительно по 10-й. И вот пошли первые подводные камни. Не совсем понятно (нет - вру, совсем не понятно) как воспринимать запись PORTD =PORTD | (1

    • @БогданПаршинцев
      @БогданПаршинцев 4 роки тому +10

      Надо понять последовательность действий. Сперва выполняются действия в скобках. Результат (1

  • @ВячеславСоколов-з3б
    @ВячеславСоколов-з3б 5 років тому +1

    Всё отлично. Одно не могу понять( когда на PORTB подключён потенциал 5В):
    В начальный момент времени
    PORTB=0b00000000;
    далее
    if(PINB&(1

    • @deceiveitself7275
      @deceiveitself7275 4 роки тому +1

      & это не ИЛИ, это И. if будет выполняться только в том случае если в () будет 1 или по другому true, если в () 0 подругому false, будет выполняться else. Если нет else то ничего выполняться не будет. Коряво но как-то так.

  • @ebjikkolu4757
    @ebjikkolu4757 6 років тому +5

    Я понял тему с логическими и побитовыми операциями.Но одно я не понял точно.Если у меня PORTD = 0b11111111 и я хочу потушить один из битов,я не могу сделать так PORTD = (0

    • @Sxemodelkin
      @Sxemodelkin 5 років тому

      тоже такой вопрос

    • @Sxemodelkin
      @Sxemodelkin 5 років тому

      Я разобрался, если мы будем сразу писать PORTD = (0

    • @sergeysergeev8678
      @sergeysergeev8678 5 років тому

      так ты "сдвинеш" весь порт,на то количество которое ввел.и с той стороны "куда",то количество битов что ввел/сдвинул,станет тождественно введенному "пожеланию".а если нужно чтобы другие биты не изменили своего состояния?то что "хочеш" ты,в двух словах,"ввести справа ноль три раза",при этом сдвигается весь регистр,с "выбрасыванием" трех левых битов.и если третий был единицей то она сдвинется на три влево,и если шестой был ноль,то станет единицей.

    • @codefinder2232
      @codefinder2232 4 роки тому

      @@sergeysergeev8678 Думаю, врядли тут(у Вас) можно что-то разобрать.

    • @sergeysergeev8678
      @sergeysergeev8678 4 роки тому

      @@codefinder2232 тогда забей

  • @Ошалелый_помещик_Козявкин

    У меня схема работает только когда подключу все подтягивающие резисторы ко входному порту. Если резистор подключен только к нулевому порту как у автора, всё висит без изменений и в Протеусе и на макетке. Контроллер ATmega16A.

  • @zakirmammadov9146
    @zakirmammadov9146 3 роки тому

    Спасибо!!!

  • @edmelectronics4110
    @edmelectronics4110 4 роки тому

    Скажите пажалуйста, можем ли обратимся к конкретном пином так: PORTB.0=1; вместо PORTB I= (1

    • @АндрейРодионов-б5д
      @АндрейРодионов-б5д 3 роки тому +1

      В AVR Studio так обращаться к конкретному пину нельзя, только вторая запись. А вот в CodeVisionAVR - можно и первым способом.

  • @ЗахарЗахаров-я5г
    @ЗахарЗахаров-я5г 4 роки тому +1

    Для того, чтобы установить нулевой, шестой и седьмой биты, достаточно логически сложить "портД" и 11000001. И это короче и понятней чем нагромождение >> и

    • @БогданПаршинцев
      @БогданПаршинцев 4 роки тому +2

      Да, но если вы не знаете какие биты вам надо установить? Допустим вначале вы определили константу, которая определяет бит в порту, на который установлен диод. Допусти назвали ее const. И теперь вы можете сделать, допустим, так: DDRD = DDRD | (1

  • @Dmitrii82
    @Dmitrii82 6 років тому +1

    какая разница между этими командами если по сути они ставят на PC1 +5в.
    portc=(1

  • @alekskapitonov2738
    @alekskapitonov2738 3 роки тому

    Спасибо

  • @bigfishbigfish7036
    @bigfishbigfish7036 3 роки тому

    Класс

  • @agood9000
    @agood9000 3 роки тому

    как отключить рекламу ?

    • @Bodroxod
      @Bodroxod 3 роки тому

      AdBlock

    • @DS-ls7ck
      @DS-ls7ck 3 роки тому

      Купить подписку. На авито можно дешевле найти наверное

    • @Bodroxod
      @Bodroxod 3 роки тому

      @@DS-ls7ck Пчёл, какая подписка? Предлагаешь деньги платить? AdBlock бесплатен и делает свое дело.

  • @fortunaalex6061
    @fortunaalex6061 5 років тому

    Какой это язык ?

  • @ЮляМакаркина
    @ЮляМакаркина 4 роки тому +3

    Зачем ты показываешь на реальном микроконтроллере и в пртэусе

  • @фафкафафкин
    @фафкафафкин 4 роки тому +2

    автору бы изучить немного си для начала, путает логические операторы с побитовыми, вводя зрителей в заблуждение, кажется он сам не знает суть этих строк.

  • @АлександрШуличенко-ю7ъ

    Добрый день.
    #include
    int main(void)
    {
    DDRC &= ~(1

  • @codefinder2232
    @codefinder2232 4 роки тому +5

    Если же это маркетинговый ход и получить ответы на этот и последующие ответы можно только за 230$, то можете пропустить этот коммент.

    • @finskiymaster
      @finskiymaster 4 роки тому

      интересно, а за 230$ автор вливает в головы ученикам такую же ересь, или все-таки что то полезное?

    • @bozhkou
      @bozhkou 3 роки тому +3

      @@finskiymaster если у человека есть мозг (а по дефолту он есть), если человек умеет этой частью организма пользоваться (по дефолту умеет, но как-то не у всех эта способность сохраняется да же до подросткового возраста, иногда до окончания вуза...), материала изложенного в серии этих уроков, достаточно, для реализации всего и вся, если слушатель умеет юзать мозг по прямому предназначению. Главное чему учит автор, читать даташит, и делает это на конкретном примере и делает это на довольно хорошем уровне.

  • @СтюиГ
    @СтюиГ 7 місяців тому

    Сразу чувствуется огромный недостаток в педагогическом плане, аналогии и примеры не используются автором вообще, и где мне понадобятся эти сдвиги в реальной схеме с датчиками и моторами, совсем не понятно. А эти пресловутые светодиоды, никому не нужные, уже достали до такой степени, что кажется, это единственный элемент который мы можем использовать в работе с МК. И к чему эти сдвиги, если можно просто назначить тот или иной СД на 1 или 0, совершенно не понятно, к чему такие сложности, не объясняется! Сто раз пересмотрел, и ничего понять не могу, для чего эти операнты и сдвиги в реальной схеме с датчиками, никак не понятно.

  • @Andrey-su1hc
    @Andrey-su1hc 4 роки тому

    1