alik_tv 0 26 мая, 2021 Опубликовано 26 мая, 2021 · Жалоба Привет всем Хотел сделать перезагруз проца по команде, для этого по флажку перестаю сбрасывать собаку. При этом проц. не перезагружается, а типа виснет. Ни на что не реагирует, кроме аппаратного сброса. Процедуру для включения собаки делаю в main, саму процедуру взял из его описания. void WDT_On(void) { __disable_interrupt(); __watchdog_reset(); WDTCSR |= (1<<WDCE) | (1<<WDE); WDTCSR = (1<<WDE)| (1<<WDP0)| (1<<WDP1)| (1<<WDP2); // 2s __enable_interrupt(); } Сбрасываю так if (ucFlagReset == StatusFlag_Off) __watchdog_reset(); У этого проца появилось прерывание WDT, поэтому на всякий случай сделал пустое прерывание по WDIF, не помогло. Пробовал команду сброса делать в прерывании и в бесконечном цикле(зачем?), в main-е, никакой разницы. В отчаянии полез на столб прочитал errata, ничего похожего там нет. Явно проблема с головой, не могу понять с чьей. Прошу помощи. Олег Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alik_tv 0 26 мая, 2021 Опубликовано 26 мая, 2021 · Жалоба после тщательного изучения матчасти вроде нашел ответ. Завтра проверю. Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not set up to handle the Watchdog, this might lead to an eternal loop of time-out resets. To avoid this situation, the application software should always clear the Watchdog System Reset Flag (WDRF) and the WDE control bit in the initialization routine, even if the Watchdog is not in use. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 26 мая, 2021 Опубликовано 26 мая, 2021 · Жалоба При входе в main() первым делом выключите WDT, сбросив WDRF и очистив бит WDE. И только потом делайте свои процедуры настройки WDT. Просто имейте ввиду, что при сбросе активность WDT не меняется (если был включен, то и останется включенным; если был выключен - останется выключенным), а вот биты предделителя WDP[2:0] еще как сбрасываются на свои начальные 16мс, чего Вам вполне может не хватать при старте. Вот и получается бесконечный круговорот сбросов, наблюдаемый как глухой зависон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 27 мая, 2021 Опубликовано 27 мая, 2021 · Жалоба Посмотрите толковое описание на русском в https://tsibrov.blogspot.com/2019/06/arduino-interrupts-part2.html Там есть подробно и про WDT. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alik_tv 0 28 мая, 2021 Опубликовано 28 мая, 2021 (изменено) · Жалоба Привет всем. Да, дело именно в НЕ сбросе WDT после его сработки. Вот же ребята фичу сделали, так сделали. Спасибо всем за помощь. Изменено 28 мая, 2021 пользователем alik_tv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PicUni 0 9 сентября, 2021 Опубликовано 9 сентября, 2021 · Жалоба Если ещё актуально, то Arduino watchdog или автоматический RESET в случае зависания / Хабр (habr.com) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться