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

Нужна помощь Exception (9): Sonoff Dual уходит в перегрузку

Pavlo

New member
Проблема: при нажатии на кнопку (замыкание контактов на "Button-0"), модуль перегружается, выдавая в консоль несколько раз:
Код:
: Exception (9):
epc1=0x40105538 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000003 depc=0x00000000
sp: 3ffffca0 end: 3fffffb0 offset: 01a0
Код:
: Exception (9):
epc1=0x401055d9 epc2=0x00000000 epc3=0x00000000 excvaddr=0xffffffff depc=0x00000000
ctx: sys
sp: 3ffff490 end: 3fffffb0 offset: 01a0
- Он один раз или несколько раз таким образом перегружается?

Скетч мало провереный, но работает уже 2 месяца на другой Sonoff Dual, открывая и закрывая жалюзи, как по нажатию на внешние кнопки, так и из мобилки (и по времени из самой RaspberryPi, где и стоит Mosquito)

Прошиваю с ArduinoIDE.

Кто посоветует, куда смотреть?

P.S. Вечером попробую еще один/другой модуль. Блин, так обрадовался, что новые модули пришли... что сейчас жалюзи на других окнах автоматизирую, а тут такое "фу".
 
Последнее редактирование:

Pavlo

New member
Есть ли где-то рассшифровки, что означают номера ошибок:
Exception(0), Exception(1) или вот моя Exception(9) ?
 

Pavlo

New member
Нашел вот такое: GitHub - me-no-dev/EspExceptionDecoder: Exception Stack Trace Decoder for ESP8266 and ESP32

Надо будет установить и проверить, что даст...
Исходя из сего EspExceptionDecoder/EspExceptionDecoder.java at master · me-no-dev/EspExceptionDecoder · GitHub
Моя ошибка номер 9, т.е. "LoadStoreAlignmentCause: Load or store to an unaligned address"
 

pvvx

Активный участник сообщества
Исходя из сего EspExceptionDecoder/EspExceptionDecoder.java at master · me-no-dev/EspExceptionDecoder · GitHub
Моя ошибка номер 9, т.е. "LoadStoreAlignmentCause: Load or store to an unaligned address"
Адрес ошибки всё время разный? Если - да, то это может быть не связано с кодом, а аппаратный сбой, приводящий к перезагрузке при неверно выставленных GPIO. По данным в регистрах очень похоже на вылет на ошибку уже при самой перезагрузке - перезагрузка по ветке 'Jump Boot' (не поддерживаемая разработчиками SonOff), а не с Flash.
Jump Boot: GPIO0 = "0", GPIO1 = "1", GPIO2 = "0" (boot mode: (2,x))
Для аппаратных сбоев у SonOff есть множество причин - одна из них ЭМИ от близко расположенной реле при коммутации разных типов нагрузок...

Для более точного выяснения адреса ошибки смотрите лог asm-а кода вашей прошивки от компилятора, согласно адресу...
 
Последнее редактирование:

Pavlo

New member
Адрес ошибки всё время разный?
Происходит так: замыкаю GPIO-0 на минус - для перепрошивки и в таком состоянии прошиваю черет ТТЛ-конвертер.
После прошивки, модуль сам тут же загружается (GPIO-0 остается замкнуто) и начинает отрабатывать залитый скетч (фича такая у Sonoff-Dual).
Т.е. коннектится в WiFi, шлет в Serial мою отладочную информацию (которуя я сам же и выдаю из различных частей скетча), коммуницирует по mqtt с Mqtt-брокером (я вижу в логах mosquito, как он прислал свое состояние).
Далее, я замыкаю вручную контакты, на которых потом будет кнопка, загорается красный светодио (т.е. F330 отработала и наверняка замкнула реле... вечером проверю) и сразу же в консоль несколько раз валятся ошибки Exception(9) с дампом... кажется раза 3 ил 4 и, отвечая на ваш вопрос - во время этих ошибок значение (адрес) у epc1=... и у excvaddr=... все время разный.
После чего в косоле появляются пару кракозябл (нечитаемых символов) и все замирает.

Что я попробую:
- сначала запитать модуль через TTL-конвертер без замкнутой GPIO-0
- попробую послать mqtt-команду на переключение реле.
- потом запитать от 220В.
...
...
- ну и в конце попробую следующий модуль (блин, самое неприятное, если тут какой-то брак в партии. Я же купил 5 штук) :)
 

Pavlo

New member
Стабильно работает, если не трогать (не замыкать) контакты на самом модуле.
Контакты можно аккуратно замкнуть, чтобы не было "дребезга". Тогда срабатывает нормально.
Как только замыкаю контакты с "дребезгом" - модуль сразу валится в перегрузку.
Расшифровка дампа ошибки:
Код:
Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
Decoding 22 results
0x40105538: ets_timer_setfn at ?? line ?
0x40105764: ets_timer_arm_new at ?? line ?
0x4022490a: tcp_output at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/tcp_out.c line 990
0x40201098: delay at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring.c line 45
0x402031aa: ClientContext::write(char const*, unsigned int) at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClient.cpp line 327
0x402031d4: WiFiClient::write(unsigned char const*, unsigned int) at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClient.cpp line 327
0x401054d6: wdt_feed at ?? line ?
0x40203654: PubSubClient::write(unsigned char, unsigned char*, unsigned short) at G:\Users\Tester\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.cpp line 590
0x4010053d: _umm_realloc at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1491
:  (inlined by) realloc at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1709
0x40105764: ets_timer_arm_new at ?? line ?
0x402038b0: PubSubClient::publish(char const*, unsigned char const*, unsigned int, unsigned char) at G:\Users\Tester\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.cpp line 590
0x4020427c: String::changeBuffer(unsigned int) at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/WString.cpp line 339
0x402038ee: PubSubClient::publish(char const*, char const*, unsigned char) at G:\Users\Tester\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.cpp line 590
0x402043c0: String::operator=(String const&) at G:\Users\Tester\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/WString.cpp line 339
0x4020254c: MqttWrapper::publishState(String) at G:\Users\Tester\AppData\Local\Temp\arduino_build_588850\sketch/MqttWrapper.cpp line 61
0x4020217e: readSerialFromF330() at D:\Development\Arduino\Esp8285_Dual\JalousieOnSonoffDual-1/JalousieOnSonoffDual-1.ino line 88
0x4021ad05: ets_timer_handler_isr at ?? line ?
0x4021ad4a: ets_timer_handler_isr at ?? line ?
0x4021a96f: ets_snprintf at ?? line ?
 

Pavlo

New member
Вроде бы модуль позже куплен, вроде бы должен быть получше.
Как вспомню, сколько я проигрался с предыдущим, пытаясь выловить "длинное нажатие".
Там "дребезг" ну никак не прокатывал.
 

Юрий Ботов

Moderator
Команда форума
ревность (jalousie) никого до добра не доводила :) (шутка и только)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Далее, я замыкаю вручную контакты, на которых потом будет кнопка, загорается красный светодио (т.е. F330 отработала и наверняка замкнула реле... вечером проверю) и сразу же в консоль несколько раз валятся ошибки Exception(9) с дампом... кажется раза 3 ил 4 и, отвечая на ваш вопрос - во время этих ошибок значение (адрес) у epc1=... и у excvaddr=... все время разный.
После чего в косоле появляются пару кракозябл (нечитаемых символов) и все замирает.
Ну тут четко определить причину не выйдет. Неоднозначность ситуации: не известно, есть ли нагрузка на реле, какие данные и как распределились от того-же MQTT. Но общее описание все-же походит на аппаратный сбой. До вполне банального провала питания при включении реле.
 

pvvx

Активный участник сообщества
Как только замыкаю контакты с "дребезгом" - модуль сразу ....
К сожалению сейчас нет под рукой Дуал СонОфф на даче :) и скетч не проверить. Но похоже вы уже нашли причину - впишите подавление дребезга кнопки/контакта...
 

Pavlo

New member
К сожалению сейчас нет под рукой Дуал СонОфф на даче :) и скетч не проверить. Но похоже вы уже нашли причину - впишите подавление дребезга кнопки/контакта...
Так ведь в том и беда, что не все так просто.
Как иметь дело с esp8266 - кругом описано.
А вот как перепрошить F330, которая собственно говоря и занимается передачей сигналов: реле-контакт-esp8266 (по Serial), я нигде не встречал.
 

Pavlo

New member
Вот тут на картинке есть.
Контакты для перепрошивки F330 я обвел. И стрелкой на саму F330 указал.
Такое вот...
Кстати, только сейчас в голову мысль пришла: а если залить пустой скетч и спровоцировать "дребезг" на контактах, уйдет ли плата в перезагрузку?
Ведь если не уйдет, т.е. F330 нормально отрабатывает, бедные релюшки будут трещать трещеткой... то получается, что нужно просто в скетче сию ситуацию красиво обработать..? ;)
В описаном случае нет ничего хорошего для самого модуля, ведь злоупотребление "дребезгом" ничего хорошего не сулит самому модулю (реле?), ни мотору.
Ну что ж, сдаваться так просто не охота, пойду искать в интернете, что народ по поводу "дребезга" для Sonoff Dual пишет.
Кстати, как "дребезг" на английском будет? :D
P.S. картинка не моя - честно откуда-то спер и дорисовал стрелочки. ;)
 

Вложения

Последнее редактирование:

Pavlo

New member
...
Кстати, только сейчас в голову мысль пришла: а если залить пустой скетч и спровоцировать "дребезг" на контактах, уйдет ли плата в перезагрузку?
Ведь если не уйдет, т.е. F330 нормально отрабатывает, бедные релюшки будут трещать трещеткой... то получается, что нужно просто в скетче сию ситуацию красиво обработать..? ;)
...
Пустой скетч с легкой дебаг-информацией не зависает. Клацал и так и эдак. Замыкал быстро и медленно.
Значит аппаратно - все ок.
Новость хорошая. ;)
 

Pavlo

New member
Вылетает именно при попытке повторно отослать mqtt-брокеру текущее состояние (без паузы).

State: WAITING -> cur.position: 48.00 %, callibration Off
Publish. Topic:home/kitchen/window/motor/state
Publish. Value:2
Publish. Topic:home/kitchen/window/motor/state
Publish. Value:0

Exception (9):
epc1=0x40105538 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000003 depc=0x00000000
 
Последнее редактирование:

Pavlo

New member
Отпишусь и... можно тему закрыть.
Проблема была в коде скетча.
А именно - проблема была в call-back функции, которая вызывалась для отслылки нового значния mqtt-брокеру (статуса и позиции жалюзей).
Дело в том, что вызов call-back функции имеет определенный таймаут на завершение.
Если функция выполняется дольше, чем "позволяет" WDT (watch dog timeout), то WDT производит "Soft reboot" модуля.

Как выглядит "fix": вызов mqttClient.publish(topic, value) вынесен в основной цикл. А в call-back функции я просто меняю значение переменных и флаг "готов-к-публикации".
 
  • Like
Реакции: kab
Сверху Снизу