• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Таймеры

ART_HA

Member
Здравствуйте.
Наставьте плиз на путь истинный, потому как малость запутался.
Мне нужна очень простая схема на ESP8266, а именно:
по сигналу на ноге МК должен запускаться таймер0, который по истечении заданного времени должен запускать таймер1 и установку одного из выходов МК в HIGH.
Таймер1 после истечении заданного времени должен сбрасывать ранее установленного выхода МК в LOW.
Вопрос.
Таймер0 и таймер 1 - это программные таймеры, такая задача для них реальна или мне надо использовать аппаратные таймеры?
WiFi в данной схеме не используется.
 

aZholtikov

Active member
Здравствуйте.
Наставьте плиз на путь истинный, потому как малость запутался.
Мне нужна очень простая схема на ESP8266, а именно:
по сигналу на ноге МК должен запускаться таймер0, который по истечении заданного времени должен запускать таймер1 и установку одного из выходов МК в HIGH.
Таймер1 после истечении заданного времени должен сбрасывать ранее установленного выхода МК в LOW.
Вопрос.
Таймер0 и таймер 1 - это программные таймеры, такая задача для них реальна или мне надо использовать аппаратные таймеры?
WiFi в данной схеме не используется.
Библиотека Ticker.h без проблем с этим справится.
 

aZholtikov

Active member
Примерно по памяти набросал.

#include "Ticker.h"

Ticker timer0;
Ticker timer1;

setup
{
}

loop
{
}

обработчик прерывания
{
timer0.once(время, обработчик события таймера0);
что-то ставим в HIGH;
}

обработчик события таймера0
{
timer1.once(время, обработчик события таймера1);
}

обработчик события таймера1
{
что-то ставим в LOW;
}
 

ART_HA

Member
О! А у меня создалось впечатление, что Ticker используется только как генератор прерываний по времени.
Спасибо.

aZholtikov, а нет у ли у Вас под рукой ссылки на развернутое описание этой библиотеки?
Почему-то не удается найти поиском....
 

aZholtikov

Active member
О! А у меня создалось впечатление, что Ticker используется только как генератор прерываний по времени.
Спасибо.

aZholtikov, а нет у ли у Вас под рукой ссылки на развернутое описание этой библиотеки?
Почему-то не удается найти поиском....
В данный момент в функциях обратного вызова Ticker не рекомендуется выполнять блокирующие операции ввода и вывода данных (связанные с сетью, последовательной передачей данных, файлами). Лучше поставьте флаг внутри функции обратного вызова Ticker, а затем обращайтесь к этому флагу из блока loop().

 

ART_HA

Member
:(
Наверное я чего-то не понял, или чего-то не нашел...
Я не обнаружил в описании Ticker операции запуска таймера от ноги МК и не обнаружил выдачи сигнала таймером на ногу МК по окончании заданного ему временного интервала.
Если это решается через прерывания, то эту задачу можно решить и без Ticker, например с помощью millis(), но такое решение грозит слишком большими ошибками.
 

aZholtikov

Active member
:(
Наверное я чего-то не понял, или чего-то не нашел...
Я не обнаружил в описании Ticker операции запуска таймера от ноги МК и не обнаружил выдачи сигнала таймером на ногу МК по окончании заданного ему временного интервала.
Если это решается через прерывания, то эту задачу можно решить и без Ticker, например с помощью millis(), но такое решение грозит слишком большими ошибками.
Там такого нет.
В обработчике прерывания события кнопки? нужно разово запустить таймер0. В обработчике таймера0 "дернуть" ножку и разово запустить таймер1. В обработчике таймера1 "дернуть" ножку.
И да, это можно сделать и через millis(). Но с Ticker.h проще.
 

ART_HA

Member
Значит программный таймер мне однозначно не годится. :(
А у аппаратного таймера возможность таймера от ноги МК и выдача сигнала таймером на ногу МК по окончании заданного ему временного интервала?
 

aZholtikov

Active member
Значит программный таймер мне однозначно не годится. :(
А у аппаратного таймера возможность таймера от ноги МК и выдача сигнала таймером на ногу МК по окончании заданного ему временного интервала?
У Hardware все "монопенисуально" с Software. Включать "ручками".
 

aZholtikov

Active member
Hardware по сравнению с Software просто более точный если требуется учитывать микросекунды. В остальном аналогично.
 

ART_HA

Member
Гм... в конструкции с milles() я в обработчике кнопки считываю показания счетчика и затем в цикле тела программы опрашиваю текущее состояние счетчика пока оно не достигнет заданного. Здесь и происходит ошибка из-за непредсказуемости этого момента.
А в конструкции с Ticker, насколько я Вас понял, счетчик сам вызывает прерывание по достижении заданного значения.
Это действительно так?
И строка: timer0.once(время, обработчик события таймера0); - это оно и есть?
 

CodeNameHawk

Moderator
Команда форума
Здесь и происходит ошибка из-за непредсказуемости этого момента.
Тут нет непредсказуемости, может быть только недостаточная точность.
Кнопку повесте на прерывание, а в основном цикле не должно "долгих" операций.
Но вы не озвучили нужную точность.
 

aZholtikov

Active member
Гм... в конструкции с milles() я в обработчике кнопки считываю показания счетчика и затем в цикле тела программы опрашиваю текущее состояние счетчика пока оно не достигнет заданного. Здесь и происходит ошибка из-за непредсказуемости этого момента.
А в конструкции с Ticker, насколько я Вас понял, счетчик сам вызывает прерывание по достижении заданного значения.
Это действительно так?
И строка: timer0.once(время, обработчик события таймера0); - это оно и есть?
При таком запуске "timer0" через указанное "время" запускается функция "обработчик события таймера0". Он сам "следит" за временем. А запустит он то, что будет написано в "обработчик события таймера0".
 

ART_HA

Member
Тут нет непредсказуемости, может быть только недостаточная точность.
Кнопку повесте на прерывание, а в основном цикле не должно "долгих" операций.
Будут ли в основном цикле долгие операции, и если будут, то насколько долгие, и сколько их будет - в настоящее время непредсказуемо. :)
Сейчас идет отработка поблочно, и первый блок - работа с таймерами.
Особая точность не требуется, но т.к. по отзывам она при использовании программных таймеров "ниочинь", то буду смотреть
этот "джиттер" осциллографом в реале. Конечно, мне очень бы не хотелось бы заморачиваться аппаратным таймером.
 

aZholtikov

Active member
В данный момент в функциях обратного вызова Ticker не рекомендуется выполнять блокирующие операции ввода и вывода данных (связанные с сетью, последовательной передачей данных, файлами). Лучше поставьте флаг внутри функции обратного вызова Ticker, а затем обращайтесь к этому флагу из блока loop().

Не ту ссылку прикрепил... :)
 
Сверху Снизу