Search
Write a publication
Pull to refresh
3
0
Send message

Она там действительно одна. wdt_disable(); но вот не работала. Во всяком случае в 2017 году, не в курсе как сейчас. Подозреваю что внутри этой функции было накручено.

Сейчас открыл RM, нашел это место, вот так там было:

The sequence for clearing WDE and changing time-out configuration is as follows:

  1. In the same operation, write a logic one to the watchdog change enable bit (WDCE) and WDE. A logic one must be written to WDE regardless of the previous value of the WDE bit.

  2. Within the next four clock cycles, write the WDE and watchdog prescaler bits (WDP) as desired, but with the WDCE bit cleared. This must be done in one operation.

Сначала разрешаем изменения, а потом быстро их вносим, пока оно не запретилось обратно. 4 такта для библиотечной функции оказывается слишком мало

Не люблю ардуинки идеологически, а после этого случая особенно. Достался как то раз чужой код и встала задача дописать в него команду на ребут. Ну, дело известное - включаем wdt, зацикливаемся, после ребута выключаем wdt. Не работает. Точнее ребутится-то плата хорошо, даже слишком, а если точнее - то циклически и бесконечно. Смотрели в код тремя парами глаз, выводили отладочные сигналы и трогали их осциллографом - ну вот не выходит из ребута и все тут. Оказалось, что для выключения wdt AVR требует установки битов в регистр в течении какого то количества тактов после старта программы (могу быть не точен за давностью лет, но там действительно был довольно небольшой допуск по времени). Ну а ардуинья библиотека банально не успевала это сделать. Переписали вручную эту часть - всё прекрасно заработало. Мораль - не верьте высокоуровневым библиотекам и читайте референс мануалы на контроллер.

Information

Rating
Does not participate
Registered
Activity