17.11.2020, 09:44
|
|
Частый гость
Регистрация: 07.11.2019
Сообщений: 15
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
многозадачный таймер на millis для Ардуино
здравствуйте я с недавнего времени начал интересоваться ардуино пока еще в нем не очень сильно разбираюсь в плане программирования но назрел такой вопрос пишу программу для автоматизации котла и мне нужно порядка 15 -20 задержек на millis которые буду работать в цикле я попробовал на макете с одной задержкой все работает а когда сделал 4 задержки и решил проверить на макете не работает как нужно светодиоды мигают не совсем в соответствии с теми временными промежутками что я установил подскажите что не правильно сделал . вот скетч
unsigned long timing0; // Переменная для хранения точки отсчета
unsigned long timing1;
unsigned long timing2;
unsigned long timing3;
void setup()
{
pinMode(2, OUTPUT);// выход
pinMode(3, OUTPUT);// выход
pinMode(4, OUTPUT);// выход
pinMode(5, OUTPUT);// выход
timing0= millis();
timing1= millis();
timing2= millis();
timing3= millis();
}
void loop()
{
if (millis() - timing0 › 3000){ // нужное вам значение паузы
timing0 = millis();
digitalWrite(2, HIGH);
}
if (millis() - timing0 › 3000){ // нужное вам значение паузы
timing0 = millis();
digitalWrite(2, LOW);
}
if (millis() - timing1 › 2000){ // нужное вам значение паузы
timing1 = millis();
digitalWrite(3, HIGH);
}
if (millis() - timing1 › 2000){ // нужное вам значение паузы
timing1 = millis();
digitalWrite(3, LOW);
}
if (millis() - timing2 › 1000){ // нужное вам значение паузы
timing2 = millis();
digitalWrite(4, HIGH);
}
if (millis() - timing2 › 1000){ // нужное вам значение паузы
timing2 = millis();
digitalWrite(4, LOW);
}
if (millis() - timing3 › 100){ // нужное вам значение паузы
timing3 = millis();
digitalWrite(5, HIGH);
}
if (millis() - timing3 › 100){ // нужное вам значение паузы
timing3 = millis();
digitalWrite(5, LOW);
}
}
Последний раз редактировалось Владимир 013; 17.11.2020 в 09:51.
|
|
|
|
17.11.2020, 10:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
ардуинщиков здесь нет. Такие вопросы лучше задавать на дурино-форумах.
|
|
|
|
17.11.2020, 11:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,069
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
millis - останавливает исполнение программы на себе. С ним - ничего не получится.
Учите прерывания и аппаратный таймер.
__________________
Экзорцист 40-го уровня.
|
|
|
|
17.11.2020, 13:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от ForcePoint
|
millis - останавливает исполнение программы на себе
|
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо parovoZZ за это сообщение:
|
|
|
17.11.2020, 13:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,069
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от parovoZZ
|
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
|
Да и хвост с ним. Чем меньше ардуины - тем лучше.
__________________
Экзорцист 40-го уровня.
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
17.11.2020, 13:24
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Владимир 013, пожалуйте на http://arduino.ru/forum , а то тут народ гораздо более продвинутый, и ваших проблем может не понять.
Хотя, вообще, программные таймеры делаются очень просто - декрементами. Счетчики идут не на увеличение, а на уменьшение от заданного значения задержки, и когда значение будет = 0, тогда интервал будет отсчитанным.
Причем, чтобы не было ложных запусков, вначале проверяется на неравенство 0, а потом выполняется декремент. При равенстве 0 выставляется флаг завершения счета в этом таймере.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
17.11.2020, 13:59
|
|
Прописка
Регистрация: 17.03.2015
Сообщений: 298
Сказал спасибо: 0
Сказали Спасибо 224 раз(а) в 127 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от parovoZZ
|
ардуинщиков здесь нет
|
Ни разу не ардуинщик, но не смог пройти.
Сообщение от NewWriter
|
тут народ гораздо более продвинутый
|
Здесь ЭЛЕМЕНТАРНАЯ алгоритмическая ошибка.
Вопрос "продвинутым".
с учетом того, что
Сообщение от parovoZZ
|
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
|
Когда сработает ветка со вторым if, если первая if ветка всегда выполняется первой?
Код:
|
...
void loop()
{
if (millis() - timing0 › 3000){ // нужное вам значение паузы
timing0 = millis();
...
}
if (millis() - timing0 › 3000){ // нужное вам значение паузы
timing0 = millis();
...
}
... |
|
|
|
|
17.11.2020, 14:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Если millis() возвращает системные тики, то ваш код не учитывает возможность переполнения таймера и начала счета с 0 (или с максимального значения).
Например если в коде timing0= millis(); в timing0 будет 0oxFFF0 ( предположим таймер 16 битный и считает вверх), то через 16 тактов он переполнится и начнет счет с 0.
А вы при проверке в loop() millis() - timing0 › 3000
никогда не получите выполнение такого условия - надо учитывать отрицательные числа тоже.
ИМХО внутри void loop() надо вызывать millis() один раз и дальше проверять на выполнение всех условий ...
|
|
|
|
17.11.2020, 14:43
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
ProtAS-13, не умеешь писАть - не берись. Тут вообще всё иначе делается.
Последний раз редактировалось NewWriter; 17.11.2020 в 14:45.
|
|
|
|
17.11.2020, 16:27
|
|
Прописка
Регистрация: 17.03.2015
Сообщений: 298
Сказал спасибо: 0
Сказали Спасибо 224 раз(а) в 127 сообщении(ях)
|
Re: многозадачный таймер на millis для Ардуино
Сообщение от NewWriter
|
Тут вообще всё иначе делается.
|
Исчерпывающий ответ От Вас ничего другого и не ожидал.
А "тут" - это где? В "Песочница (вопросы новичков)"?
Т.е. "тут" отменили АЛГОРИТМИЗАЦИЮ.
Напомню: " Алгоритмизация – это детерминированный подход к решению задачи.
Правильно сформированный алгоритм – залог верного решения заранее сформулированного вопроса."
А ТС'у посоветую посетить страничку Blink Without Delay, где есть АЛГОРИТМИЧЕСКИ ПРАВИЛЬНЫЙ код.
Если же хотите узнать побольше об особенностях функции millis(), то Secrets of Arduino millis: How it works and how to use it.
Кстати, все это найдено за пару секунд - не ленитесь самостоятельно искать ответы на свои вопросы.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:55.
|
|