Всем доброго времени суток! Собираю часики на ГРИ. Такой вопрос: есть порт 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 ПИНЫ И ОДНОВРЕМЕННО КОРРЕКТНО УПРАВЛЯЛА ДЕШИФРАТОРОМ.
Сперва надо сбросить все биты, кроме 0-ого и 1-ого: Код (C++): PORTB &= 0b00000011 Затем в операторе switch записать так (выбрал наугад, остальные по примеру) Код (C++): case 7: PORTB |= 0b00011100; break; :
А вообще, в виндовом калькуляторе в режиме ПРОГРАММИСТ булевая алгебра обсчитывается на раз. Ну и пару учебников надо почитать по булевой алгебре (только не дурино-почемучки). :
Спасибо, всё заработало как надо!!! С булевой алгеброй я знаком, просто не до конца разобрался, с порядком действий. Я когда начал эти маски писать, тоже сбрасывал биты, только те, которые за работу дешифратора отвечают, ну и устанавливал те, которые нужно. Думал, что те, которые трогать не нужно, трогаться не будут. Оказалось не так...