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

как работает deep sleep

artmasterpro

New member
Привет.

Собственно вопрос возник когда я вызвал deep sleep c помощью команды node.dsleep(nil,4) или node.dsleep(0,4)

контроллер проигнорировал команду и продолжил дальше моргать светодиодом.
После того как цикл 50 морганий закончился контроллер подвис и перестал реагировать на ESPLORER.

После ручного резета он опознался снова вошел в цикл, 50 раз мигнул диодом и снова подвис. (для перезаливки программы мне пришлось перезаливтаь nodeMCU)

Если я пишу node.dsleep(50000) МК мигает снова 50 раз (вместо того чтоб на 25м цикле уснуть) он продолжает до 50ти и затем через время сам резетится.

Можете мне разъяснить такое странное поведение????

Спасибо!
 

artmasterpro

New member
Ну разумеется читал, правда ничего не понял про 4 режима, особенно про первые два.

Но не зависимо от режима МК то должен входить в слип сразу ? Или нет?
 

Victor

Administrator
Команда форума
Но не зависимо от режима МК то должен входить в слип сразу ? Или нет?
нет.
нужно указывать время в микросекундах в первом параметре, тогда модуль уснет сразу и проснется через этот промежуток времени.
например [inline]node.dsleep(1000000, 4)[/inline] - заснуть на 1 секунду
а 50 000 микросекунд - это всего 0,05 сек
 

artmasterpro

New member
Вот такой код:

Код:
gpio.mode(2, gpio.OUTPUT)

cnt = 0  
while (cnt<50) do
cnt=cnt+1
gpio.write(2, gpio.HIGH)
             tmr.delay(90000)
             gpio.write(2, gpio.LOW)
                 tmr.delay(90000)
                
     print("(" .. cnt .. ") counting...")
          
    if cnt == 25 then
        node.dsleep(3000000, 4)
       print("....................SLEEEEEEEEEEEEEEEEP.............")
    end       
    end
После окнчания цикла - МК уходит в сон на 3 сек. НО ПОЧЕМУ НЕ ПО СРЕДИНЕ ЦИКЛА???
 

pvvx

Активный участник сообщества
Наверно по тому, что deep_sleep - это полная перезагрузка и старт всего заново.
 

pvvx

Активный участник сообщества
Т.е. вы хотите сказать, что deep_sleep срабатывает тогда когда все команды отработаны и МК типа простаивает??
deep_sleep - это же полная перезагрузка с новой инициализацией всего.
Как она может сработать в цикле и продолжить его, если при исполнении deep_sleep происходит перезагрузка?
CPU и всё отключается, остаются работать только RTC и через назначенное в их счетчике время дергают GPIO16 связанное с RESET CPU.
И deep_sleep не работает на всех модулях NodeMCU - там напаяны неправильные резисторы и нет соединения RESET с GPIO16. По резисторам - это как повезет с покупкой. :p
 

artmasterpro

New member
Для тупых пожалуйста, поясните как понять когда МК уйдет в deep sleep? чтобы программно можно было среагировать.
Спасибо!
 

Юрий Ботов

Moderator
Команда форума
Для не слишком тупых: ПОСЛЕ deep_sleep программа перезапустится С НАЧАЛА, а не с места где встретила deep_sleep. Просто логика другая у программы должна быть... В цикле deep_sleep не имеет смысла.
 

ivy

New member
deep_sleep - это же полная перезагрузка с новой инициализацией всего.
+1 :)

После пробуждения полезно прочитать "причину загрузки" (node.bootreason()). В программе можно написать обработку:
Если проснулись ото сна, то перейти ко второму/следующему кругу цикла. Иначе - решать, что делать в зависимости от причины перезагрузки.
 

pvvx

Активный участник сообщества
После пробуждения полезно прочитать "причину загрузки" (node.bootreason()).
В китайском SDK, начиная с версии 1.4.x перезагрузка по deep_sleep дает что перезагружено по "протектед". Ошибка там у них. У меня лечится патчем libmain.a.
 

artmasterpro

New member
ПОСЛЕ deep_sleep программа перезапустится С НАЧАЛА
ДА, это логично. Я не могу понять почему МК не уходит в сон сразу по команде deep sleep, а сначала выполняет цикл до конца (как бы игнорируя deep sleep), а только потом по выходу из цикла - уходит в сон.
Понимаете о чем я?
 

pvvx

Активный участник сообщества
ДА, это логично. Я не могу понять почему МК не уходит в сон сразу по команде deep sleep, а сначала выполняет цикл до конца (как бы игнорируя deep sleep), а только потом по выходу из цикла - уходит в сон.
Понимаете о чем я?
По тому, что system_deep_sleep() назначает таймер с процедурой system_deep_sleep_instant() через 100 ms: esp8266web/user_interface.c at master · pvvx/esp8266web · GitHub
И в конце исполнения system_deep_sleep_local_2() в IRAM, по ret.n из этой функции выходит в system_deep_sleep_instant() находящуюся в FLASH, но "кеширование" FLASH отключено и процессор нарывается на "протектед", записывая в память RTC код перезагрузки по "протектед", а не по "deep_sleep". Причина в том, что команда вывода в порт IO_RTC_2 = 1<<20 отрабатывает не сразу, а спустя время работы fifo шины CPU к периферии. Особенно актуально если проц включен на 160 MHz.
Это китайская ошибка всех последних SDK и лечиться только бинарным патчем их библиотеки. По тому все китай-описания и примеры с deep_sleep и перезагрузкой с установленными параметрами для WiFi не работают.
Примеры аналогичных тем: Не работает WiFi после выхода из deep sleep - и никогда не заработает по нормальному, что бы вы там не делали в NodeMCU или Arduino-esp8266. :)

Так-же выход из deep_sleep не работает, если GPIO0 = "0", GPIO1 = "1", GPIO2 = "0" (boot mode: (2,x)) при старте, а приводит к вечному зависону. Всё это работает только в моей Web-свалке, т.к. запатчено, исправлено, обойдено алгоритмически в моем meSDK.
 
Последнее редактирование:
Сверху Снизу