Pull to refresh

Comments 12

Насчет сброса внешней периферии это конечно сильно… но вач-дог не сможет сбросить внешнюю периферию, переход на 0-й адрес будет иметь тот же эффект. Единственное что делает вач-дог, так это действительно инициализирует всю внутреннюю периферию, но при этом содержимое регистров и RAM остается нетронутым, при желании можно даже выяснить причину и/или место зависания если в одной ячейке памяти оставлять контрольную метку(как это делает POST-check на больших числодробилках). Причину перезагрузки тоже можно выяснить, только предусмотрено ли это в ардуине?

Не знаю как это реализовано в ардуине, но вач-дог на современных камушках имеет два режима работы — мягкий и жесткий. Мягкий — сначала вызывает прерывание, и только если оно не будет обработано до наступления второго переполнения происходит хард-резет. Иногда это удобно в режиме глубокого сна, когда надо проснуться по клавиатуре или какому-то датчику. И жесткий режим — собственно что и описано в статье, досчитал до конца — и сразу хардрезет.
Единственное что делает вач-дог, так это действительно инициализирует всю внутреннюю периферию, но при этом содержимое регистров и RAM остается нетронутым

Собственно, как и в случае с «железным» ресетом. Такой приём применяется, когда недостаточно IO-портов, и кнопка управления вешается на RESET.
Есть ли эта проблема в том случа отсутствия загрузчика (при записи программы через isp)?
Если есть, то достаточно ли добавить wdt_disable() в setup(), или надо успеть вызвать до setup()?
Эта проблема загрузчика. Если его нет, то и проблемы быть не должно — все зависит от вашей программы. В любом случае нужно проверять.
Спасибо за статью. А вы не в курсе, как быть с ProMini 5V? Её прочему — то в списке optiboot нет. Есть только 3.3V версия
А есть разница между 3.3v и 5v для загрузчика, если используется внешний кварц? Я конечно не уверен — но мне кажется разницы быть не должно.

3.3В версии имеют кварц на 8МГц, 5В версии на 16МГц

Для справки, мне функция get_mcusr() все же помогла, но я не использую ардуиновский загрузчик, своя плата и чип Atmega328p-au, но код написан в Arduino IDE, без этой функции при срабатывании watchdog чип увисал, видать не успевал в с setup() отрабатывать wdt_disable()
Добрый день! Тоже пишу программу для своего устройства на Atmega328p-au и Atmega64. Пишу на Arduino IDE. Надеялся, что если буду прошивать чипы без загрузчика, то не столкнусь с проблемой bootloop'а.
Вы, я вижу, все равно столкнулись. Функцию get_mcusr() нужно добавит в любое место кода? Я чего-то не вкурю никак :(
Конечно, я несколько запоздал с комментарием, но вот мне прямо только что эта статья пригодилась. Прикрутил к своему «ящичку» :)
Темка старая, но решил отписаться для информации т.к. нашёл её через поисковик.

Имею два экземпляра Arduino Mega с Ethernet shield, один на китайском CH340, второй полноценный. ) Пишу скетч, который, принимая соединение по TCP/IP, управляет внешними устройствами. Поскольку либы ethernet сыроваты, watchdog просто необходим. Скетч вис с регулярностью 10-30 мин гарантированно.

Поскольку узнать версию или контрольную сумму бутлоадера из скетча невозможно, я решил сыграть в рулетку. К моему удивлению, на обеих платах watchdog запустился отлично, платы пашут без зависания уже несколько суток. На одном из зарубежных сайтов прочитал, что достаточно использовать WDTO_8S (проблема сброса этой константы на минимальное значение при Reset там даже не упоминается), что я и сделал. Код:

void setup()
{

// init watchdog

wdt_reset(); // reset watchdog counter
wdt_disable();
wdt_enable(WDTO_8S); // watchdog 8s timeout
............
}

void loop() {

wdt_reset(); // reset watchdog counter
...............
}


Возможно, у меня более свежие версии Ардуин и бутлоадеров. Покупались они на Али примерно в 2016, пишу из 2019. ))
Да, эта проблема проявляется только на некоторых девайсах. Что касается использования связки Arduino+Ethernet — основные проблемы возникают при недостаточном питании и большой длине проводов. Я уже давно перешел на ESP8266 со встроенным WiFi и забыл эти глюки с сетью как страшный сон )
Only those users with full accounts are able to leave comments. Log in, please.