Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 10.10.2019
Сообщений: 20
1

Аналог цикла FOR без delay() с millis() не срабатывает корректно

01.07.2020, 20:09. Просмотров 204. Ответов 4
Метки нет (Все метки)

Здравствуйте! Возникла проблема с циклом FOR. Поскольку не смог его подружить цикл for с millis(), я нашел аналог этого цикла в интернете, который вроде как работает с millis(), но как оказалось тоже не совсем так как мне нужно. Позже я опять попробовал написать цикл FOR на обратный отсчт с одной циферной переменной на другую циферную переменную. И вроде как он заработал с millis(), но проблема осталась та же, что и с циклом-аналогом FOR.

Приведу пример кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int a;
int i;
int ButtonUP = A2;
int ButtonUP_ON;
unsigned long timestamp = 0;
 
void setup() {
 pinMode(ButtonUP, INPUT);
 Serial.begin(9600);
 timestamp = 0;
 
}
 
void loop() {
 
  ButtonUP_ON = digitalRead(ButtonUP);
 
    if (ButtonUP_ON == HIGH) {
       i=50;
       a=10;
 
      if(i > a && millis()-timestamp>=84)   // Вместо цикла FOR. Если "i" больше "s" и промежуток между ними 100мс
     {                                     
          i-=i/a;                      // уменьшаем "i" на шаг в 5 единиц
                  Serial.print("Скорость замедления: ");
                  Serial.print(i);
                  Serial.print("_______Прошло м.сек: ");
                  Serial.println(millis()); 
                  Serial.println();
          timestamp=millis(); 
          
         }
     }
 
}
А проблема собственно в том, что таймер почему-то не верно считаем миллисекунды. Когда я указываю временной интервал между шагами в 100 мс, контроллер почему-то считает 114-116 мс. Когда ставлю интервал 84 мс (100-16мс), тогда ардуино считает уже в диапазоне 99-101 мс. А вот если я хочу поставить временной интервал меньше чем 84 мс, например 20 мс, или 45 мс, цикл не может следовать этому интервалу между шагами и оставляет минимальный интервал 82-84 мс.

Как быть? Ведь раньше вроде бы всё было нормально и миллисекунды считало чётко. Возможно это на физическом уровне с платой что-то не так? Сейчас лето и возможно он от жары даёт сбой в счёте времени?))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2020, 20:09
Ответы с готовыми решениями:

Millis вместо delay в цикле for
Имеется светодиодная матрица 5х6, управляется через max7219. #include "LedControl.h" // ...

Как максимально просто обойтись без delay? Не вовремя срабатывает одна функция
Приветствую всех! Кратко опишу задачу, а затем проблему, которая возникает при попытке её...

Запрос срабатывает в SQL Server, но не корректно срабатывает в Visual Studio 2017
(SELECT ROW_NUMBER() over (ORDER BY AVG(Отметки.Отметка) DESC) ID, .ФИО, .Группа, Отметки.,...

Аналог delay.
Как известно, ф-ия delay останавливает работу программы на определенное время.Подключаю <dos.h>......

4
С чаем беда...
Эксперт CЭксперт С++
7236 / 3568 / 966
Регистрация: 18.10.2014
Сообщений: 7,268
02.07.2020, 21:30 2
Цитата Сообщение от Daminskii Посмотреть сообщение
А проблема собственно в том, что таймер почему-то не верно считаем миллисекунды. Когда я указываю временной интервал между шагами в 100 мс, контроллер почему-то считает 114-116 мс. Когда ставлю интервал 84 мс (100-16мс), тогда ардуино считает уже в диапазоне 99-101 мс. А вот если я хочу поставить временной интервал меньше чем 84 мс, например 20 мс, или 45 мс, цикл не может следовать этому интервалу между шагами и оставляет минимальный интервал 82-84 мс.
Ничего не понятно. Вы о чем вообще? Как проявляется это ваше "таймер почему-то не верно считаем миллисекунды"?

И что это за бессмысленные проверки с i и a?
0
0 / 0 / 0
Регистрация: 10.10.2019
Сообщений: 20
03.07.2020, 04:48  [ТС] 3
Возможно я не совсем верно назвал тему на форуме. Проблема в том, что когда я делаю в скетче задержку, независимо от того, delay () это или millis(), моя плата Ардуино Нано неверно считает время. Например ставлю задержку delay (1000), а в мониторе порта показывает не ровно 1000 миллисекунд задержки между операциями, а колеьающееся число от 998 до 1006.

А когда мне нужно выставить интервал между шагами в цикле FOR, например чтобы каждый шаг длился 20 миллисекунд, так контроллер вообще не может этого сделать, и отсчитывает минимальный шаг в 82-84 миллисекунды. Или, например если я ставлю delay(100), В мониторе порта отсчитывает не ровно 100 миллисекунд, а 114-116. И для того чтобы сделать интервал между шагами в реальных 100 миллисекунд, нужно от 100 отнять лишние 16 миллисекунд, вписать в delay или millis значение "84", и только тогда микроконтроллер начнет более-менее точно (с погрешностью 2 миллисекунды) отсчитывать 100мс продолжительности шага цикла.

Надеюсь так понятнее описал и более ясна суть проблемы. Я хочу понять: это дело в физической плате (возможно кварц некорректно работает, бракованный), или дело в летней жаре (Ардуино тоже нагревается во время работы), или какая-то другая причина. Хочу чтобы можно было задавать маленький временной промежуток между шагами в цикле, например 20 мс, и чтобы контроллер точно их отсчитывал. Что можно для этого сделать?

А проверки в коде и сравнение двух переменных это не бессмысленная вещь. Они выполняют важную роль в моем коде, а это лишь его кусочек, на котором все обламывается, поскольку Ардуино неверно считает время. Даже когда отдельно в новом скетче загружаю этот код цикла в микроконтроллер, он не верно считает время. По этому прошу помочь разобраться, как можно решить данную проблему
0
С чаем беда...
Эксперт CЭксперт С++
7236 / 3568 / 966
Регистрация: 18.10.2014
Сообщений: 7,268
03.07.2020, 05:30 4
Цитата Сообщение от Daminskii Посмотреть сообщение
а в мониторе порта показывает не ровно 1000 миллисекунд задержки между операциями, а колеьающееся число от 998 до 1006.[...]В мониторе порта отсчитывает не ровно 100 миллисекунд, а 114-116.
Что такое "в мониторе порта показывает"? Что такое "в мониторе порта отсчитывает"? Что означают эти странные фразы?

Каким образом у вас что-то "показывается в мониторе порта"? Вы скорее всего реализовали "показывание" с дополнительными затратами времени на это "показывание". Вот их вы и видите в виде более высоких значений. А более низкие значения - это скорее всего ваши выдумки.

Цитата Сообщение от Daminskii Посмотреть сообщение
А проверки в коде и сравнение двух переменных это не бессмысленная вещь. Они выполняют важную роль в моем коде, а это лишь его кусочек, на котором все обламывается
У вас в коде двум переменным присваиваются жестко прописанные значения, которые тут же проверяются

C
1
2
3
4
       i=50;
       a=10;
 
      if(i > a ....
Это - совершенно бессмысленная вещь. И байки про "выполняют важную роль в моем коде" на это никак не влияют.
0
Модератор
8199 / 6070 / 810
Регистрация: 14.02.2011
Сообщений: 21,055
03.07.2020, 08:51 5
Цитата Сообщение от Daminskii Посмотреть сообщение
А когда мне нужно выставить интервал между шагами в цикле FOR,
когда мы же его увидим, этот таинственный цикл
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2020, 08:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Аналог Thread.Sleep или Task.Delay
Есть ли какой-нибудь аналог функциям Thread.Sleep или Task.Delay ? Мне необходимо сделать задержку...

Почему не срабатывает изменение границы цикла, принятое внутри цикла?
Работает цикл for-Next V_Rod = UBound(Rod, 2) For j = 1 To V_Rod For k = 1 To...

Без Delay?
Вообщем сами понимаете Delay это лажа. Меня интересует методика замены delay опишите ее подробно.

Реле без delay
Доброго времени суток, имеется код для включение выключения реле, но без delay обойтись не...

Мелодия Tone без Delay
Здравствуйте. Так и не нашёл в интернете решение проблемы, везде в примерах есть функция игры...

Не корректно срабатывает AJAX
Есть скрипт $("#login-form").submit(function (e) { $.ajax({ type:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.