логическая равнозначность

Тема в разделе "Arduino & Shields", создана пользователем Максимус-Бог, 4 дек 2015.

  1. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    как сделать логическую равнозначность на ардуино
     
    Последнее редактирование: 6 дек 2015
  2. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    0 0 | 0
    0 1 | 1
    1 0 | 1
    1 1 | 0
     
  3. Alex19

    Alex19 Гуру

    Это называется побитовое исключающее ИЛИ (Исправился).
    [​IMG]

    Код (C++):

    void setup()
    {
      Serial.begin(9600);
    }

    void loop()
    {
      Serial.println("Begin");
      byte b1 = 0;
      byte b2 = 0;
      byte result = 0;
      result = b1 ^ b2;
      Serial.println(result, BIN);
      b1 = 0;
      b2 = 1;
      result = b1 ^ b2;
      Serial.println(result, BIN);
      b1 = 1;
      b2 = 0;
      result = b1 ^ b2;
      Serial.println(result, BIN);
      b1 = 1;
      b2 = 1;
      result = b1 ^ b2;
      Serial.println(result, BIN);
      delay(1000);
    }
     
    Подробнее тут - http://chipenable.ru/index.php/prog...s-kak-rabotat-s-bitami-makroopredeleniya.html
     
  4. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    мне нужно немного другое, а имено (на этом сайте) побитовое исключающее ИЛИ и как его записать в условии if?
    xor.gif
     
  5. Alex19

    Alex19 Гуру

    Честно говоря я Вас не совсем понимаю, что значит в if?

    Так что, ли
    Код (C++):
    void setup()
    {
      Serial.begin(9600);
    }

    void loop()
    {
      Serial.println("Begin");

      byte b1 = 0;
      byte b2 = 0;
      byte result = 0;
      result = b1 ^ b2;

      if (b1 ^ b2)
      {
        Serial.println(result, BIN);
      }

      b1 = 0;
      b2 = 1;
      result = b1 ^ b2;

      if (b1 ^ b2)
      {
        Serial.println(result, BIN);
      }

      b1 = 1;
      b2 = 0;
      result = b1 ^ b2;

      if (b1 ^ b2)
      {
        Serial.println(result, BIN);
      }

      b1 = 1;
      b2 = 1;
      result = b1 ^ b2;

      if (b1 ^ b2)
      {
        Serial.println(result, BIN);
      }

      delay(1000);
    }
    Serial будет печать, только если результат равен 1, если надо наоборот напишите
    Код (C++):
    if (!(b1 ^ b2))
    UPD. Если я Вас не понял, поясните более подробнее. Я вначале ошибся в названии, после поправил, это и есть - побитовое исключающее ИЛИ.
     
    Последнее редактирование: 6 дек 2015
  6. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Код (C++):
    if(условие){
        ++scl;
    }
    x > 100 или y > 100, но x и y не > 100
     
  7. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    я понял!!
    x > 100 && y < 100 || x < 100 && y > 100
     
  8. Alex19

    Alex19 Гуру

    Рад за Вас, хоть сам ни чего не понял:).

    Удачи!

    UPD. Дошло :), меня сбила с пути Ваша таблица. Вам нужно было просто логические операторы.

    Пару ссылок на будущие, все на русском - http://arduino.ru/Reference и http://arduino.ua/ru/prog/.
     
    Последнее редактирование: 6 дек 2015
  9. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Код (C++):
    #define BUTTON 8
    #define edge 110 //110 - граница долгого и короткого клика
    #define zero 0 // просто 0

    int t1, t2, lcl, scl, dcl, dlcl;

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      t1 = pulseIn(BUTTON, HIGH) / 1000;
      t2 = pulseIn(BUTTON, HIGH, 2000000) / 1000;

      if(t1 <= edge && t2 < zero || t1 < zero && t2 <= edge){
        // почему это условие не выполняется
       ++scl;
      }
      else if(t1 >= zero && t2 > edge || t1 > edge && t2 >= zero){
        ++ lcl;
      }
      Serial.print(scl);
      Serial.print("||");
      Serial.println(lcl);
    }
     
  10. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    if(t1 <= edge && t2 < zero || t1 <= zero && t2 <= edge){
    заработало, "=" поставил
     
  11. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Почему программа неправильно работает? она работает как счётчик.
    Код (C++):
    #define BUTTON 8
    #define edge 110 //110 - граница долгого и короткого клика
    #define zero 0 // просто 0

    int t1, t2, lcl, scl, dcl, dlcl;

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      t1 = pulseIn(BUTTON, HIGH) / 1000;
      t2 = pulseIn(BUTTON, HIGH, 2000000) / 1000;

      if(t1 <= edge && t2 < zero || t1 <= zero && t2 <= edge){
        ++scl;
      }
      else if(t1 >= zero && t2 > edge || t1 > edge && t2 >= zero){
        ++ lcl;
        t1 = 0;
        t2 = 0;
      }

      Serial.print(scl);
      Serial.print("||");
      Serial.println(lcl);
    }
    я даже её переписал вот так:
    Код (C++):
    #define BUTTON 8
    #define edge 110 //110 - граница долгого и короткого клика
    #define zero 0 // просто 0

    int t1, t2, lcl, scl, dcl, dlcl;

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      t1 = pulseIn(BUTTON, HIGH) / 1000;
      t2 = pulseIn(BUTTON, HIGH, 2000000) / 1000;

      if(t1 <= edge){
        ++scl;
      }
      else if(t2 <= edge){
        ++scl;
      }
      else if(t1 > edge){
        ++ lcl;
      }

      else if(t2 > edge){
        ++ lcl;
      }

      Serial.print(scl);
      Serial.print("||");
      Serial.println(lcl);
    }
    а она выводит
    Код (Text):
    1||0
    2||0
    3||0
    4||0
    5||0
    6||0
    7||0
    8||0
    9||0
    10||0
    11||0
    12||0
    13||0
    14||0
    15||0
    16||0
    17||0
    18||0
    19||0
    20||0
    21||0
    22||0
    23||0
    24||0
    25||0
    26||0
    27||0
    28||0
    29||0
    30||0
    и т.д
     
    Почему?
     
  12. Alex19

    Alex19 Гуру

    Да я понял, что мы говорим о разном, таблица меня сбила с пути.

    Позволю дать Вам совет, посмотрите ссылки выше
    В частности Арифметические операторы, Операторы сравнения, Логические операторы без четкого понимания их, что-то более мене написать сложно.

    В первой части кода, пользуйтесь скобками, для большей прозрачности.

    Код (C++):
    if(t1 <= edge && t2 < zero || t1 <= zero && t2 <= edge)
    Данное условие выполнится если, даже если только t1 < zero будет удовлетворять условию.

    А вот так
    Код (C++):
    if((t1 <= edge && t2 < zero) || (t1 <= zero && t2 <= edge))
    Будет выполнено если (t1 <= edge && t2 < zero) или (t1 <= zero && t2 <= edge)

    Еще момент pulseIn может вернуть и 0 - http://arduino.ru/Reference/PulseIn.

    Я не знаю, что именно Вы хотите, напишите на русском. К примеру, если t1 меньше или равно edge при этом t2 больше zero и т.д. Тогда я смогу написать код и пояснить Вам где ошибка.
     
  13. Tomasina

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

    а что вообще должно выводить-то?

    P.S. код поправь на это:
    Код (C++):
    t2 = pulseIn(BUTTON, HIGH, 2000000UL) / 1000;
     
    Alex19 нравится это.
  14. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    выводить милисикунды.
    Что значит UL( 2000000UL)?
     
  15. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    в If ( t1 или t2 <= edge, но не t1 и t2 <= 0 )
     
  16. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    ((t1 <= edge || t2 <= edge) && !(t1 <= edge && t2 <= edge)) сделал так, но теперь не на все клики реагирует.
     
  17. Tomasina

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

    По-умолчанию (без явного указания типа) все числа имеют размерность int, т.е. максимум 32768, т.е. если просто написать 2000000, то оно из-за переполнения обрежется до 1152.
     
    Максимус-Бог нравится это.
  18. Alex19

    Alex19 Гуру

    Данная константа будет пониматься как unsigned long. Более подробно, ответил Tomasina.

    Код (C++):
    if ((t1 <= edge || t2 <= edge) && !(не t1) && (t2 <= 0))
    Будет выполнена если t1 или t2 меньше или равно edge при этом !(не t1) и при этом (t2 <= 0).

    А вот тут я не понял
    Будет так если t1 или t2 меньше или равно edge при этом если данное условие (t1 <= edge && t2 <= edge) не выполнится, то есть t1 больше и/или t2 будет больше edge.

    Это код выполнится только если одна из t > edge, а другая t <= edge, если иначе нет.

    Это и так понятно, тогда зачем все эти if?
    Если pulseIn() и так, возвращает микросекундах, просто делим на 1000 и получим миллисекунды.
     
  19. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    ifы нужны, что бы узнать нажали мы больше порога или нет, а потом солжить.
     
  20. Alex19

    Alex19 Гуру

    Другое дело. Как я понял мы просто проверяем реакцию нажатия кнопки, если человек успел в заданный промежуток, мы увеличиваем scl, если нет увеличиваем lcl.

    Почему я Вас пытал (по другому не назовешь), мне было не понятно следующее:
    зачем второй pulseIn на 1 и туже кнопку, почему первый pulseIn ждет 1 сек., а второй 2 сек. и соответственно t2, dcl, dlcl (последние 2 переменные ни где не используются). Теперь стало понятно, что все это лишнее.

    Код (C++):
    #define BUTTON 8
    #define edge 110 //110 - граница долгого и короткого клика
    #define zero 0 // просто 0

    unsigned long t1;
    int lcl, scl;

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);

      pinMode(BUTTON, INPUT);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      t1 = pulseIn(BUTTON, HIGH) / 1000UL;
      if(t1 <= edge && t1 > zero)
      {
        scl++;
      }
      else
      {
        lcl++;
      }

      Serial.print(scl);
      Serial.print("||");
      Serial.println(lcl);
    }