Вопрос по битовым маскам

Тема в разделе "Arduino & Shields", создана пользователем Eragon, 4 янв 2020.

  1. Eragon

    Eragon Нерд

    Всем доброго времени суток! Собираю часики на ГРИ. Такой вопрос: есть порт B ардуины, пины с 2-5 используются для управления дешифратором, пин 1 это ШИМ. Дешифратором управляю вот по такому принципу.
    Код (C++):
    case 0: PORTB = 0b00000000; break;
        case 1: PORTB = 0b00000100; break;
        case 2: PORTB = 0b00001000; break;
        case 3: PORTB = 0b00001100; break;
        case 4: PORTB = 0b00010000; break;
        case 5: PORTB = 0b00010100; break;
        case 6: PORTB = 0b00011000; break;
        case 7: PORTB = 0b00011100; break;
        case 8: PORTB = 0b00100000; break;
        case 9: PORTB = 0b00100100; break;
    Т.к ШИМ 30кГц, постоянное обнуление на его работу почти не влияет. Хочу задействовать 0 пин, но как видно из кода он постоянно обнуляется. Решил сделать маску, начал писать...
    Код (C++):
    case 0: PORTB &=~(1<<2)|(1<<3)|(1<<4)|(1<<5); break;
    case 1: PORTB &=~(1<<3)|(1<<4)|(1<<5); PORTB |=(1<<2); break;
    И в результате получаю некорректное отображение на индикаторах. Пробовал ещё несколько похожих вариантов - результат один((( Потом понял ошибку, подавать двоичное число на дешифратор нужно в один момент времени. ВОТ СИЖУ И ДУМАЮ КАК СДЕЛАТЬ ТАКУЮ МАСКУ, КОТОРАЯ БЫ НЕ ТРОГАЛА 0 И 1 ПИНЫ И ОДНОВРЕМЕННО КОРРЕКТНО УПРАВЛЯЛА ДЕШИФРАТОРОМ.
     
  2. parovoZZ

    parovoZZ Гуру

    Сперва надо сбросить все биты, кроме 0-ого и 1-ого:
    Код (C++):
    PORTB &= 0b00000011
    Затем в операторе switch записать так (выбрал наугад, остальные по примеру)
    Код (C++):
    case 7: PORTB |= 0b00011100; break;
    :
     
  3. parovoZZ

    parovoZZ Гуру

    А вообще, в виндовом калькуляторе в режиме ПРОГРАММИСТ булевая алгебра обсчитывается на раз. Ну и пару учебников надо почитать по булевой алгебре (только не дурино-почемучки).
    :
     
    Andrey12 нравится это.
  4. Eragon

    Eragon Нерд

    Спасибо, всё заработало как надо!!!:) С булевой алгеброй я знаком, просто не до конца разобрался, с порядком действий. Я когда начал эти маски писать, тоже сбрасывал биты, только те, которые за работу дешифратора отвечают, ну и устанавливал те, которые нужно. Думал, что те, которые трогать не нужно, трогаться не будут. Оказалось не так...