Замена millis на micros
- Войдите на сайт для отправки комментариев
Сб, 17/06/2017 - 09:01
Как произвести замену 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");
}
}
}
Как произвести замену millis на micros в данном коде:
Руками, нажимая кнопки на клавиатуре. Стереть millis() и написать micros().
А если будет каприз чтоб еще и работало, то умножить CONTROL_PERIOD на 1000.
Как произвести замену millis на micros в данном коде:
Руками, нажимая кнопки на клавиатуре. Стереть millis() и написать micros().
Это совсем для убогих . Ctrl+F и набрать меняем это на это заменить все
Ctrl+F и набрать меняем это на это заменить все
Не наш метод!
Ctrl+F и набрать меняем это на это заменить все
Ctrl+H же, епте...
Жмем WIN потом → и потом Enter
Ctrl+H же, епте...
В Ардуино IDE?
Изучать матчасть до полного просветления!
В Ардуино IDE?
Изучать матчасть до полного просветления!
в текстовом редакторе.
ты в Дуино ИДЕ набираешь текст кода? поздравляю, ты - лох.
в текстовом редакторе.
Брысь на форум текстовых редакторов!!! Пока за ересь и сектантство на костёр не потащили.
А матчасть-то всё равно учи, невежда!
Notepad++ наше всё!
Брысь на форум текстовых редакторов!!! Пока за ересь и сектантство на костёр не потащили.
А матчасть-то всё равно учи, невежда!
иди в пень, лох.
Notepad++ наше всё!
или Sublime Text
Меня пока устраивает штатный редактор. И привык к нему. А если буду бегать от одного редактора до другого запутаюсь в пакетах файлов. А нотепад++ я использую, что бы глянуть на левые не мои файлы , h,cpp
иди в пень, лох.
Обкакамшись, а обтекать не хоцца. Ничо. "С отцами бывало, и с нами бывает".
Пробовал тупо менять millis на micros, получил некорректный результат
Например, если получал время 6 миллисекунд, и это соответствовало реальности (проверял на осциллографе), то поменяв на микросекунды я должен был получить 6000, но получил 16
Обкакамшись, а обтекать не хоцца. Ничо. "С отцами бывало, и с нами бывает".
Ворота, ты - лох.
#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 изменится тоже на микросекунды? (если изменится, то возможно сигнал прерывался раньше, чем надо, из-за этого неверный результат)
Как произвести замену millis на micros в данном коде:
DmitryR, к сожалению, Вы не написали, чего Вы такой заменой хотите добиться.
Соответственно, постановка задачи отсутствует, следовательно, нет предмета для обсуждения.
А это неизбежно влечет за собой заполнение темы флудом, что мы и наблюдаем.
Измеряется длительность сигнала компаратора от момента возникновениясигнала до момента когда на выходе будет постоянная величина. В данном коде измерение происходит в миллисекундах, хотелось бы получать результат в микросекундах, т.к. существенно повысится точность
в 9й строке 5ul изменится тоже на микросекунды?
Я #2 писал чтоб Вы его игнорили и переспрашивали два раза?
(если изменится, то возможно сигнал прерывался раньше, чем надо, из-за этого неверный результат)
Этот бред нуждается в толковании опытного спиритуалиста.
в 9й строке 5ul изменится тоже на микросекунды? (если изменится, то возможно сигнал прерывался раньше, чем надо, из-за этого неверный результат)
Вопрос некорректный. CONTROL_PERIOD это не миллисекунды и не микросекунды. Это просто число, которое подставляется в условие и с которым сравнивается количество прошедших миллисекунд или микросекунд.
Если ты работаешь с микросекундами, то и пиши туда сколько микросекунд должно пройти.