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

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

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

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

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

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


 
Опции темы
Непрочитано 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.RU
 
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

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

millis - останавливает исполнение программы на себе. С ним - ничего не получится.
Учите прерывания и аппаратный таймер.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 17.11.2020, 13:06  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 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.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,069
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

Сообщение от parovoZZ Посмотреть сообщение
millis никогда не останавливало исполнение программы, а тупо возвращает значение системного тика/таймера.
Да и хвост с ним. Чем меньше ардуины - тем лучше.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Сказали "Спасибо" ForcePoint
parovoZZ (17.11.2020)
Непрочитано 17.11.2020, 13:24  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
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
Сообщений: 298
Сказал спасибо: 0
Сказали Спасибо 224 раз(а) в 127 сообщении(ях)
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.RU
 
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
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
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: многозадачный таймер на millis для Ардуино

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

Последний раз редактировалось NewWriter; 17.11.2020 в 14:45.
NewWriter вне форума  
Непрочитано 17.11.2020, 16:27  
ProtAS-13
Прописка
 
Регистрация: 17.03.2015
Сообщений: 298
Сказал спасибо: 0
Сказали Спасибо 224 раз(а) в 127 сообщении(ях)
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, время: 01:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot