Помогите

Тема в разделе "Флудилка", создана пользователем voolf777, 3 сен 2015.

  1. voolf777

    voolf777 Нуб

    можно ли замерить время между двумя сигналами пришедшими на порт? И если да то как?
     
  2. Unixon

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

    В лоб:
    Код (Text):

    unsigned long t1,t2,dt;
    while (!digitalRead(PIN_SENSE));
    t1 = millis();
    while (digitalRead(PIN_SENSE));
    while (!digitalRead(PIN_SENSE));
    t2 = millis();
    while (digitalRead(PIN_SENSE));
    dt = t2-t1;
    Serial.print("dt = ");
    Serial.println(dt);
     
    В затылок:
    Код (Text):

    #define STATE_WAIT_1_START 0
    #define STATE_WAIT_1_END   1
    #define STATE_WAIT_2_START 2
    #define STATE_WAIT_2_END   3
    #define STATE_DONE         4

    unsigned long t1,t2,dt;
    byte st = STATE_WAIT_1_START;

    void check_signal()
    {
      switch (st)
      {
       case STATE_WAIT_1_START:
       {
        if (digitalRead(PIN_SENSE))
        {
         t1 = millis();
         st = STATE_WAIT_1_END;
        }
        break;
       }
       case STATE_WAIT_1_END:
       {
        if (!digitalRead(PIN_SENSE))
        {
         st = STATE_WAIT_2_START;
        }
        break;
       }

      switch (st)
      {
       case STATE_WAIT_2_START:
       {
        if (digitalRead(PIN_SENSE))
        {
         t2 = millis();
         st = STATE_WAIT_2_END;
        }
        break;
       }
       case STATE_WAIT_2_END:
       {
        if (!digitalRead(PIN_SENSE))
        {
         dt = t2 - t1;
         st = STATE_DONE;
        }
        break;
       }
       default: break;
      }
    }

    void loop()
    {
      check_signal()
      if (STATE_DONE==st)
      {
       Serial.print("dt = ");
       Serial.println(dt);
       st = STATE_WAIT_1_START;
      }
    }
     
     
    voolf777 нравится это.
  3. DrProg

    DrProg Вечный нерд

    А еще есть функция pulseIn().
    :rolleyes:
     
    ИгорьК и voolf777 нравится это.
  4. Unixon

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

    Это практически первый вариант, только с таймаутом.
     
  5. voolf777

    voolf777 Нуб

    Я пойму если тебе лень ответить но все же) можешь комментарии к коду написать? и как понять в лоб и в затылок?
     
  6. geher

    geher Гуру

    В лоб - оно в лоб и есть.
    Ожидается начало импульса:
    while (!digitalRead(PIN_SENSE));
    Т.е. ждет, пока с пина читается 0 (LOW).
    Фиксируется значение внутреннего счетчика времени:
    t1 = millis();
    Ожидается завершение импульса:
    while (digitalRead(PIN_SENSE));
    Т.е. ждет, пока с пина читается HIGH.
    Ожидается начало следующего импульса:
    while (!digitalRead(PIN_SENSE));
    Фиксируется значение внутреннего счетчика времени в другую переменную:
    t2 = millis();
    Ожидается завершение импульса (в свете задачи измерения длительности одиночного импульса действие не особо нужное, но чтобы можно было провести корректно измерение в следующий раз):
    while (digitalRead(PIN_SENSE));
    Вычисляется разница между отсечками, которая и даст длительность импульса в миллисекундах.
    dt = t2-t1;

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

    Есть, кстати, еще способ. Подходит только для измерения на пине, на котором можно повесить прерывание.
    Вывешивается означенное прерывание на пин по любому событию (FALLING, RISING, можно и CHANGE, но это необоснованно усложняет задачу, хотя дает дополнительный бонус).
    В обработчике прерывания фиксируем значение micros() или millis() (в зависимости от требуемой точности измерений) и определяем разницу с предыдущей засечкой, которую скидываем в какую-нибудь глобальную переменную (можно даже в массив, чтобы видеть неравномерность следования импульсов).
    В случае CHANGE придется также смотреть состояние пина, вызвавшего прерывание, чтобы вычислять разницу между одинаковыми событиями (появление или пропадание импульса). Вместе с тем появляется возможность измерять при помощи прерываний и длительность импульса.
     
  7. Unixon

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

    Самый правильный метод, кстати. По аналогии его можно назвать "в мозг". xD