Всё очевидно…
WatchDog Timer Сторожевой таймер в AVR
- VNS
- Говорящий с текстолитом
- Сообщения: 1614
- Зарегистрирован: Пт дек 10, 2021 12:48:46
- Откуда: Тюмень
Re: WatchDog Timer Сторожевой таймер в AVR
[uquote="LEVV2006",url="/forum/viewtopic.php?p=4151970#p4151970"]Мысль то возможно правильная но не очевидная если честно.....[/uquote]
Всё очевидно…
это касается не только этого конкретного МК… возьмите любой другой AVR перекомпилируйте свой код и получите всё тоже самое. Так как в Вашем случае включение и настройка сторожевого таймера происходила по условию в "середине" алгоритма, а не вначале как в классических случаях. Потому и такой подводный камень был найден… при классическом варианте, когда настройка данного таймера производится в начале алгоритма, такого эффекта Вы бы не встретили. А вот в Вашем случае такие моменты необходимо предусматривать. Что и подтвердилось при добавлении в самом начале процедуры отключения сторожевого таймера. На это указывал и тот момент, когда Вы отключали питание МК полностью. Так как при вновь поданном напряжении сторожевой таймер ещё отключен и потому не вносил своего влияния. 
Всё очевидно…
Re: WatchDog Timer Сторожевой таймер в AVR
Подниму тему собаки. Не могу разобраться с watchdog в Atmega88/
Задумано включить таймер в режим прерывания и сброса. Если я правильно понимаю, по первому срабатыванию таймера должно вызываться прерывание, по следующему, если не было сброса wdr, уже генерится сброс контроллера.
Код инициализации:
т.е. задаем период и разрешаем прерывания от сторожевого таймера.
Обработка прерывания
собственно в прерыании происходит сброс таймера командой wdr и перезапуск его.
В симуляции Atmel Studio все работает как задумано. В Proteus и в реальном железе работать не желает. Мозг уже сломал, взываю к чужому разуму.
Задумано включить таймер в режим прерывания и сброса. Если я правильно понимаю, по первому срабатыванию таймера должно вызываться прерывание, по следующему, если не было сброса wdr, уже генерится сброс контроллера.
Код инициализации:
Код: Выделить всё
asm("wdr");
MCUSR &= ~(1<<WDRF); /* Clear WDRF in MCUSR */
WDTCSR |= (1<<WDCE) | (1<<WDE); /* Write logical one to WDCE and WDE */
WDTCSR = 0x00; /* Turn off WDT */
//WD Timer initialization---------------------------------------------------------------------------------------------
wdt_enable(WDTO_1S); // период 1 сек
WDTCSR |= (1<<WDCE) | (1<<WDE)| (1<<WDIE);//разрешить прерывания от WDTОбработка прерывания
Код: Выделить всё
ISR(WDT_vect)
{
asm("wdr");
WDTCSR |= (1<<WDIF); // Clear WDIF
wdt_enable(WDTO_1S);
WDTCSR |= (1<<WDCE) | (1<<WDE)| (1<<WDIE);//разрешить прерывания от WDT
++seconds;
flag_CLOCK = _ON;
}В симуляции Atmel Studio все работает как задумано. В Proteus и в реальном железе работать не желает. Мозг уже сломал, взываю к чужому разуму.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WatchDog Timer Сторожевой таймер в AVR
для начала используйте только средства, которые вам предоставляет библиотека компилятора: wdt_reset, цве_утфидуб не работайте с WDTCSR напрямую, кроме того раза, когда настроили прерывания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: WatchDog Timer Сторожевой таймер в AVR
спасибо. Убрал строку с WDTCSR -- в железе работает. Вопрос закрыт
Re: WatchDog Timer Сторожевой таймер в AVR
Столько возни со сторожевым.
Я вешаю на "ресет" транзистор и с любого пина сбрасываю ,когда захочу и во время делея и в любое другое.
Я вешаю на "ресет" транзистор и с любого пина сбрасываю ,когда захочу и во время делея и в любое другое.
Re: WatchDog Timer Сторожевой таймер в AVR
С любого пина этого же МК? Так для этого нужно, чтобы сработал участок кода, "пинающий" этот пин. А смысл же "собачки" - вывести МК из состояния, когда прога в нём крутится хрен_где_поймёшь и не пинает периодически "собачку", и не получив пинка, она ресетит МК.
Re: WatchDog Timer Сторожевой таймер в AVR
ATmega328 - WDTCSR[WDE] и MCUSR[WDRF] - сокральный смысл?!
по даташиту
итак, имеем
конкретно:
если
то, если срабатывает "Watchdog System Reseт" то устанавливается флаг
что в свою очередь ведет к "переустановке"
но он уже установлен в 1цу
и наоборот, если
то и "Watchdog System Reseт" - не сработает
короче, не понимаю я пока сокрального смысла взамиосвязи и переопределений
WDTCSR[WDE] и MCUSR[WDRF]
спасибо
по даташиту
Код: Выделить всё
### WDTCSR[WDE] Watchdog System Reset Enable
WDE is overridden by WDRF in MCUSR.
This means that WDE is always set when WDRF is set.
To clear WDE, WDRF must be cleared first.
This feature ensures multiple resets during conditions causing failure, and a safe start-up after the failure.
Код: Выделить всё
MCUSR - MCU Status Register
WDTCSR - Watchdog Timer Control Register
Код: Выделить всё
WDTCSR[WDE] - Watchdog Timer Control Register
MCUSR [WDRF] - Watchdog System Reset Flag
Код: Выделить всё
WDTCSR[WDE] = 1
Код: Выделить всё
MCUSR [WDRF] = 1
Код: Выделить всё
WDTCSR[WDE] = 1
и наоборот, если
Код: Выделить всё
WDTCSR[WDE] = 0
короче, не понимаю я пока сокрального смысла взамиосвязи и переопределений
WDTCSR[WDE] и MCUSR[WDRF]
спасибо
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
p.s. держитесь обоими руками, а то прорвет...
Re: WatchDog Timer Сторожевой таймер в AVR
с данной проблемой разобрался, спасибо всем! :о)
по ходу тестирования wdt - проявился странный артефак:
после того, как я отладил все что нужно с wdt, я перешел к отладке других частей кода, без wdt и тут... программа начала сбрасываться/перегружаться, как будто я использовал ваЧдоГ, но не сбрасывал его. перепробовал множество пассов (перепрошивка кода, сброс eeprom в дефолт, втч от arduino, манипуляции с фузами, но сам бит WDT_ON не трогал, есно, использовал онлайн калькулятор)... короче, ни чего не помогало, не мог найти "зацепку". после некоторого времени - хобана, прошивка заработал так как надо. ВО, думаЮ, ПОЙМАЛ ЗА КОКИ этот странный глюк (до этого перешивал версии фузов, уст/сброс фуза - "стирать/нет eeprom", что-то еще). решил откатить фузы обратно, как бы "до того", и ... опана! хренушки! ни чего не поменялось! попробовал другие варианты - аналогично, все на месте.
короче, ни чего я не поймал и не отследил. прошивка сбрасывалась по wdt, а потом перестала, и все тут!
какие будут идеи, что это был?! (естественно, кривизна лап, хвоста и усов - ни куда ни делись, но все же...)
- сборка с пом-ю makefile, через make clean
- фуз WDT_ON не трогал
спасибки
по ходу тестирования wdt - проявился странный артефак:
после того, как я отладил все что нужно с wdt, я перешел к отладке других частей кода, без wdt и тут... программа начала сбрасываться/перегружаться, как будто я использовал ваЧдоГ, но не сбрасывал его. перепробовал множество пассов (перепрошивка кода, сброс eeprom в дефолт, втч от arduino, манипуляции с фузами, но сам бит WDT_ON не трогал, есно, использовал онлайн калькулятор)... короче, ни чего не помогало, не мог найти "зацепку". после некоторого времени - хобана, прошивка заработал так как надо. ВО, думаЮ, ПОЙМАЛ ЗА КОКИ этот странный глюк (до этого перешивал версии фузов, уст/сброс фуза - "стирать/нет eeprom", что-то еще). решил откатить фузы обратно, как бы "до того", и ... опана! хренушки! ни чего не поменялось! попробовал другие варианты - аналогично, все на месте.
короче, ни чего я не поймал и не отследил. прошивка сбрасывалась по wdt, а потом перестала, и все тут!
какие будут идеи, что это был?! (естественно, кривизна лап, хвоста и усов - ни куда ни делись, но все же...)
- сборка с пом-ю makefile, через make clean
- фуз WDT_ON не трогал
спасибки
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
p.s. держитесь обоими руками, а то прорвет...
Re: WatchDog Timer Сторожевой таймер в AVR
###!!! UPDATE !!!###
уже не помню чем порешилось, но по моему "все по даташиту" - что-бы wdt не сбрасывал чип нужно было ... гм... отрубить питание :о)
уже не помню чем порешилось, но по моему "все по даташиту" - что-бы wdt не сбрасывал чип нужно было ... гм... отрубить питание :о)
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
p.s. держитесь обоими руками, а то прорвет...
-
Вячеслав М.
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн янв 13, 2025 15:24:02
Re: WatchDog Timer Сторожевой таймер в AVR
Мой сторожевой таймер присутствует во всех местах где должна быть активной программа в течении одного цикла это 1ms, обычно от 5_ти мест до 10. макрос подсчитывает количество мест где он установлен, потом счётчик увеличивается реальным кодом который внутри макроса, число которое в переменной и количество мест, вот основной макрос который разбрасывается везде где нужно, написан в AStudio на ASM2
после в распределителе задач сравнение и сброс если числа не совпадут. Опубликовал, может кому интересно будет.
Код: Выделить всё
.macro wdt_inc
.set _WDT_v = _WDT_v + 1
lds AL,M_WDT_v
inc AL
sts M_WDT_v,AL
.endm
- ДядяВован
- Мучитель микросхем
- Сообщения: 482
- Зарегистрирован: Вс окт 25, 2020 22:13:25
- Откуда: Смоленск
Re: WatchDog Timer Сторожевой таймер в AVR
Возможно для автора вопроса моя информация припоздала, но может кому-то окажется полезной.Land писал(а):собственно в прерыании происходит сброс таймера командой wdr и перезапуск его
ИМХО не верно сбрасывать watchdog в его же собственном прерывании. Кмк теряется весь смысл wdt.
В одном из проектов использовал сторожевой таймер в таком режиме (прерывание и последующий сброс), но сброс таймера делал в другом месте, а не в его же собственном обработчике прерывания.
