Чтение бита порта

Тема в разделе "Микроконтроллеры AVR", создана пользователем Spell, 15 апр 2018.

  1. Spell

    Spell Нерд

    Добрый день.
    Мне нужно считывать данные с конкретной ноги МК. Эта операция делается в обработке прерывания тамера, то я хочу ее облегчить до минимума. Поэтому отказался от digitalRead().
    Собственно, заработало, но возник вопрос.
    Почему вот такая конструкция работает:
    Код (C++):
    uint8_t v = PIND;
    v = v & (1 << pinData[i]);
    if(v > 0){...}
    А вот такая нет:
    Код (C++):
    if(PIND & (1 << pinData[i]) > 0){...}
    И даже вот такая тоже не работает:
    Код (C++):
    uint8_t v = PIND;
    if(v & (1 << pinData[i]) > 0){...}
    Массив pinData содержит номера контактов, т.к. читать надо с нескольких портов по одному синхросигналу.
     
  2. DIYMan

    DIYMan Гуру

    Spell нравится это.
  3. Spell

    Spell Нерд

    О, как.
    Спасибо.
     
  4. mcureenab

    mcureenab Гуру

    Облегчить до минимума, это убрать вычисление

    Код (C++):
    (1 << pinData[i])
    В pinDataMask [] должны быть готовые маски (1 << pinData) , а не сдвиги.

    К стати оператор > 0 тут не нужен. Достаточно того, что & вернул ненулевой результат.

    Код (C++):
    if(PORTD & pinDataMask[i]){
     
    Spell нравится это.