|
|
  |
Проблемы с WatchDog ATMEGA2560 |
|
|
|
Nov 25 2009, 20:41
|

Участник

Группа: Свой
Сообщений: 74
Регистрация: 9-01-07
Из: Украина
Пользователь №: 24 228

|
Доброе время суток  Столкнулся с проблемой работы WatchDog-a. При старте всей программы пытаюсь отключить WatchDog, как написано в доке: Код void WDT_off(void) { __disable_interrupt(); __watchdog_reset(); /* Clear WDRF in MCUSR */ MCUSR &= ~(1<<WDRF); /* Write logical one to WDCE and WDE */ /* Keep old prescaler setting to prevent unintentional time-out */ WDTCSR |= (1<<WDCE) | (1<<WDE); /* Turn off WDT */ WDTCSR = 0x00; __enable_interrupt(); } Но к огромному сожалению, камень все равно рестартует  В чем трабл ....
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Nov 25 2009, 21:04
|

Участник

Группа: Свой
Сообщений: 74
Регистрация: 9-01-07
Из: Украина
Пользователь №: 24 228

|
Доброго дня  Что то случилось с темой  Убрал я WDTOn, но все равно идет перегруз процессора. И есще вопрос, как моно настроить watchDog, на ресет камня, только когда нуна
|
|
|
|
|
Nov 26 2009, 09:51
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 10-02-05
Из: Краснодар
Пользователь №: 2 558

|
А точно через WDT рестарт происходит ? А если вообще WD не трогать то рестартует ? fuse WDTON=1(off) должен быть. Цитата(Vladimir_J @ Nov 26 2009, 00:04)  И есще вопрос, как моно настроить watchDog, на ресет камня, только когда нуна  Выставляете биты WDP3 WDP2 WDP1 WDP0 по таблице 12-2, и где надо ставите wdrы.
Сообщение отредактировал Ronin - Nov 26 2009, 09:55
|
|
|
|
|
Nov 26 2009, 13:05
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586

|
Я так Мегу 1281 так и не заставил перегружаться из проги через WDT. M128 работает без вопросов. Позвонил друзьям в питер, сказали что есть такая партия.
|
|
|
|
|
Nov 26 2009, 13:51
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Vladimir_J @ Nov 25 2009, 22:41)  Но к огромному сожалению, камень все равно рестартует  Код WDTCSR |= (1<<WDCE) | (1<<WDE); /* Turn off WDT */ WDTCSR = 0x00; между этими двумя командами должно пройти не более 4 тактов. Как правило операция |= компилится в нечто большее, чем пара команд. Замените эту конструкцию на Код WDTCSR = (1<<WDCE) | (1<<WDE)|(тут ваши установки прескаллера); /* Turn off WDT */ WDTCSR = 0x00;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 26 2009, 14:11
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586

|
А что может быть, если прескаллер WDT настроен на 8 сек, стартую внутри программы, засекаю, через 8 сек проиходит сброс и (или) зависание программы. Запуск только через выключение питания?
|
|
|
|
|
Nov 26 2009, 16:03
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586

|
Программа работает: графика, измерения, обмен и тп. Восстанавливаю "заводские" настройки в eeprom и хочу перезапустить прибор. Вот так перезапустится?
__disable_interrupt(); __watchdog_reset(); WDTCSR = (1<<WDCE) | (1<<WDE); WDTCSR = (1<<WDE) | (1<<WDP0) | (1<<WDP3); __enable_interrupt(); while(1) {}
|
|
|
|
|
Nov 26 2009, 16:24
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586

|
Все что было сказано сейчас и раньше перепробывал. Поставил опять 128. Все заработало. Всем спасибо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|