Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

многозадачный таймер на millis для Ардуино

Непрочитано 17.11.2020, 09:44  
Владимир 013
Частый гость
 
Регистрация: 07.11.2019
Сообщений: 15
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Владимир 013 на пути к лучшему
По умолчанию многозадачный таймер на 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.
Владимир 013 вне форума  
Непрочитано 17.11.2020, 10:41  
parovoZZ
Почётный гражданин KAZUS.RUN
 
Регистрация: 15.11.2010
Сообщений: 2,376
Сказал спасибо: 337
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

ардуинщиков здесь нет. Такие вопросы лучше задавать на дурино-форумах.
parovoZZ вне форума  
Непрочитано 17.11.2020, 11:54  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,456
Сказал спасибо: 3,225
Сказали Спасибо 3,508 раз(а) в 2,389 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

millis - останавливает исполнение программы на себе. С ним - ничего не получится.
Учите прерывания и аппаратный таймер.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 17.11.2020, 13:06  
parovoZZ
Почётный гражданин KAZUS.RUN
 
Регистрация: 15.11.2010
Сообщений: 2,376
Сказал спасибо: 337
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Сообщение от ForcePoint Посмотреть сообщение
millis - останавливает исполнение программы на себе
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
parovoZZ вне форума  
Эти 2 пользователя(ей) сказали Спасибо parovoZZ за это сообщение:
-vitalik- (19.11.2020), ForcePoint (17.11.2020)
Непрочитано 17.11.2020, 13:16  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,456
Сказал спасибо: 3,225
Сказали Спасибо 3,508 раз(а) в 2,389 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Сообщение от parovoZZ Посмотреть сообщение
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
Да и хвост с ним. Чем меньше ардуины - тем лучше.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Сказали "Спасибо" ForcePoint
parovoZZ (17.11.2020)
Непрочитано 17.11.2020, 13:24  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Владимир 013, пожалуйте на http://arduino.ru/forum , а то тут народ гораздо более продвинутый, и ваших проблем может не понять.

Хотя, вообще, программные таймеры делаются очень просто - декрементами. Счетчики идут не на увеличение, а на уменьшение от заданного значения задержки, и когда значение будет = 0, тогда интервал будет отсчитанным.
Причем, чтобы не было ложных запусков, вначале проверяется на неравенство 0, а потом выполняется декремент. При равенстве 0 выставляется флаг завершения счета в этом таймере.
NewWriter вне форума  
Сказали "Спасибо" NewWriter
Владимир 013 (17.11.2020)
Непрочитано 17.11.2020, 13:59  
ProtAS-13
Вид на жительство
 
Регистрация: 17.03.2015
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 229 раз(а) в 131 сообщении(ях)
ProtAS-13 на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Сообщение от parovoZZ Посмотреть сообщение
ардуинщиков здесь нет
Ни разу не ардуинщик, но не смог пройти.
Сообщение от NewWriter Посмотреть сообщение
тут народ гораздо более продвинутый

Здесь ЭЛЕМЕНТАРНАЯ алгоритмическая ошибка.
Вопрос "продвинутым".
с учетом того, что
Сообщение от parovoZZ Посмотреть сообщение
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
Когда сработает ветка со вторым if, если первая if ветка всегда выполняется первой?
Код:
...
void loop()
{
  if (millis() - timing0 › 3000){ // нужное вам значение паузы
    timing0 = millis();
    ...
  }
  if (millis() - timing0 › 3000){ // нужное вам значение паузы
    timing0 = millis();
    ...
  }
...
ProtAS-13 вне форума  
Непрочитано 17.11.2020, 14:29  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,162
Сказал спасибо: 46
Сказали Спасибо 315 раз(а) в 244 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Если millis() возвращает системные тики, то ваш код не учитывает возможность переполнения таймера и начала счета с 0 (или с максимального значения).

Например если в коде timing0= millis(); в timing0 будет 0oxFFF0 ( предположим таймер 16 битный и считает вверх), то через 16 тактов он переполнится и начнет счет с 0.

А вы при проверке в loop() millis() - timing0 › 3000
никогда не получите выполнение такого условия - надо учитывать отрицательные числа тоже.

ИМХО внутри void loop() надо вызывать millis() один раз и дальше проверять на выполнение всех условий ...
dgrishin вне форума  
Непрочитано 17.11.2020, 14:43  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

ProtAS-13, не умеешь писАть - не берись. Тут вообще всё иначе делается.

Последний раз редактировалось NewWriter; 17.11.2020 в 14:45.
NewWriter вне форума  
Непрочитано 17.11.2020, 16:27  
ProtAS-13
Вид на жительство
 
Регистрация: 17.03.2015
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 229 раз(а) в 131 сообщении(ях)
ProtAS-13 на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Сообщение от NewWriter Посмотреть сообщение
Тут вообще всё иначе делается.
Исчерпывающий ответ От Вас ничего другого и не ожидал.
А "тут" - это где? В "Песочница (вопросы новичков)"?
Т.е. "тут" отменили АЛГОРИТМИЗАЦИЮ.
Напомню: "Алгоритмизация – это детерминированный подход к решению задачи.
Правильно сформированный алгоритм – залог верного решения заранее сформулированного вопроса.
"

А ТС'у посоветую посетить страничку Blink Without Delay, где есть АЛГОРИТМИЧЕСКИ ПРАВИЛЬНЫЙ код.
Если же хотите узнать побольше об особенностях функции millis(), то Secrets of Arduino millis: How it works and how to use it.
Кстати, все это найдено за пару секунд - не ленитесь самостоятельно искать ответы на свои вопросы.
ProtAS-13 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблемы с ардуино уно begun Делимся опытом 1 24.05.2017 13:37
Быстро проверить исправность Ардуино. 123ksn AVR 9 25.11.2014 11:54
"Шахматный" таймер на ATmega 8515 Bahmut_aiirsoft Песочница (вопросы новичков) 14 17.11.2013 14:14
Сторожевой таймер в ATtiny25/45/85 mike124 Proteus 11 30.10.2012 11:19
таймер и симуляция в MPLAB Sim lisergin Микроконтроллеры, АЦП, память и т.д 0 16.01.2006 15:35


Часовой пояс GMT +4, время: 15:37.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.