Помогите со скетчем, пожалуйста

Тема в разделе "Arduino & Shields", создана пользователем m-ctacc, 14 мар 2014.

  1. m-ctacc

    m-ctacc Нуб

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

    Входы || Выходы
    А В С || А В
    0 0 0 || 0 0

    1 0 0 || 1 0
    0 1 0 || 1 0
    0 0 1 || 1 0

    1 1 0 || 0 1
    0 1 1 || 0 1
    1 0 1 || 0 1

    1 1 1 || 1 1
     
  2. omadonex

    omadonex Нерд

    Может быть что-нибудь такое:

    Код (Text):

    const int inputPinA = 3;
    const int inputPinB = 4;
    const int inputPinC = 5;
    const int outputPinA = 6;
    const int outputPinB = 7;

    void setup() {
      pinMode(outputPinA, OUTPUT);
      pinMode(outputPinB, OUTPUT);
    }

    void loop() {
      int A = digitalRead(inputPinA);
      int B = digitalRead(inputPinB);
      int C = digitalRead(inputPinC);

      if (A + B + C == 1) {
        digitalWrite(outputPinA, HIGH);
        digitalWrite(outputPinB, LOW);
      } else if (A + B + C == 2) {
        digitalWrite(outputPinA, LOW);
        digitalWrite(outputPinB, HIGH);
      } else if (A + B + C == 3) {
        digitalWrite(outputPinA, HIGH);
        digitalWrite(outputPinB, HIGH);
      } else {
        digitalWrite(outputPinA, LOW);
        digitalWrite(outputPinB, LOW);
      }
    }
       
     
    Последнее редактирование: 16 мар 2014
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    http://goo.gl/aml9Hu
    Код (Text):
    #define inputPinA 3
    #define inputPinB 4
    #define inputPinC 5
    #define outputPinA 6
    #define outputPinB 7

    void setup() {
      digitalWrite(outputPinA, OUTPUT);
      digitalWrite(outputPinB, OUTPUT);
    }

    void loop() {
      boolean A = digitalRead(inputPinA);
      boolean B = digitalRead(inputPinB);
      boolean C = digitalRead(inputPinC);

      boolean Aout = A|B;
      boolean Bout = B|C;

      digitalWrite(outputPinA, Aout);
      digitalWrite(outputPinB, Bout);
    }
     
  4. m-ctacc

    m-ctacc Нуб

    К сожалению оба скетча не работают :(
     
  5. NR55RU

    NR55RU Гик

    А теперь смоделируйте что будет в случае:
    0 0 1 || 1 0

    А выставится в 0 ... и работать логика верно уже не будет :)
     
  6. NR55RU

    NR55RU Гик

    Микро ошибка, везде идет чтение из пина А :)
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    хм, XOR тоже не подходит. А втупую сравнивать - как-то не изящно.
    И вообще исходный пример непонятен:
    почему при
    Код (Text):
    А В С || А В
    0 0 0 || 0 0
    низкие A и B дают на выходе А ноль,
    а при
    Код (Text):
    А В С || А В
    0 0 1 || 1 0
    те же низкие A и B дают на выходе А единицу?
     
    Последнее редактирование: 14 мар 2014
  8. m-ctacc

    m-ctacc Нуб

    Я готов втупую
     
  9. m-ctacc

    m-ctacc Нуб

    Что непонятно? Вход С в высоком состоянии. Нужно считать входы в высоком состоянии.
     
  10. NR55RU

    NR55RU Гик

    По сути в первом ответе было дано наиболее наглядное решение задачи.
    Логика простая, просто надо посчитать на скольких пинах единицы и в зависимости от количества выставить требуемые значения.
    Так что я по сути лишь слегка переделал первый ответ.
    Главное не забудьте про setup ну и объявить переменные пинов, я привожу лишь функцию main

    Код (Text):
    void loop()
    {
        int count = 0;
        if( digitalRead(inputPinA) ) count++;
        if( digitalRead(inputPinB) ) count++;
        if( digitalRead(inputPinC) ) count++;
       
        switch( count )
        {
            case 0:
                digitalWrite(outputPinA, LOW);
                digitalWrite(outputPinB, LOW);
                break;
            case 1:
                digitalWrite(outputPinA, HIGH);
                digitalWrite(outputPinB, LOW);
                break;
            case 2:
                digitalWrite(outputPinA, LOW);
                digitalWrite(outputPinB, HIGH);
                break;
            case 3:
                digitalWrite(outputPinA, HIGH);
                digitalWrite(outputPinB, HIGH);
                break;
        }
    }
    Можно конечно решить это с помощью битовых операций но в данном случае наглядность как я понимаю имеет более большое значение :)
    Можно и даже нужно было бы добавить понятие нового и старого состояния пинов чтобы не тыркать все это по кругу когда значения на пинах не поменялись, но не стал усложнять код.
     
  11. m-ctacc

    m-ctacc Нуб

    По скетчу вроде правильно и местами понятно. А на макетке - тишина. Всё равно, всем неравнодушным - спасибо. Уже есть направление, куда двигаться.
     
  12. omadonex

    omadonex Нерд

    Вот зараза закралась :) Сразу не заметил, уже поправил. Спасибо
     
  13. m-ctacc

    m-ctacc Нуб

    При загрузке скетча (первый в посте), на выходах светодиоды горят вполнакала. Померил напряжение - 2,5В. Прописываю в скетч поставить высокий уровень на 13 ногу. Тоже вполнакала. Загружаю скетч с Blink-ом, и всё как и должно быть . Напряжение на выходе ~5В.
    Поменял в:
    void setup() {
    digitalWrite(outputPinA, OUTPUT);
    digitalWrite(outputPinB, OUTPUT);

    на :

    void setup() {
    pinMode(outputPinA, OUTPUT);
    pinMode(outputPinB, OUTPUT);

    и всё стало нормально - 5В. Объясните?
     
  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    не изучали теорию? :cool:
    pinMode настраивает пины на вход или выход. В первый раз Вы этого не сделали, а по-умолчанию они работают как входы.
     
  15. omadonex

    omadonex Нерд

    Вы все правильно сделали, я допустил ошибку. Естественно pinMode. Видимо, когда я писал скетч, мои мысли были не согласованы с руками :).