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