Watchdog срабатывает 1 раз

Aven
Offline
Зарегистрирован: 16.04.2015

Имеем arduino Pro Micro на базе Atmege32u4, добавил в setup запуск таймера:

wdt_enable(WDTO_8S);

 

Через 8 секунд контроллер нормально перезагружается, и больше этот таймер не срабатывает.

Почему такое может быть?

wdt_disable();

перед включением никак не помогает...

Araris
Offline
Зарегистрирован: 09.11.2012

Лучше один раз увидеть.. покажите весь скетч.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Поищите по форуму, где то есть информация о косяках с бутлоадерами, если не путаю, только в уно все в порядке по дефолту, у других загрузчик меняли. Есть даже тестовые скетчи, как проверить разные Дуни.

toc
Offline
Зарегистрирован: 09.02.2013

>Через 8 секунд контроллер нормально перезагружается

и нормально работает?
нано с дефолтным бутлоадером уходит в циклическую перезагрузку и красиво мигает всеми светиками. помогает только отключение питания.

Aven
Offline
Зарегистрирован: 16.04.2015

#include <avr/wdt.h>

void setup() {
  int i;
  
  pinMode(10, OUTPUT);
  
  for (i=0; i < 30; i++) {
    digitalWrite(10, digitalRead(10)==1?0:1); delay(50);
  }  
  
  wdt_disable();  
  wdt_enable(WDTO_8S);
}

void loop(){
}
Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Это Вы на этом скетче тестируете?
Тогда Вам рановато браться за сторожевой таймер!
Для начала прочтите за что отвечают секции сетап и луп, попробуйте поморгать светодиодами.
С сторожевым таймером нормально, без замены бутлоадера, работает уна, с другими, лично не проверял.

alexvs
Offline
Зарегистрирован: 22.07.2014

Хотите почитать про watchdog, вам сюда http://geektimes.ru/post/255800/

Aven
Offline
Зарегистрирован: 16.04.2015

Gres А чем плох этот скетч для проверки работы WD ? Вас так смущает пустая секция loop() ? Вкурсе про функцию main() и как запускаются функции setup и loop ?

alexvs Вы бы еще в поиск отправили. Я уже прочитал про WD и пытаюсь его использовать, он работает не так как написано в документации. Причем в bootloop не впадает.

Aven
Offline
Зарегистрирован: 16.04.2015

Если напрямую писать в регистры, все тоже самое происходит. В первый раз срабатывает таймер, а больше фиг.

  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = (1<<WDE) | (1<<WDP3);

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Если Вы во всем супер-спец, для чего задаете вопросы?

Пытаетесь блеснуть своим знанием Си? А тупо инвертировать значение пина на порту не пробовали? Или такая простота не для супер-кодеров?

Aven
Offline
Зарегистрирован: 16.04.2015

Проблема частично решена.

При питании от внешнего источника напряжения (даже через USB), все отрабатывает нормально.

Проблема наблюдается только при подключении к USB порту компьютера.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Aven пишет:

Проблема наблюдается только при подключении к USB порту компьютера.

ну, да - через USB подаётся бракованое напряжение питания.

alexvs
Offline
Зарегистрирован: 22.07.2014

Если Вы и так все знаете, раскажите тайный смысл двух подряд идущих строк Вашего скетча?

wdt_disable(); 
wdt_enable(WDTO_8S);