Перейти к содержанию
    

atmega328PA и ее WDT

Привет всем

Хотел сделать перезагруз проца по команде, для этого по флажку перестаю сбрасывать собаку.

При этом проц. не перезагружается, а типа виснет. Ни на что не реагирует, кроме аппаратного сброса.

Процедуру для включения собаки делаю в 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, ничего похожего там нет.

Явно проблема с головой, не могу понять с чьей.

Прошу помощи.

 

Олег

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

после тщательного изучения матчасти вроде нашел ответ. Завтра проверю.

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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При входе в main() первым делом выключите WDT, сбросив WDRF и очистив бит WDE. И только потом делайте свои процедуры настройки WDT. Просто имейте ввиду, что при сбросе активность WDT не меняется (если был включен, то и останется включенным; если был выключен - останется выключенным), а вот биты предделителя WDP[2:0] еще как сбрасываются на свои начальные 16мс, чего Вам вполне может не хватать при старте. Вот и получается бесконечный круговорот сбросов, наблюдаемый как глухой зависон.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите толковое описание на русском в https://tsibrov.blogspot.com/2019/06/arduino-interrupts-part2.html

Там есть подробно и про WDT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет всем.

Да, дело именно в НЕ сбросе WDT после его сработки.

Вот же ребята фичу сделали, так сделали.

 

Спасибо всем за помощь.

Изменено пользователем alik_tv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...