Замена millis на micros

DmitryR
Offline
Зарегистрирован: 12.05.2017

Как произвести замену millis на micros в данном коде:
 

#define SIGNAL_PIN  3

///////////////////////////////////
//
//  Время ожидания продолжения сигнала в миллисекундах
// Если за это время уровень ни разу не стал LOW, 
// то считаем, что сигнал прекратился
//
#define CONTROL_PERIOD  5ul

///////////////////////////////////
//
// Возможные состояния измерителя
//
enum METER_STATES {
  WAITING_FOR_SIGNAL = 0, // Ждём LOW на сигнальный пин
  MEASURING,  // Измеряем
  READY // Закончили, результат готов
};

//////////////////////////////////
//
//  Переменная для хранени текущего состояния измерителя
// Изначальное состояние - ожидание нажатия кнопки
//
static volatile METER_STATES meterState = WAITING_FOR_SIGNAL;

//////////////////////////////////
//
// Переменные для хранения времени начала отсчёта
// и времени окончания отсчёта (пропадания сигнала)
//
static volatile unsigned long startSignalTime = 0, endSignalTime = 0;

//////////////////////////////////
//
// Функция - обработчик поступающего во 
// время измерения сигнала. Выполняется,
// когда на сигнальном пине появляется HIGH
//
void measureISR(void) {
  endSignalTime = millis(); // просто запоминем время
}

//////////////////////////////////
//
// Функция 
//
void waitingISR(void) {
  startSignalTime = endSignalTime = millis(); // запоминаем время
  detachInterrupt(SIGNAL_PIN - 2);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, measureISR, FALLING);
  meterState = MEASURING; // Изменяем состояние на "измеряем"
}

void setup(void) {
  Serial.begin(115200);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, waitingISR, RISING);
}

void loop(void) {
  if (meterState == MEASURING) {
      //
      // Проверяем, что с момент последнего HIGH 
      // прошло >= CONTROL_PERIOD миллисекунд
      //
      if (millis() - endSignalTime >= CONTROL_PERIOD) {
        //
        // если прошло, то заканчиваем измерения
        //
        detachInterrupt(SIGNAL_PIN - 2);
      meterState = READY; // закончили
      Serial.print("Result is: ");
      Serial.print(endSignalTime - startSignalTime);
      Serial.println(" milliseconds");
      }
  }
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

DmitryR пишет:

Как произвести замену millis на micros в данном коде:

Руками, нажимая кнопки на клавиатуре. Стереть millis() и написать micros().

Logik
Offline
Зарегистрирован: 05.08.2014

А если будет  каприз чтоб еще и работало, то умножить CONTROL_PERIOD на 1000.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Jeka_M пишет:

DmitryR пишет:

Как произвести замену millis на micros в данном коде:

Руками, нажимая кнопки на клавиатуре. Стереть millis() и написать micros().

Это совсем для убогих . Ctrl+F  и набрать меняем это на это  заменить все

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

Ctrl+F  и набрать меняем это на это  заменить все

Не наш метод!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

qwone пишет:

Ctrl+F  и набрать меняем это на это  заменить все

Ctrl+H же, епте...

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

Клапауций 112 пишет:
Ctrl+H же, епте...

Жмем WIN потом → и потом Enter

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Клапауций 112 пишет:

Ctrl+H же, епте...

В Ардуино IDE?

Изучать матчасть до полного просветления!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Ворота пишет:

В Ардуино IDE?

Изучать матчасть до полного просветления!

в текстовом редакторе.

ты в Дуино ИДЕ набираешь текст кода? поздравляю, ты - лох.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Клапауций 112 пишет:

в текстовом редакторе.

Брысь на форум текстовых редакторов!!! Пока за ересь и сектантство на костёр не потащили.

А матчасть-то всё равно учи, невежда!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Notepad++ наше всё!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Ворота пишет:

Брысь на форум текстовых редакторов!!! Пока за ересь и сектантство на костёр не потащили.

А матчасть-то всё равно учи, невежда!

иди в пень, лох.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Jeka_M пишет:

Notepad++ наше всё!

или Sublime Text

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Меня пока устраивает штатный редактор. И привык к нему. А если буду бегать от одного редактора до другого запутаюсь в пакетах файлов. А нотепад++ я использую, что бы глянуть на левые не мои файлы , h,cpp

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Клапауций 112 пишет:

иди в пень, лох.

Обкакамшись, а обтекать не хоцца. Ничо. "С отцами бывало, и с нами бывает".

DmitryR
Offline
Зарегистрирован: 12.05.2017

Пробовал тупо менять millis на micros, получил некорректный результат
Например, если получал время 6 миллисекунд, и это соответствовало реальности (проверял на осциллографе), то поменяв на микросекунды я должен был получить 6000, но получил 16

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Ворота пишет:

Обкакамшись, а обтекать не хоцца. Ничо. "С отцами бывало, и с нами бывает".

Ворота, ты - лох.

DmitryR
Offline
Зарегистрирован: 12.05.2017

#define SIGNAL_PIN  3

///////////////////////////////////
//
//  Время ожидания продолжения сигнала в миллисекундах
// Если за это время уровень ни разу не стал LOW, 
// то считаем, что сигнал прекратился
//
#define CONTROL_PERIOD  5ul

///////////////////////////////////
//
// Возможные состояния измерителя
//
enum METER_STATES {
  WAITING_FOR_SIGNAL = 0, // Ждём LOW на сигнальный пин
  MEASURING,  // Измеряем
  READY // Закончили, результат готов
};

//////////////////////////////////
//
//  Переменная для хранени текущего состояния измерителя
// Изначальное состояние - ожидание нажатия кнопки
//
static volatile METER_STATES meterState = WAITING_FOR_SIGNAL;

//////////////////////////////////
//
// Переменные для хранения времени начала отсчёта
// и времени окончания отсчёта (пропадания сигнала)
//
static volatile unsigned long startSignalTime = 0, endSignalTime = 0;

//////////////////////////////////
//
// Функция - обработчик поступающего во 
// время измерения сигнала. Выполняется,
// когда на сигнальном пине появляется HIGH
//
void measureISR(void) {
  endSignalTime = micros(); // просто запоминем время
}

//////////////////////////////////
//
// Функция 
//
void waitingISR(void) {
  startSignalTime = endSignalTime = micros(); // запоминаем время
  detachInterrupt(SIGNAL_PIN - 2);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, measureISR, FALLING);
  meterState = MEASURING; // Изменяем состояние на "измеряем"
}

void setup(void) {
  Serial.begin(115200);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, waitingISR, RISING);
}

void loop(void) {
  if (meterState == MEASURING) {
      //
      // Проверяем, что с момент последнего HIGH 
      // прошло >= CONTROL_PERIOD миллисекунд
      //
      if (micros() - endSignalTime >= CONTROL_PERIOD) {
        //
        // если прошло, то заканчиваем измерения
        //
        detachInterrupt(SIGNAL_PIN - 2);
      meterState = READY; // закончили
      Serial.print("Result is: ");
      Serial.print(endSignalTime - startSignalTime);
      Serial.println(" microseconds");
      }
  }
}

Пробовал такой код, выдаёт не правильный результат. 
Поменял все millis на micros,
в 9й строке 5ul изменится тоже на микросекунды? (если изменится, то возможно сигнал прерывался раньше, чем надо, из-за этого неверный результат)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DmitryR пишет:

Как произвести замену millis на micros в данном коде:

DmitryR, к сожалению, Вы не написали, чего Вы такой заменой хотите добиться. 

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

А это неизбежно влечет за собой заполнение темы флудом, что мы и наблюдаем.

DmitryR
Offline
Зарегистрирован: 12.05.2017

Измеряется длительность сигнала компаратора от момента возникновениясигнала до момента когда на выходе будет постоянная величина. В данном коде измерение происходит в миллисекундах, хотелось бы получать результат в микросекундах, т.к. существенно повысится точность

Logik
Offline
Зарегистрирован: 05.08.2014

DmitryR пишет:

в 9й строке 5ul изменится тоже на микросекунды?

Я #2 писал чтоб Вы  его игнорили и переспрашивали два раза?

DmitryR пишет:


(если изменится, то возможно сигнал прерывался раньше, чем надо, из-за этого неверный результат)

Этот бред нуждается в толковании опытного спиритуалиста.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

DmitryR пишет:

в 9й строке 5ul изменится тоже на микросекунды? (если изменится, то возможно сигнал прерывался раньше, чем надо, из-за этого неверный результат)

Вопрос некорректный. CONTROL_PERIOD это не миллисекунды и не микросекунды. Это просто число, которое подставляется в условие и с которым сравнивается количество прошедших миллисекунд или микросекунд.

Если ты работаешь с микросекундами, то и пиши туда сколько микросекунд должно пройти.