Помогите разобраться с элементарным кодом

Тема в разделе "Микроконтроллеры AVR", создана пользователем Sokoloff, 1 ноя 2015.

  1. Sokoloff

    Sokoloff Нуб

    День жизни потерял. Смотрю на элементарный код - не могу понять почему не работает...
    Нужно что бы Ардуино мигала светодиодом. Функция delay(), циклы не подходят, т к. Ардуино должна еще мониторить 2 кнопки и запускать серву. Опыт программирования только Паскаль. Логика кода вроде правильная, хоть убей не понимаю где ошибка.Осознаю, что код громоздкий, но мне важно сейчас именно разобраться как что работает, а не делать как удобней. Помогите пожалуйста найти ошибку, и по возможности посоветуйте менее громоздкий вариант кода.
    Ардуино УНО
    Arduino IDE 1.6.3
    На скейч реагирует постоянным горением светодиода
    Код (C++):
    #define LED_PIN 13
    int i = 0;  //Счетчики
    int q = 0;
    boolean signalka = true; //Предположим сигнализация включена
    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
    }
    void loop()
    {
      if (signalka) //сигнализация условно включена
      {
        if (i < 10000) //светодиод должен гореть 10000 повтора цикла ЛУП
        {
          digitalWrite(LED_PIN, signalka); //Зажигаем СД
          ++i;                              //Увеличиваем счетчик i на единицу
        } else if (i = 10000)              //когда счетчик становиться равным 10000, нужно потушить СД
        {
          q = 0;                           //Обнуляем второй счетчик - теперь СД должен не гореть 10000 повтора ЛУП
          ++i;                             //Увеличиваем счетчик i на единицу, что бы не обнулился счетчик q при следующем повторе ЛУП...
        } else                             //...поэтому при следующем повторе ЛУП мы поподаем на эту часть кода

          if (q < 10000)                   //Аналогично, СД НЕ должен гореть 10000 повторов ЛУП
          {
            digitalWrite(LED_PIN, !signalka);  //Передаем на СД сигнал "Туши свет".
            ++q;                               //Увеличиваем счетчик на единицу.
          } else if (q = 10000)                //Сюда мы попадаем когда прошло 10000 повторов ЛУП "без света"
          {
            i = 0;                           //Обнуляем счетчик i, что бы при следующем повторе ЛУПа зажечь СД
          }
      }
    }
     
  2. Megakoteyka

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

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

    DrProg Вечный нерд

    Код (C++):
    else if (i = 10000)
    Этот оператор не сравнивает i с 10000, а записывает 10000 в i. Возможно причина тут. Правильно (i == 10000).

    И вообще используйте millis() а не пустые циклы.
     
    ИгорьК и Sokoloff нравится это.
  4. geher

    geher Гуру

    1. Типичная ошибка для языка С/С++
    Код (Text):

    if (i = 10000)
    if (q = 10000)
     
    Данные условия всегда верны и при этом приводят к присваиванию значения переменной.
    Для сравнения надо использовать оператор == (два знака =).

    А еще такой код будет пролетать мухой. Не думаю, что при таких количествах циклов будет вменяемое мигание, надо на порядки побольше, если millis() использовать не позволяют убеждения.
     
    Sokoloff нравится это.
  5. Sokoloff

    Sokoloff Нуб

    Блин!!! Я и не знал что в С++ оператор присваивания в if может использоваться!!!
    Мигает как и надо. Частоту на глаз поставил))) Вообщем "все достаточно элементарно")))
    Всем спасибо!!!
     
  6. Megakoteyka

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

    В if может использоваться любое выражение, которое имеет какое-то значение. Если результат выражения не равен 0, то компилятор считает выражение истинным. Например:
    Код (C++):
    int x;
    if((x = getX()) == 5)
    {
      ...
    }
     
  7. Tomasina

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

    ага, помнится, при просмотре какого-то проекта встретилось выражение вида
    Код (C++):
    if(y+x++ + ++y+x != 32)
    Даже не сразу было понятно как оно работает, пришлось брать карандашик и бумажку :)
     
  8. DrProg

    DrProg Вечный нерд

    А вот интересно, где такое выражение реально используется?
     
    ИгорьК нравится это.
  9. на собеседованиях!

    Некоторые программисты, чтобы избежать проблемы в if ставят аргументы наоборот, если сравнивают с константой:
    Код (C++):
    if (42 == answer) {

    }
    компилятор или интерпретатор ловят и взывают к разуму.
     
  10. Tomasina

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

    это станок упаковки каких-то изделий, сначала сборка ленты - подача с 4х лотков по 4х8 штук, затем собранное сместить вверх-назад-вверх, и опять по 4х8. И так до 18 вертикальных рядов, потом обрезка и отсчет заново.
    Он был переделан из чего-то там древнего и сбоку прилеплена ардуина :)