• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Таймеры

ART_HA

Member
Запрос снимаю, ардуино IDE глюкнула.
Открыл новый проект, заново переписал код, и все заработало.
Приношу извинения.
 

enjoynering

Well-known member
У ардуино esp8266 два стека - sys где крутится wifi и все критические функции и cont в котором крутится ваш код. У ticker есть 3 вида таймеров: просто *_attach, *_attach_scheldured и _atrach_scheldured_accurete. Разберитесь какой в каком стеке исполняется и когда.
 

enjoynering

Well-known member
Кстати delay(), в начале или конце loop() хотя-бы на 1..5 миллисекунд уменьшает потребление с включённым wifi на 15%..20%. Без него радио модем не успеват спать. Вот такая баг-фича ардуино.
 

aZholtikov

Active member
У ардуино esp8266 два стека - sys где крутится wifi и все критические функции и cont в котором крутится ваш код. У ticker есть 3 вида таймеров: просто *_attach, *_attach_scheldured и _atrach_scheldured_accurete. Разберитесь какой в каком стеке исполняется и когда.
Чисто для интереса. Не смог обнаружить в используемой мной библиотеке attach_scheldured_accurete. Какой версией пользуетесь?
 

ART_HA

Member
aZholtikov, к Вам вопрос.
Ticker работает и с ESP32?
Вопрос связан с тем, что похоже, я все-таки уперся в проблемы с памятью в ESP8266. :(
Например при добавлении слова в меню в скрипте не включается сервер WiFi.
 

aZholtikov

Active member
aZholtikov, к Вам вопрос.
Ticker работает и с ESP32?
Вопрос связан с тем, что похоже, я все-таки уперся в проблемы с памятью в ESP8266. :(
Например при добавлении слова в меню в скрипте не включается сервер WiFi.
Да. Работает. И автор библиотеки то-же. :)
P.S. Но в случае с ESP32 я бы посоветовал работать уже с FreeRTOS.
 

aZholtikov

Active member
Здесь подробное описание в целом. https://disk.yandex.ru/d/-LVTckepSxbANg
И здесь хорошо, с примерами, описано. Для ESP32 чуть синтаксис местами будет отличаться.
 

ART_HA

Member
Да. Работает. И автор библиотеки то-же. :)
P.S. Но в случае с ESP32 я бы посоветовал работать уже с FreeRTOS.
Спасибо за хорошие новости.
Признаться я давно уже перешел на ESP32, и для него есть всё, что мне в данном случае нужно.
Но у меня ESP8266 завалялся, и я хотел его пристроить. Оказалось, что не судьба... :)
 

ART_HA

Member
Однако пролет. Не понимает ESP32 этот Ticker.
Да и в самом Ticker.h черным по белому:
Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
This file is part of the esp8266 core for Arduino environment.
 

aZholtikov

Active member
Однако пролет. Не понимает ESP32 этот Ticker.
Да и в самом Ticker.h черным по белому:
Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
This file is part of the esp8266 core for Arduino environment.
Эту пробовали?

Ticker.h - esp32 library that calls functions periodically
Copyright (c) 2017 Bert Melis. All rights reserved.
Based on the original work of:
Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
The original version is part of the esp8266 core for Arduino environment.
 

ART_HA

Member
И как вы умудряетесь правильные Ticker находить? Мне так все какая ерунда попадается...
Спасибо. (y)
 

enjoynering

Well-known member
Просто надо не боятся заходить в исходники arduino. Там не кусают. Открываем *.h и *.cpp билиотек, читаем код - многие вопросы сами собой отпадают.
 

ART_HA

Member
Просто надо не боятся заходить в исходники arduino. Там не кусают. Открываем *.h и *.cpp билиотек, читаем код - многие вопросы сами собой отпадают.
Надо сначала нужные исходники найти. У меня три куча ESP32 в ардуине торчало, пришлось всё вычищать, т.к. они мешали обновлению.
Но на этом не закончилось.
К примеру, вот что ему не нравится в
Код:
if (MODE != 0) digitalPinToInterrupt(SINCHRO);
Пишет:
second operand of conditional expression has no effect [-Werror=unused-value]
 

enjoynering

Well-known member
Надо сначала нужные исходники найти. У меня три куча ESP32 в ардуине торчало, пришлось всё вычищать, т.к. они мешали обновлению.
Но на этом не закончилось.
К примеру, вот что ему не нравится в
Код:
if (MODE != 0) digitalPinToInterrupt(SINCHRO);
Пишет:
second operand of conditional expression has no effect [-Werror=unused-value]
Вот так надо
(MODE != 0) {digitalPinToInterrupt(SINCHRO);}
 

ART_HA

Member
Ответ неправильный. :)
А правильный скорее всего в том, что digitalPinToInterrup для ESP32 отсутствует как таковой.
 

ART_HA

Member
Эту пробовали?
Однако проблема.
На выходе что попало, но очень похоже на примерно ежесекундное вклинивание более приоритетного неизвестного прерывания.
Свел код к минимуму:
C:
#include "Ticker.h"
Ticker timer0;
Ticker timer1;
    void IRAM_ATTR ISR_StartT1() {
          timer0.once_ms(5, ISR_StopT1);
      }
    void ISR_StopT1() {
          digitalWrite(33, HIGH);
          timer1.once_ms(1, ISR_StartT2);
      }
    void ISR_StartT2() {
          digitalWrite(33, LOW);
    }
void setup() {
    pinMode(27, INPUT);
    pinMode(33, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(27), ISR_StartT1, CHANGE);
}
void loop() {
;
}
 
Сверху Снизу