Управляемые таймеры на ARDUINO

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Не нашёл ответа, как создавать управляемые таймеры на ARDUINO, если это в принципе возможно  , таймер должен стартовать по  управляющему сигналу, иметь возможность программироваться с клавиатуры и таких таймеров должно быть с десяток или это нереальная задача (временные уставки от 1 до 600 секунд)            

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а что ты называешь таймерами? похоже не то что я понимаю. срабатывание по времени?

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

10 - не так уж и много... и можно по истечении, можно как угодно... 

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

unsigned long loopTime = 0, currentTime = 0;


int INTERVAL_1 = 0, INTERVAL_2 = 0; // твои счетчики

void setup() 
{
    // Назначения пинов
    
}

void loop() 
{
    // Обработчики кнопок

//////////////////////////////////////////////////////////////////////////
    
    currentTime = millis();
    
    // Работает пока INTERVAL_1 миллисекунд не закончился
    if(currentTime <= (loopTime + INTERVAL_1)) {   
        loopTime = currentTime;
        // код первого таймера
    }
  
    // Работает пока INTERVAL_2 миллисекунд не закончился
    if(currentTime <= (loopTime + INTERVAL_2)) {   
        loopTime = currentTime;
        // код второго таймера
    }  

    // и т.д.
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

p.masyukov, переименовался из qwone, а ошибки те же :)

Должно быть так:

if (currentTime - loopTime > INTERVAL)

 

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

ua6em пишет:

Не нашёл ответа, как создавать управляемые таймеры на ARDUINO, если это в принципе возможно  , таймер должен стартовать по  управляющему сигналу, иметь возможность программироваться с клавиатуры и таких таймеров должно быть с десяток или это нереальная задача (временные уставки от 1 до 600 секунд)            

Почему, реально. Начало p.masyukov привел. Но пока это сыровато. А отшлифованый (мной ) народ не воспринимает. Но мне по х..

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Andy пишет:

p.masyukov, переименовался из qwone, а ошибки те же :)

Должно быть так:

if (currentTime - loopTime > INTERVAL)

 

Я не знаю что такое qwone. Чтобы такие предположения не делать - посмотри дату регистрации.

А код - 200% правильный и рабочий!!! 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

qwone пишет:

ua6em пишет:

Не нашёл ответа, как создавать управляемые таймеры на ARDUINO, если это в принципе возможно  , таймер должен стартовать по  управляющему сигналу, иметь возможность программироваться с клавиатуры и таких таймеров должно быть с десяток или это нереальная задача (временные уставки от 1 до 600 секунд)            

Почему, реально. Начало p.masyukov привел. Но пока это сыровато. А отшлифованый (мной ) народ не воспринимает. Но мне по х..

Что сыровато? Конкретно то что и просили. Да еще и готовый шаблон.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

jeka_tm пишет:

а что ты называешь таймерами? похоже не то что я понимаю. срабатывание по времени?

есть к примеру несколько микросхем (блоков) таймеров, набирая в наборном поле значение программа для каждого из них делает свои установки (меняются редко, при настройке оборудования, наверное желательно созранять в энергонезависимой памяти), каждый из таймеров запускается соответствующим кодом программы, при отработке таймера вызывается вектор прерывания и вызывается программа обрабатывающая именно этот таймер (так работает устройство на жёсткой логике)

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

Andy пишет:

p.masyukov, переименовался из qwone, а ошибки те же :)

Должно быть так:

if (currentTime - loopTime > INTERVAL)

Вот еще д.. (неодекватный человек). Он еще верит что процессор может сравнивать числа.  Ну не сравнивает процессор числа между собой.  Если есть такое выражение (A<B)  то производится операция (А-В ) и потом уже флаги Z (равенство 0) и старший бит результата. (если он 1 то то число больше) .  Но лилипуты воюют как бить яйца: с тупой или с острой стороны.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

ua6em пишет:

jeka_tm пишет:

а что ты называешь таймерами? похоже не то что я понимаю. срабатывание по времени?

есть к примеру несколько микросхем (блоков) таймеров, набирая в наборном поле значение программа для каждого из них делает свои установки (меняются редко, при настройке оборудования, наверное желательно созранять в энергонезависимой памяти), каждый из таймеров запускается соответствующим кодом программы, при отработке таймера вызывается вектор прерывания и вызывается программа обрабатывающая именно этот таймер (так работает устройство на жёсткой логике)

Эти таймеры могут стартонуть одновременно? Какие задачи они должны выполнять?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

похоже я туплю. вроде ты говоришь о жесткой логике, спаянной или плис, но применяешь слова вектор прерывания, в жесткой логике вроде нет такого, давно не занимался, ну может не в такой формулировке, поэтому не понял. но стало интересно . можешь на пальцах тоже самое что ты хочешь

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

p.masyukov пишет:

Что сыровато? Конкретно то что и просили. Да еще и готовый шаблон.

1 - не показан запуск.

2 - защита от повторного стопа.

3 - loopTime в певом таймере и во стором совпадают. Надо хотя бы разделить loopTime1, loopTime2.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

qwone пишет:

Andy пишет:

p.masyukov, переименовался из qwone, а ошибки те же :)

Должно быть так:

if (currentTime - loopTime > INTERVAL)

Вот еще д.. (неодекватный человек). Он еще верит что процессор может сравнивать числа.  Ну не сравнивает процессор число.  Если есть такое выражение (A<B)  то производится операция (А-В ) и потом уже флаги Z (равенство 0) и старший бит результата. (если он 1 то то число больше) .  Но лилипуты воюют как бить яйца: с тупой или с острой стороны.

Слону (компилятору) объясни.  Конкретно который с  Arduino IDE идет в придачу.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

qwone пишет:

p.masyukov пишет:

Что сыровато? Конкретно то что и просили. Да еще и готовый шаблон.

1 - не показан запуск.

2 - защита от повторного стопа.

3 - loopTime в певом таймере и во стором совпадают. Надо хотя бы разделить loopTime1, loopTime2.

Ну луптаймы сперва хотел разделить, потом прикинул, плюнул --- А если человеку всё напишут, то чем ему тогда заниматься? 

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

p.masyukov пишет:

Слону (компилятору) объясни.  Конкретно который с  Arduino IDE идет в придачу.

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

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

qwone пишет:

p.masyukov пишет:

Слону (компилятору) объясни.  Конкретно который с  Arduino IDE идет в придачу.

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

Мы не на лекции C

Тот кусок кода, при условии компиляции avrdude - далает то что ожидается, а как он это делает это уже далеко в корнях C !!!

И смысла вести дискуссии не вижу.

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

p.masyukov пишет:

при условии компиляции avrdude - далает то что ожидается, а как он это делает это уже далеко в корнях C !!!

И смысла вести дискуссии не вижу.

та, да - при условии компиляции аврдуде, смысла в дискуссии нет.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

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

p.masyukov пишет:

при условии компиляции avrdude - далает то что ожидается, а как он это делает это уже далеко в корнях C !!!

И смысла вести дискуссии не вижу.

та, да - при условии компиляции аврдуде, смысла в дискуссии нет.

опечатка там..

AVR-GCC))

Ту ду. А ведь никто так и не ответил на тот вопрос что был задан!!! 

Вот только пи....жом занимаетесь.

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

p.masyukov пишет:

А ведь никто так и не ответил на тот вопрос что был задан!!! 

а, смысл отвечать на странные вопросы?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

p.masyukov пишет:
А код - 200% правильный и рабочий!!!

Твой код 100% ошибочный. Другие 100% твое художественное оформление.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

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

p.masyukov пишет:

А ведь никто так и не ответил на тот вопрос что был задан!!! 

а, смысл отвечать на странные вопросы?

простой вопрос - простой ответ.

таймеры 10 штук - по 600 сек максимум - это много?

с клавиатуры вводить - можно.

вот и ответ!!!

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Andy пишет:

p.masyukov пишет:
А код - 200% правильный и рабочий!!!

Твой код 100% ошибочный. Другие 100% твое художественное оформление.

какой бы он не был ошибочный замени в моем коде ту строки и посмотри результат.

даже математически будет жопа.

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

p.masyukov пишет:

простой вопрос - простой ответ.

таймеры 10 штук - по 600 сек максимум - это много?

с клавиатуры вводить - можно.

вот и ответ!!!

какое вещество принимаешь?

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

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

p.masyukov пишет:

простой вопрос - простой ответ.

таймеры 10 штук - по 600 сек максимум - это много?

с клавиатуры вводить - можно.

вот и ответ!!!

какое вещество принимаешь?

Ты столько не зарабатываешь. 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

p.masyukov пишет:
какой бы он не был ошибочный замени в моем коде ту строки и посмотри результат.

даже математически будет жопа.

p.masyukov и qwone, вы два оленя, постите свой говнокод здесь. Учите матчасть

http://arduino.ru/tutorials/BlinkWithoutDelay

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

Andy пишет:

p.masyukov, переименовался из qwone, а ошибки те же :)

Должно быть так:

if (currentTime - loopTime > INTERVAL)

 

А вот так делать нельзя. Через 48 часов  if не будет выполняться. loopTime будет максимальная и операция (currentTime - loopTime) будет отрицательная. И кто вам сказал что если currentTime и loopTime беззнаковые, то и операция  будет (currentTime - loopTime) беззнаковая .

 

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

qwone пишет:

А вот так делать нельзя. Через 48 часов  if не будет выполняться. loopTime будет максимальная и операция (currentTime - loopTime) будет отрицательная. И кто вам сказал что если currentTime и loopTime беззнаковые, то и операция  будет (currentTime - loopTime) беззнаковая .

начинается...

2.gif

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

qwone пишет:

Andy пишет:

p.masyukov, переименовался из qwone, а ошибки те же :)

Должно быть так:

if (currentTime - loopTime > INTERVAL)

 

А вот так делать нельзя. Через 48 часов  if не будет выполняться. loopTime будет максимальная и операция (currentTime - loopTime) будет отрицательная. И кто вам сказал что если currentTime и loopTime беззнаковые, то и операция  будет (currentTime - loopTime) беззнаковая .

 

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

счетчики можно и сбросить..

unsigned сказал -- но что будет при сравнении с   int?! и Насколько помню в long около 50 дней будет заполняться.

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

p.masyukov пишет:

никто не дал, ни одного нормального поснения почему и тп.

потому, что:

// 4294967294 - 4294967284 = 10
// 4294967295 - 4294967285 = 10
// 0          - 4294967286 = 10
// 1          - 4294967287 = 10
// 2          - 4294967288 = 10
// 3          - 4294967289 = 10
// 4          - 4294967290 = 10
// 5          - 4294967291 = 10
// 6          - 4294967292 = 10
// 7          - 4294967293 = 10
// 8          - 4294967294 = 10
// 9          - 4294967295 = 10
// 10         - 0          = 10
// 11         - 1          = 10
p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

if (currentTime - loopTime > INTERVAL) {}

if (10000 - 9999 > 10000)

{

И тут мы пропускаем, но включаем на следующем круге !!!

}

В моем случае же - работает пока не вышло время. После можно обнулить всё... Это математически, не смотря на способы хранения типов..

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

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

p.masyukov пишет:

никто не дал, ни одного нормального поснения почему и тп.

потому, что:

// 4294967294 - 4294967284 = 10
// 4294967295 - 4294967285 = 10
// 0          - 4294967286 = 10
// 1          - 4294967287 = 10
// 2          - 4294967288 = 10
// 3          - 4294967289 = 10
// 4          - 4294967290 = 10
// 5          - 4294967291 = 10
// 6          - 4294967292 = 10
// 7          - 4294967293 = 10
// 8          - 4294967294 = 10
// 9          - 4294967295 = 10
// 10         - 0          = 10
// 11         - 1          = 10

А ссылку на подробное описание можно.. Чтоб подробнее почитать. Хотя в моем варианте работает и не 48 часов, а намного дольше (точнее я не видел чтоб зависало - может не дождался просто)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

p.masyukov пишет:

qwone пишет:

p.masyukov пишет:

Что сыровато? Конкретно то что и просили. Да еще и готовый шаблон.

1 - не показан запуск.

2 - защита от повторного стопа.

3 - loopTime в певом таймере и во стором совпадают. Надо хотя бы разделить loopTime1, loopTime2.

Ну луптаймы сперва хотел разделить, потом прикинул, плюнул --- А если человеку всё напишут, то чем ему тогда заниматься? 

Ребята, там есть чем заняться, там матрица булевых выражений 40 на 40 и в каждом из столбцов от трёх до 7 переменных )))

 

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

p.masyukov пишет:

А ссылку на подробное описание можно.. Чтоб подробнее почитать. Хотя в моем варианте работает и не 48 часов, а намного дольше (точнее я не видел чтоб зависало - может не дождался просто)

мой DigiUSB замени на свой Serial


// тест переполнения unsigned long millis().
// проверка корректности условия if (nm - m > 10) когда m считано до переполнения millis(), nm - после переполнения.

// результат проверки - корректно переползаем переполнение из "до" в "после":

// 4294967294 - 4294967284 = 10
// 4294967295 - 4294967285 = 10
// 0          - 4294967286 = 10
// 1          - 4294967287 = 10
// 2          - 4294967288 = 10
// 3          - 4294967289 = 10
// 4          - 4294967290 = 10
// 5          - 4294967291 = 10
// 6          - 4294967292 = 10
// 7          - 4294967293 = 10
// 8          - 4294967294 = 10
// 9          - 4294967295 = 10
// 10         - 0          = 10
// 11         - 1          = 10


#include <DigiUSB.h>

// unsigned long 0 - 4294967295

unsigned long m  = 4294967283; // 10 миллисекунд до переполнения.
unsigned long nm = 4294967293; // 1 миллисекунд до переполнения.

void setup() {

DigiUSB.begin();

int n = 0;

while(n < 14){

if (DigiUSB.tx_remaining() > 40) { // проверка места в буфере USB.
++n;
++m;
++nm;

DigiUSB.print(nm);
DigiUSB.print(" - ");
DigiUSB.print(m);
DigiUSB.print(" = ");
DigiUSB.println(nm - m); // здесь предполагаем получить 10, если условие отрабатывается корректно.

DigiUSB.delay(1);

}

DigiUSB.delay(1);

}

}

void loop() {DigiUSB.delay(1);}

 

nik182
Offline
Зарегистрирован: 04.05.2015

p.masyukov пишет:

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

http://arduino.ru/forum/programmirovanie/avtopoliv#comment-149419

http://playground.arduino.cc/Code/TimingRollover

 

 

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

ua6em пишет:

Ребята, там есть чем заняться, там матрица булевых выражений 40 на 40 и в каждом из столбцов от трёх до 7 переменных )))

Вот вы сразу хотите стать генералом, не побыв солдатом.  Как вы можете успешно применять "инструмент" если вы его не изучили. Вот так потихоньку дойдете до своих булевых выражений. Тем более памяти может "нехватить". Была недавно на форуме такая история.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

nik182 пишет:

p.masyukov пишет:

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

http://arduino.ru/forum/programmirovanie/avtopoliv#comment-149419

http://playground.arduino.cc/Code/TimingRollover

Ну да это не учел. Обычно столько времени программы редко у кого работают. Там либо программное обнуление всего, либо данное устройство не работает столько времени - вырубают питание.

То что я написал будет работать - но это часть - помимо должно быть и кнопки и сброс millis() и всех переменных... И всех вышеупомянутых глюков не произойдет.

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

Andy пишет:

Учите матчасть

http://arduino.ru/tutorials/BlinkWithoutDelay

Andy, Вы всерьез предлагаете это:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 

в качестве образца для подражания?

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Andy пишет:

p.masyukov пишет:
какой бы он не был ошибочный замени в моем коде ту строки и посмотри результат.

даже математически будет жопа.

p.masyukov и qwone, вы два оленя, постите свой говнокод здесь. Учите матчасть

http://arduino.ru/tutorials/BlinkWithoutDelay

ОЛЕНЬ ЭТО ТЫ КУСОК ДЕБИЛА!!!

СЛЕДИ ЗА БАЗАРОМ. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

ua6em пишет:

Ребята, там есть чем заняться, там матрица булевых выражений 40 на 40 и в каждом из столбцов от трёх до 7 переменных )))

Вот вы сразу хотите стать генералом, не побыв солдатом.  Как вы можете успешно применять "инструмент" если вы его не изучили. Вот так потихоньку дойдете до своих булевых выражений. Тем более памяти может "нехватить". Была недавно на форуме такая история.

Её не может не хватить, видел контроллер на ик-80 процессоре и озу там было всего ничего, всё в пзу, хотя, ежели дизасемблировать кусочек машинного кода и посмотреь, что там GCC накомпилил )))
Мой драйвер для работы с дискетами под дос (это тот, когда Альберто Паскуале свой еще не написал) был всего 3,6 килобайта, был двупотоковой и написан в лоб, за пяток дней, там всего 43 переменных, ну ежели и нагреватели на неё заводить, то +14

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

p.masyukov пишет:

ОЛЕНЬ ЭТО ТЫ КУСОК ДЕБИЛА!!!

СЛЕДИ ЗА БАЗАРОМ. 

Картинки по запросу попкорн гиф

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

andriano пишет:

Andy, Вы всерьез предлагаете это:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 

в качестве образца для подражания?

andriano, в этом говнообразце хотя бы нет тех ошибок, которые обильно разбрасывают здесь два персонажа.

Я бы сказал больше, Arduino IDE это редкое УГ, но полагаю меня забросают здесь говном.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
uint32_t mil = 0xFFFFFFF0;
uint32_t old_mil ;
uint8_t inerval = 10;
void setup() {
  Serial.begin(9600);
  old_mil = mil;
  for (int i = 0; i < 40; i++) {
    if (mil - old_mil > inerval) old_mil = mil;
    Serial.print( mil, HEX);
    Serial.print(" ");
    Serial.print(old_mil, HEX);
    Serial.print(" ");
    mil++;
    Serial.print((mil - old_mil > inerval));
    Serial.println(" ");
  }
}

void loop() {
}

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Andy пишет:

andriano пишет:

Andy, Вы всерьез предлагаете это:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 

в качестве образца для подражания?

andriano, в этом говнообразце хотя бы нет тех ошибок, которые обильно разбрасывают здесь два персонажа.

Я бы сказал больше, Arduino IDE это редкое УГ, но полагаю меня забросают здесь говном.

Ты хоть уроки выучил, школу не проспишь. персонаж.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

что ж вы такие злые, Andy пьяный мудак, забейте))

интересно он на меня переключится, или включит в "список: я вам всем отомщу"

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

jeka_tm пишет:

что ж вы такие злые, Andy пьяный мудак, забейте))

интересно он на меня переключится, или включит в "список: я вам всем отомщу"

Да смотрю тут хватает кадров. Вот ща упомяну про честный С, глядишь появится.

Завтра ведь увидит - пи... будет ))))

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Пи...еть, а еще забросает своей приблудой и утопит форум в фонтане. 

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

andriano пишет:

Andy, Вы всерьез предлагаете это:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 

в качестве образца для подражания?

 ledState= ! ledState;

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да ладно. кого тут он утопит, тут разные люди бывают, да я сам не так давно к клапуцием "сцепился", тупо было, как ни странно адекватнее человек оказался в отличии от меня в той ситуации

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

фотками забросает.  огромными. а я ему отомщу и своего клиента скину - вот ему мозг вы...ет. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Я правильно понял счётчики сделать низзя ))) ?

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

qwone пишет:

andriano пишет:

Andy, Вы всерьез предлагаете это:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 

в качестве образца для подражания?

 ledState= ! ledState;

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

если ты понимаешь, что оптимальней писать ledState= ! ledState;

то почему же ты не понимаешь, что правильно писать if (currentTime - loopTime > INTERVAL) ?