Одновременное выполнение нескольких задач

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

  1. Mihej

    Mihej Нерд

    Всем привет! Кто знает как двигать несколькими сервами в ArduinoIDE одновременно, т.е. одновременное выполнение нескольких задач? Примеры кода или в какую сторону мне копать?
     
  2. Megakoteyka

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

    Копать в сторону отказа от использования delay().
    Временные интервалы засекайте функцией millis(), храня начало интервала в отдельной переменной.
     
  3. Mihej

    Mihej Нерд

    Получается, что я должен в одном временном интервале запустить несколько задач, чтобы достич их одновременного выполнения?
     
  4. Megakoteyka

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

    Код (Text):
    #define INTERVAL1 500
    #define INTERVAL2 1000

    long _startTime1;
    long _startTime2;

    void setup()
    {
      Serial.begin(9600);
      _startTime1 = _startTime2 = millis();
    }

    void loop()
    {
      long currentTime = millis();
      if(currentTime >= _startTime1 + INTERVAL1)
      {
        Serial.print("TASK1 at ");
        Serial.println(currentTime);
        _startTime1 = currentTime;
      }
      if(currentTime >= _startTime2 + INTERVAL2)
      {
        Serial.print("TASK2 at ");
        Serial.println(currentTime);
        _startTime2 = currentTime;
      }
    }
    Поиграйте значениями INTERVAL1 и INTERVAL2 и посмотрите, как будет меняться поведение.
     
  5. Zaic

    Zaic Нерд

    Можно использовать прерывание.
    Код (Text):

    #include <ve_avr.h>
    //Инициализация прерывания
    DEV_TIMER2.setClockSelect(Prescaler2::Prescaler_64);  
    DEV_TIMER2.setWaveGenMode(Timer2::FastPWM);
    DEV_TICTRL2.outCompIntEnableA();

    ISR(TIMER2_COMPA_vect)  
    {
    Процедура обработки прерывания
    дергает через ~1 mC
    }
     
    Вам потребуется библиотека VEduino
    У меня была задача одновременно и медленно вращать 8 сервомашинками. Еще опрашивать кнопки и моргать светодиодами.
    Все это было реализовано на прерывании.(Arduino UNO)
     
  6. Megakoteyka

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

    Для того, чтобы строить всю работу на прерывании таймера, необходимо, чтобы время исполнения каждой задачи делилось без остатка на интервал таймера. В противном случае приходится использовать опрос таймера либо запускать несколько таймеров (если они есть).
    Кнопки, кстати, тоже не обязательно опрашивать - можно повесить обработчик прерывания на изменение уровня сигнала на некоторых пинах - тогда обработчик будет вызываться только при нажатии кнопки, необходимость опроса отпадет и у контроллера появится дополнительное время на выполнение более важных дел.