Arduino firmata

Тема в разделе "Arduino & Shields", создана пользователем echech, 28 ноя 2014.

  1. echech

    echech Нуб

    Добрый вечер!
    Помогите разобраться.
    Как мне в :
    void analogWriteCallback(byte pin, int reg)
    {

    }

    byte pin разбить на массив int?
    Моя задача:
    С компа вызываю "analogWriteCallback(10010110, 0);" и первый аргумент разложить на массив 1 и 0, для дальнейшей установки этих "битов" на 8 пинов.
    Пример:
    Код (Text):
    void analogWriteCallback(byte pin, int reg)
    {
    Каким-то образом получаю pin[];
    for(i = 0; i <= 8; i++){
    if(pin[i]) == 1{
    digitalWrite(i, HIGH);
    }
    else{
    digitalWrite(i, LOW);
    }
    }

    }
     
  2. geher

    geher Гуру

    Код (Text):
    for(i = 0; i < 8; i++){ //итераций должно быть 8, от 0 до 7
       if(pin&(1<<i)){ //единица, сдвинутая влево на i займет позицию, смещенную на i от младшего бита
          digitalWrite(i, HIGH);
       }
       else{
          digitalWrite(i, LOW);
       }
    }
    Если надо в первый пин загонять старший бит, то if(pin&(1<<(7-i)))
    Несколько смущает конструкция
    analogWriteCallback(10010110, 0)
    Это где так значение байта можно представлять?
     
  3. Unixon

    Unixon Оракул Модератор

    Тогда уж
    Код (Text):

    for(i = 0; i < 8; i++)
    {
     digitalWrite(i, (pin>>i)&1);
    }
     
     
    ИгорьК нравится это.
  4. echech

    echech Нуб

    Спасибо! При поиске находил подобное, но в этот раз все понял!:)
    "Несколько смущает конструкция
    analogWriteCallback(10010110, 0)
    Это где так значение байта можно представлять?" - это я так для примера написал)(спешил) Я так понимаю что в первый аргумент надо вставлять 10-ое число
     
  5. echech

    echech Нуб

    Подскажите плз что почитать по этому? Сдвиговые регистры? Если честно, то я не совсем понимаю эти записи "if(pin&(1<<(7-i))), (pin>>i)&1"
     
  6. geher

    geher Гуру

    В общем случае читать про битовые операции в C или C++.
    А записи эти означают примерно следующее.
    1. Единица сдвигается влево на (i-7) позиций. В результате получаем число, составленное из нулевых бит на всех позициях, кроме (i-7)-й. Получившееся число побитно (бит за битом) подвергается логической операции "и" с содержимым pin, в результате которой все биты, кроме (i-7)-го, обнуляются (поскольку второй из аргументов 0), а (i-7)-й сохраняет значение (поскольку второй аргумент 1). Если получившееся число 0 (а это может быть только если (i-7)-й бит в pin равен 0), то условие if не выполнено. Иначе ((i-7)-й бит в pin равен 1) выполнено.
    2. Содержимое pin сдвигается вправо на i позиций, что перемещает бит из i-й позиции в первую. Далее побитное "и" с единицей обнуляет все биты, кроме первого. В результате имеем значение этого самого первого бита из результата сдвига, т.е. значение i-го бита из pin.
    PS. опечатка. Везде i-7 следует читать как 7-i.
     
    Последнее редактирование: 5 дек 2014
  7. echech

    echech Нуб

    Спасибо! Разобрался