|
|
  |
Watch Dog Timer |
|
|
|
Mar 5 2015, 19:35
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Д_М @ Mar 5 2015, 21:54)  Правильно ли я понял, что для включения вотч дога его надо разблокировать, записав в регистр WDE + WDCE . Далее записать WDE + WDP, но без WDCE. Выключение аналогично, с той разницей, что WDE равен нулю. Сброс таймера производится выключением и повторным включением, согласно вышеописанной последовательности? Поняли вы правильно - действительно, если WDT вам не нужен, то можно записать и ноль. Тем не менее, ваш способ программирования не пройдет. Обязательно требуется, что бы между установкой бита WDCE и его сбросом прошло не более 4-х тактов. Впрочем, точное число тактов я помню не твердо, но примерно где-то так. Т.е. вызов функции и возврат это слишком долго. Кроме того, необходимо либо запретить все прерывания на этот момент, либо делать это в самом начале программного кода, когда прерывания еще не разрешены. А противном случае может угораздить прерывание между установкой и сбросом бита WDCE. Т.е. функции придется переписать. Например так: Код void WDT_on() { __disable_interrupt(); WDTCR |= (1<<WDCE) | (1<<WDE) | (1<<WDE) | (1<<WDP2); WDTCR |= (1<<WDE) | (1<<WDE) | (1<<WDP2); __enable_interrupt(); }
void WDT_off() { __disable_interrupt(); WDTCR |= (1<<WDCE) | (1<<WDE); WDTCR = 0; __enable_interrupt(); }
|
|
|
|
|
Mar 6 2015, 02:39
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата Сброс таймера производится выключением и повторным включением, согласно вышеописанной последовательности? Нет, для этого существует специальная команда "wdr". Проще использовать инлайны из <avr/wdt.h> (При условии что у Вас AtmelStudio, хотя и в других компиляторах есть подобное) Код wdt_reset (); wdt_enable(WDTO_2S); wdt_disable(); Насколько я помню, WatchDog можно включить и без установки FUSE-бит. Главное отличие при включении из FUSE-бит - WatchDog нельзя выключить программно. Или я ошибаюсь?
|
|
|
|
|
Mar 6 2015, 06:23
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Сторожевой таймер включается либо фьюзами, либо программно. К примеру, ATMEGA8515, ATMEGA8535 - WDT включается фьюзами, настраивается программно. Если WDT включен фьюзами и в программе нет блока инициализации, настройки WDT, то он всегда будет работать на 16 мс. Учитывайте это при написании программ для МК у которых WDT включается фьюзами. ATMEGA32, ATMEGA32A - программно. Уточнять в даташите на конкретный МК.
Кстати, Ксения, есть какие-нибудь, признаки, без даташита определять по названию МК, программно или фьюзами включается сторожевой таймер? Или тупо от даты разработки, выпуска МК?
Сообщение отредактировал demiurg1978 - Mar 6 2015, 06:55
|
|
|
|
|
Mar 6 2015, 10:12
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185

|
Цитата(demiurg1978 @ Mar 6 2015, 10:23)  Сторожевой таймер включается либо фьюзами, либо программно. К примеру, ATMEGA8515, ATMEGA8535 - WDT включается фьюзами, настраивается программно. Если WDT включен фьюзами и в программе нет блока инициализации, настройки WDT, то он всегда будет работать на 16 мс. Учитывайте это при написании программ для МК у которых WDT включается фьюзами. ATMEGA32, ATMEGA32A - программно. Уточнять в даташите на конкретный МК.
Кстати, Ксения, есть какие-нибудь, признаки, без даташита определять по названию МК, программно или фьюзами включается сторожевой таймер? Или тупо от даты разработки, выпуска МК? Спасибо! Всё получилось. Код рабочий. Например, Mega128, для которой и делалось всё вышеупомянутое, имеет три режима вотч дога. Первый - совместимость с Mega103, второй - Mega128 Вотч дог отключаемый, третий - Mega128 Вотч дог включен постоянно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|