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

Таймеры

ART_HA

Member
Вроде как проясняется.
Насколько я понял, once - присутствует в версии 1.0 Ticker, а в актуальной версии 4.4 его уже нет.
Потому я в описании once и не смог найти.
И вряд ли только в этом отличие версий, там и авторы-то вроде как разные...
Если есть минутка, гляньте плиз приложенный файл. Я прав?
 

Вложения

aZholtikov

Active member
Вроде как проясняется.
Насколько я понял, once - присутствует в версии 1.0 Ticker, а в актуальной версии 4.4 его уже нет.
Потому я в описании once и не смог найти.
И вряд ли только в этом отличие версий, там и авторы-то вроде как разные...
Если есть минутка, гляньте плиз приложенный файл. Я прав?
Да. Это 2 разные библиотеки.
Первая (с once) - использует для работы "родные" функции Espressif NON-OS SDK. На "ядре" так сказать.
Вторая - чья-то поделка. Работает с помощью millis и micros с отчетом времени в loop. Ни о какой точности речи не идет.
 

enjoynering

Well-known member
Я пользуюсь ticker (идет в составе Arduino ESP8266). Отличная штука, но есть ограничение на количество тикеров (64 шт, но это не точно) и максимальное время (чуть больше 1.5 часа). Второе ограничение поборол написанием своего велосипеда. Вот два проекта где все написано на них (в loop() ничего нет) - MatrixClock и tthRelay. Так же есть пример опроса энкодера через тикер в моей библиотеке RotaryEncoder
 

ART_HA

Member
Спасибо, вроде всё получается.
Кстати, я воткнул все-таки вывод на порт в обработчики прерываний, потому как вроде бы
все возможные проблемы в этом случае связаны с работой WiFi, а он у меня в этой ветке программы отключен.
По осциллографу джиттер удовлетворительный, причем заметен по спаду импульса, а он меня не так волнует, как фронт.

Попутный вопрос, чтобы новую тему не открывать.
Насколько я понял, выходы у ESP8266 можно включать в режиме "открытый сток". А какое максимальное напряжение в этом режиме допускается?
В документации ничего по этому поводу не нашел...:(
 

aZholtikov

Active member
Насколько я понял, выходы у ESP8266 можно включать в режиме "открытый сток". А какое максимальное напряжение в этом режиме допускается?
В документации ничего по этому поводу не нашел...:(
Нашел интересную статейку по этому поводу. Возможно пригодится.
 

ART_HA

Member
Статейка действительно очень интересная. А ведь мне и надо всего лишь подать на базу эмиттерного повторителя 5В вместо 3.3В.
Уж больно соблазнительно... Рискнуть что ли?
 

aZholtikov

Active member
Статейка действительно очень интересная. А ведь мне и надо всего лишь подать на базу эмиттерного повторителя 5В вместо 3.3В.
Уж больно соблазнительно... Рискнуть что ли?
А то! А если что - претензию лично ГД Espressif. ;-)
 

ART_HA

Member
Рискну.
Потому как местный магазин на вемосы приличную скидку объявил. Цена конечно сильно не али, но уж больно вся схема упрощается.
 

enjoynering

Well-known member
Я даже с работающим wifi в ticker вывожу в serial порот. Знаю что, это не рекомендуется, но если сообщение не большое (60..150) символов, то на скорости 115200 у меня проблем с wifi и watchdog не было.

ESP8266 легко периваривает 5в, но есть нюанс. Главное ограничить ток (с помощью включённого последовательно с портом резистора) чтобы не пробило защитный диод внутри порта.
 

enjoynering

Well-known member
Больше всего падений наблюдается от ticker + i2c (который у ESP8266 софтовый bit bang). Пока лечу добавлением всех критически функций обращения к i2c в IRAM.
 

ART_HA

Member
ESP8266 легко периваривает 5в, но есть нюанс. Главное ограничить ток (с помощью включённого последовательно с портом резистора) чтобы не пробило защитный диод внутри порта.
И на какой максимальный ток рассчитывать? Не более 20мА?
 

ART_HA

Member
Зачем последовательно с выходом включать резистор, когда с открытым стоком сопротивление резистора подтяжки к 5В и так ток очень сильно ограничивает?
 

ART_HA

Member
В итоге (резистор от +5В с USB номиналом 2,2к):
Порты D1, D2, D3, D5 и D7 в схеме с открытым стоком функционируют нормально.
Остальные косячат, но по схеме видно почему.
 

enjoynering

Well-known member
Для загрузки с флеш памяти некоторые пины должны быть подтянуты в земле, другие к питанию. Смотрите даташит.
 

ART_HA

Member
Я не об этом.
Например D4 и D6 снижают напряжение до 3В, а D8 - до 4В.
Особенности платы D1 mini.
 

ART_HA

Member
Поставил в тело программы АЦП и... получил абракадабру, очень похожую на конфликт прерываний с Ticker.
Правильно ли я понимаю, что analog.Read(A0) использует программное прерывание, и если да, то как изменить его приоритет?
Подозреваю, что аппаратное прерывание по однократному запуску таймера1 имеет высокий приоритет, а вот программные прерывания
по окончанию работы таймеров 1 и 2 и прерывание с АЦП по приоритетам равнозначны.
В данной задаче скорость работы АЦП для меня совершенно некритична, и WiFi тоже не запущен.
Попробовал по аналогии с WiFi поставить в тело программы delay(10), и заработало нормально, за исключением края диапазона.
В крайнем случае такое решение проблемы использовать можно, но уж слишком он ИМХО колхозный.
Нет ли более цивилизованного решения?
 

aZholtikov

Active member
Поставил в тело программы АЦП и... получил абракадабру, очень похожую на конфликт прерываний с Ticker.
Правильно ли я понимаю, что analog.Read(A0) использует программное прерывание, и если да, то как изменить его приоритет?
Подозреваю, что аппаратное прерывание по однократному запуску таймера1 имеет высокий приоритет, а вот программные прерывания
по окончанию работы таймеров 1 и 2 и прерывание с АЦП по приоритетам равнозначны.
В данной задаче скорость работы АЦП для меня совершенно некритична, и WiFi тоже не запущен.
Попробовал по аналогии с WiFi поставить в тело программы delay(10), и заработало нормально, за исключением края диапазона.
В крайнем случае такое решение проблемы использовать можно, но уж слишком он ИМХО колхозный.
Нет ли более цивилизованного решения?
Не видя самого кода трудно сказать.
analog.Read(A0) в обработчике события таймера?
 
Сверху Снизу