• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Последнее редактирование:
Сверху Снизу