Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 10.10.2019
Сообщений: 28

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

01.07.2020, 20:09. Показов 3987. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2020, 20:09
Ответы с готовыми решениями:

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

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

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

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

И что это за бессмысленные проверки с i и a?
0
0 / 0 / 0
Регистрация: 10.10.2019
Сообщений: 28
03.07.2020, 04:48  [ТС]
Возможно я не совсем верно назвал тему на форуме. Проблема в том, что когда я делаю в скетче задержку, независимо от того, 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Эксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,176
03.07.2020, 05:30
Цитата Сообщение от Daminskii Посмотреть сообщение
а в мониторе порта показывает не ровно 1000 миллисекунд задержки между операциями, а колеьающееся число от 998 до 1006.[...]В мониторе порта отсчитывает не ровно 100 миллисекунд, а 114-116.
Что такое "в мониторе порта показывает"? Что такое "в мониторе порта отсчитывает"? Что означают эти странные фразы?

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

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

C
1
2
3
4
       i=50;
       a=10;
 
      if(i > a ....
Это - совершенно бессмысленная вещь. И байки про "выполняют важную роль в моем коде" на это никак не влияют.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
03.07.2020, 08:51
Цитата Сообщение от Daminskii Посмотреть сообщение
А когда мне нужно выставить интервал между шагами в цикле FOR,
когда мы же его увидим, этот таинственный цикл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.07.2020, 08:51
Помогаю со студенческими работами здесь

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

Аналог 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 UBound(BD, 2) ReDim...

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru