Где может быть ошибка кода?

Тема в разделе "Arduino & Shields", создана пользователем sanik, 8 окт 2013.

  1. sanik

    sanik Гик

    void RunMotor1(byte a)
     
  2. sanik

    sanik Гик

    Понял он теперь на это ругается шаг 10 как с ним быть? надо как то скорость задать и эта скорость не длжна зависеть от потенциометра..
    Код (Text):
          break;
          case STEP_10MOT:
          // отсчет таймера pauseValue
          control = analogRead(pin_Rd);
          if(control>= 540 && control <= 550)// если положение 1 - крутить в направлении 1
          for(a = 25 ; a <= 150; a+=30) // плавный разгон
          a *= 4; // так как значение а на пине делим на 4 соответсвено умножаем на 4
          RunMotor1();
          if(control>= 450 && control <= 460)// если положение 2 - крутить в направлении 2
          for(a = 25 ; a <= a; a+=30) // плавный разгон
          a *= 4; // так как значение а на пине делим на 4 соответсвено умножаем на 4
          RunMotor2();
          if (pulse == posValue)//достигли значение
          {
          pulse=0; // сброс счетчика на 0
          StopMotor();
          }
          //считаем количество импульсов
          // время вышло
          // StopMotor();
          {
            currentStep = STEP9_EXP; //Переходим к шагу 9
          }
          if(bouncerBtnStop.read() == HIGH)
          StopMotor();
          lcd.setCursor(0,0);lcd.print("    Manyal  ");
          lcd.setCursor(0,1);lcd.print("Stop shooting");
          {
            currentStep = STEP2_GET_POTS; //Переходим к шагу 2
          }
          break;
      }
     
  3. lerik2703

    lerik2703 Гик

    Код (Text):
     for(a = 25 ; a <= 150; a+=30) // плавный разгон
    а зачем вы в цикле используете глобальную переменную ? только локальная

    Код (Text):
    for(int x = 25; x<=150; x +=30){
      RunMotor1(x);
      delay(10);
    }
     
     
    Последнее редактирование: 27 окт 2013
  4. sanik

    sanik Гик

    До меня уже дошло только что пробовал написать:)
    А разве delay();здесь уместно я думал при использовании прерываний её не нужно использовать.
     
  5. sanik

    sanik Гик

    Ну что осталось в этом цикле добить концевики.
    control = analogRead(pin_Rd);// чтение кнцевика
    if(control>= 540 && control <= 550)// если положение 1
    // запрещаем крутить мотор в направлении 1
    if(control>= 450 && control <= 460)// если положение 2
    //запрещаем крутить мотор в направлении 2
     
  6. sanik

    sanik Гик

    Что то как то так? как снимать флаг и надо ли его здесь снимать?
    Код (Text):

      case STEP2_GET_POTS:
      lcd.setCursor(0,0);
      lcd.print("  Manyal  ");
       
      potValue = analogRead(pin_dist);
      if(potValue >= 480 && potValue <= 530)
      {
      StopMotor();
      }
      else if(potValue <= 490)
      {
      RunMotor1(map(potValue, 0, 490, 255, 10));
      }
      else if(potValue >= 530)
      {
      RunMotor2(map(potValue, 530, 1023, 10, 255));
      }
      control = analogRead(pin_Rd);// чтение кнцевика
      stop1 = control>= 540 && control <= 550; //есть сигнал с концевика 1
      // запрещаем крутить мотор в направлении 1
      stop2 = control>= 450 && control <= 460; //есть сигнал с концевика 2
      //запрещаем крутить мотор в направлении 2

      if(bouncerBtnSelect.read() == HIGH)// проверяем, нажата ли кнопка
      currentStep = STEP3_GET_POSITION; //переходим к шагу 3
       
      break;
     
     
  7. lerik2703

    lerik2703 Гик

    иначе смысл от цикла. проскочит и не заметно будет плавности пуска :)
    внутри функции в нашем случаи handleInt0()
    их вообще надо проверять при каждом пуске мотора! по этому удобней проверку в функцию упаковать !:rolleyes:
     
    sanik нравится это.
  8. sanik

    sanik Гик

    Хорошо так и сделаем.
    А что делать с этим? //запрещаем крутить мотор в направлении 2
     
  9. sanik

    sanik Гик

    Упаковали
    Код (Text):
    }
    void limit1()
    {
      control = analogRead(pin_Rd);
      stop1 = control>= 540 && control <= 550; //есть сигнал с концевика 1
    }
    void limit2()
    {
      control = analogRead(pin_Rd);
      stop2 = control>= 450 && control <= 460;
    }
    Код (Text):
      case STEP2_GET_POTS:
        lcd.setCursor(0,0);
        lcd.print("    Manyal  ");
       
        potValue = analogRead(pin_dist);
        if(potValue >= 480 && potValue <= 530)
        {
          StopMotor();
        }
        else if(potValue <= 490)
        {
          RunMotor1(map(potValue, 0, 490, 255, 10));
        }
        else if(potValue >= 530)
        {
          RunMotor2(map(potValue, 530, 1023, 10, 255));
        }
        limit1();// чтение кнцевика
        // запрещаем крутить мотор в направлении 1
        limit2();
        //запрещаем крутить мотор в направлении 2

        if(bouncerBtnSelect.read() == HIGH)// проверяем, нажата ли кнопка
        currentStep = STEP3_GET_POSITION; //переходим к шагу 3
     
  10. lerik2703

    lerik2703 Гик

    наверно завтра об этом подумаю !
    почти правильно ;) функцию будем с возвратом оформлять значит


    Код (Text):
    boolean limit1()
    {
      control = analogRead(pin_Rd);
      return  control>= 450 && control <= 460;
    }
    это пример функции с возвратом :) как я уже писал раньше концевик это механическая вещь возможны ложные срабатывания.. дребезг все таки :( !
     
  11. sanik

    sanik Гик

    Значит и это убирать?
    Код (Text):
    boolean stop1 = false;// флаг для концевиков
    boolean stop2 = false;
     
  12. sanik

    sanik Гик

    Исправил:)
     
  13. sanik

    sanik Гик

    Тут посидел полапатил, насчет работы с таймером, правильно разобрался?
    Код (Text):

    #define pin_foc 8
    #define pin_shot 9
    unsigned long currentTime;
    unsigned long TimePause,TimeExposure;
    int exposValue = 0; // значение времени экспозиции
    // максимальные значения для времени экспозиции
    #define MAX_EXPOSURE_VALUE  20000
    void setup()
    {
    currentTime = millis(); // считываем время, прошедшее с момента запуска программы
    TimePause = currentTime;  // таймер паузы
    TimeExposure = currentTime; //таймер эксозиции
    pinMode (pin_foc, OUTPUT);
    pinMode (pin_shot, OUTPUT);
    }

    void loop()
          case STEP9_EXP:
          lcd.setCursor(0,0); lcd.print("Start shooting");
          lcd.setCursor(0,1);lcd.print("shut shots");lcd.print(shootValue);
          currentTime = millis();// считываем время, прошедшее с момента запуска программы
          digitalWrite (pin_foc, HIGH);
          // задержка 20 мс.
          digitalWrite (pin_shot, HIGH);
          // Отсчет кличества кадров
          // значение кадров достигнуто выставленному Переходим к шагу 2
          if(TimeExposure >= (exposValue))  // сравниваем текущий таймер с переменной exposValue
          digitalWrite (pin_foc, LOW);
          digitalWrite (pin_shot, LOW);
          {
            currentStep = STEP_10MOT;
          }
         
          if(bouncerBtnStop.read() == HIGH)
          digitalWrite (pin_foc, LOW);
          digitalWrite (pin_shot, LOW);
          lcd.setCursor(0,0);lcd.print("    Manyal  ");
          lcd.setCursor(0,1);lcd.print("Stop shooting");
          {
            currentStep = STEP2_GET_POTS; //Переходим к шагу 2
          }
          TimeExposure = currentTime; // в currentTime записываем новое значение
          break;
     
  14. Megakoteyka

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

    Слишком мало аргументов передается в функцию.
    Код (Text):
    void func(int a, int b)
    {
    }
    ...
    func(1);
    Компилятор выдает ошибку, т.к. ожидает, что в функцию будет передано 2 параметра, а передается всего один.

    P.S. Чтобы понять, на что ругается компилятор, просто скормите текст ошибки (без уточнений типа названия своего скетча, номера строки и имени функции) гуглу - ответ будет в нескольких первых ссылках. Например, для Вашей ошибки следует искать текст "error: too few arguments to function".
     
  15. lerik2703

    lerik2703 Гик

    идея Megakoteyka заключалась в следующим! имеет жизнь проверить на железе стоит !

    Код (Text):
    // номера пинов мотора
    #define pin_A 10
    #define pin_B 11
    #define pin_ENABLE 12
    int potValue  = 0;
    // пин потенциометра
    #define pin_dist A1
    boolean stop1 = false;
    boolean stop2 = false;
    int control;
    void setup(){
      pinMode (pin_A, OUTPUT);
      pinMode (pin_B, OUTPUT);

     
              }


    void loop()
    {
      potValue = analogRead(pin_dist);


      if(potValue >= 480 && potValue <= 530)
      {
        StopMotor();
     }
      else if(potValue <= 490 && !stop1){
     
      RunMotor1(map(potValue, 0, 490, 255, 10));
     }
      else if(potValue >= 530 && !stop2 )
      RunMotor2(map(potValue, 530, 1023, 10, 255));
     }

      stop1 = control>= 540 && control <= 550; //есть сигнал с концевика 1
      stop2 = control>= 450 && control <= 460; //есть сигнал с концевика 2

    }


    void RunMotor1(byte a)
    {
      digitalWrite (pin_A, LOW);
      digitalWrite(pin_B, HIGH);
      analogWrite(pin_ENABLE,a);
    }
    void RunMotor2(byte a)
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
      analogWrite(pin_ENABLE,a);
    }
    void StopMotor()
    {
      analogWrite(pin_ENABLE,0);
    }
     
    Последнее редактирование: 27 окт 2013
  16. lerik2703

    lerik2703 Гик

    скорее всего наблюдалось отсутствие параметров :) вызов RunMotor1() по всему скетчу а в моем примере я уже передал параметр в функцию!:oops:
     
  17. sanik

    sanik Гик

    Эту ошибку я давно нашел и исправил:) ... Вы мне лучше подскажите проавильно ли ч понял как использовать таймеры?
     
  18. sanik

    sanik Гик

    Я обычно в гугле и смотрю с этой ошибкой разобрался давно... Посмотрите пожалуйста правильно ли я понял как работать с таймером? http://forum.amperka.ru/threads/Где-может-быть-ошибка-кода.2047/page-15#post-16255
     
  19. sanik

    sanik Гик

    Ну вроде с ручным режимом все можно продвигаться дальше.:)
     
  20. lerik2703

    lerik2703 Гик

    Код (Text):

    int exposValue = 0; // значение времени экспозиции
    ...
    if(TimeExposure >= (exposValue))  // сравниваем текущий таймер с переменной exposValue
    а что вы представляете эту строку ? возвращена будет Всегда истина!

    скорей отправить на тест [​IMG]