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

Разработка ‘библиотеки’ малого webсервера на esp8266.

pvvx

Активный участник сообщества
@pvvx, да в том то и дело, что строчка вставленная в app_main.c:
os_printf("Reset reason: %u, %u\n", system_get_rst_info()->reason, rtc_get_reset_reason());
выдает "Reset reason: 6, 2", как в случае включения, так и после нажатия на reset.
Модуль - NodeMCU v3 LoLin.
system_get_rst_info() и прочие шизо функции от Espressif по разметке и загрузке не поддерживаются. Вырезать их из кода нет возможности. Это такая нагрузка от китайцев в придачу. :)
Используйте системные - из ROM-BIOS и указанные примеры на странице Web. Там всё всегда OK.
 

vad7

Active member
@pvvx, так я их оттуда и взял...

else ifcmp("res_event") tcp_puts("%u", rtc_get_reset_reason()); // 1 - power/ch_pd, 2 - reset, 3 - software, 4 - wdt ...
else ifcmp("rst") tcp_puts("%u", system_get_rst_info()->reason);
 

pvvx

Активный участник сообщества
@pvvx, так я их оттуда и взял...

else ifcmp("res_event") tcp_puts("%u", rtc_get_reset_reason()); // 1 - power/ch_pd, 2 - reset, 3 - software, 4 - wdt ...
else ifcmp("rst") tcp_puts("%u", system_get_rst_info()->reason);
А что они должны выдавать если модуль стартанул по reset? :confused:
В чипе есть только значения от RTC (причины загрузки) и защелкнутые пины порта при старте (по фронту reset).
Есть ещё запись в RTC памяти флагов от срабатывания WDT или адресов “протектед” и что перезагруз через reset по deep_sleep. Всё это при старте meSDK передается китайской части. Но там много приколов… - ошибки у китайцев по анализу причин перезагрузки и затычки связанные с багом в переходе к deep_sleep. Вместо отметки deep_sleep в RTC выходит "протектед", а починить это они не могут даже с указанием где это происходит и что надо вставить while(1) уже более года. :) В последних SDK у них уже вписана целая "дедуктивная" функция по анализу этого, но всё равно с ошибками :) Им лень устранить причину, сократив код функции выхода в deep_sleep. Ну нет у ух программеров знаний.
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx, Хорошо, и что делать в таком случае, не подскажете?
В каком случае? В вашем, когда у вас модуль стартует по сигналу reset? :)
Можно посоветовать отжечь этот вывод пихнув туда импульс в много ампер, но короткий - 2..10 нс. :) :)
Соберите генератор на SOS-диодах и отожгите вывод в кристалле.
Модуль - NodeMCU v3 LoLin.
Вы заходили на сайт NodeMCU? Картинку видели? Там явственно показано для какого контингента сделан модуль.
Что делать в таком случае я не знаю. :)
 
Последнее редактирование:

vad7

Active member
@pvvx, Ну да, острить вы любите.
Вы с чипом esp8266 разобрали достаточно досконально.
Он по reset сбрасывает всю память или что-то не трогает?
Если такая есть, при включении в ней нули или случайные значения?
 

pvvx

Активный участник сообщества
@pvvx, Ну да, острить вы любите.
Вы с чипом esp8266 разобрали достаточно досконально.
Он по reset сбрасывает всю память или что-то не трогает?
Если такая есть, при включении в ней нули или случайные значения?
Ничего reset не сбрасывает, кроме адреса исполнения CPU.
Память очищается в стартовой процедуре. bss сегмент должен быть заполнен нулями...
Вы уже годы с ESP8266 и должны всё сами знать. А то для таких скоро введу платную консультацию. :)
И где я острил? Это NodeMCU изначально заявили, что модули они делают для "баранов" и получения прибыли с них.
Или думаете есть другой метод отжечь вывод, не повредив весь кристалл? Этот более менее - вероятность больше, что отожгете, не затронув остального. К примеру простой транзистор или любой полупроводник выдерживает без проблем 1 кВ до 5нс. Он просто не успевает открыться и пропустить большой ток... Срабатывают геометрические емкостные токи проводников, а не кристалл... Тем более платиновый или золотой или серебрянный проводок одного диаметра с медным расплавиться (взорвется) быстрее, чем медный. Это простая физика.
 
Последнее редактирование:

vad7

Active member
@pvvx, вывод ресет мне отжигать не нужно.
Мне нужно было понять как включился модуль, чтобы его попробовать перезапустить.
Щас попробовал - перезапуск не помогает.
Пробовал и system_restart() и _ResetVector.

Не борется софтварно проблема выпадания в режим прошивки при включении:
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 268, room 16
tail 12
chksum 0xca
csum 0xca
...
ets Jan 8 2013,rst cause:2, boot mode:(1,6)

Кондер 50мкФ на ресет помогает в тестовом окружении (голый модуль NodeMCU), а в рабочей обстановке на ESP-12E с подключенной периферией - фиг вам.
Проще повесить на ресет схему сброса через секунду, чем тащить оборудование для анализа...
 

pvvx

Активный участник сообщества
Снимок1160.gif
Вам сказано - ESP8266 в платах NodeMCU использовать можно только ограниченно и они для "баранов". И это связано не только с RESET, но и с выводами RX/TX. Так-же на них не работает deep_sleep.
Сами модули ESP в них запаиваются с самыми дешевыми Flash, которые жрут больше чем у других производителей.
В init.ini файл для них, чтобы выводился лог на 230400 baud (по умолчанию), надо вписать:
Код:
sys_ram0x3ff00028=1
Можно и в командной строке http://aesp8266/web.cgi?sys_ram0x3ff00028=1
 
Последнее редактирование:

Urbas81

Member
А как это отобразить в коде программы, к примеру включил отладку через системное меню, и сразу сделать swap на rx, tx через которые программируем, модбас к примеру пока закоментим?
Я про sys_ram0x3ff00028=1, через адресную строку и сокеты работает, но не очень удобно.
 

pvvx

Активный участник сообщества
А как это отобразить в коде программы, к примеру включил отладку через системное меню, и сразу сделать swap на rx, tx через которые программируем, модбас к примеру пока закоментим?
Я про sys_ram0x3ff00028=1, через адресную строку и сокеты работает, но не очень удобно.
В init.ini файл для них, чтобы выводился лог на 230400 baud (по умолчанию), надо вписать:
Код:
sys_ram0x3ff00028=1
 

Urbas81

Member
это я понял, меня интересует управлять этим из html, установкой чекбокса, разрешили отладку, перебросили вывод, убрали отладку, вернули sys_ram0x3ff00028=0, только не через init.ini.
 

Urbas81

Member
@Urbas81
а разве это не оно?

аякс вам в руки по клику на чекбокс ;)
Ну да, но все равно не совсем то, я хотел вставить именно в код, чтоб это работало после включения по питанию, если энергонезависимая переменная установлена, алгоритм отработает, а галочку надо жмакать каждый раз, я так и через сокеты устанавливаю 1 после включения модуля.
Вставить в код после анализа флага syscfg.cfg.b.debug_print_enable
 

Virtual

New member
если энергонезависимая переменная установлена
так так бы и говорил,
глянь в сторону write_user_const
а инитится лучше в web_int_vars(...)
//как раз в ней и происходит то что ты задумал для других констант
или если максимально рано то в (как раз оное)
user_main.c:user_init(void)
Код:
...
sys_read_cfg();
  if(!syscfg.cfg.b.debug_print_enable) system_set_os_print(0);
добавь в структуру app/include/flash_eep.h:SystemCfg еще одну переменную, и в вэбе обработку прикрути делов то.
 
Последнее редактирование:

Urbas81

Member
так так бы и говорил,
глянь в сторону write_user_const
а инитится лучше в web_int_vars(...)
//как раз в ней и происходит то что ты задумал для других констант
или если максимально рано то в (как раз оное)
user_main.c:user_init(void)
Код:
...
sys_read_cfg();
  if(!syscfg.cfg.b.debug_print_enable) system_set_os_print(0);
добавь в структуру app/include/flash_eep.h:SystemCfg еще одну переменную, и в вэбе обработку прикрути делов то.
Если я правильно понял, запись идет через
else ifcmp("ram") { uint32 *ptr = (uint32 *)(ahextoul(cstr+3)&(~3)); str_array(pvar, ptr, 32); }, я не разобрал как это использовать, в другом месте, там одно за другое цепляется.
write_user_const а вот это попробую.
 

Urbas81

Member
Если я правильно понял, запись идет через
else ifcmp("ram") { uint32 *ptr = (uint32 *)(ahextoul(cstr+3)&(~3)); str_array(pvar, ptr, 32); }, я не разобрал как это использовать, в другом месте, там одно за другое цепляется.
write_user_const а вот это попробую.
Или я не так делаю, или это не та ф-я, не работает, попробовал и user и sys const.
 
Сверху Снизу