реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> attiny13 WDT и странная проблема, после сброса по WDT программа не работает
ARV
сообщение Jun 25 2010, 17:32
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



сломал голову на, казалось бы, простейшем...
задумал в определенные моменты времени сделать программный сброс контроллера attiny13. на WinAVR это выглядит так
Код
wdt_enable(WDTO_15MS);
while(1);

сброс я делаю при определенных условиях из обработчика прерывания INT0, на котором все время присутствует меандр 50 Гц.
то есть если что-то там происходит - внутри обработчика выполняется упомянутый код. сброс, само собой, происходит, но после него программа уже не работает, как надо. по всем внешним признакам нет реакции на внешние запросы прерывания.

уже голову сломал - ну ведь не должен сброс от WDT отличаться от обычного сброса! а отличается...

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jun 25 2010, 18:57
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Выключайте WDT при старте. WDT остается включен после сброса по его таймауту...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 25 2010, 18:57
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(ARV @ Jun 25 2010, 20:32) *
уже голову сломал - ну ведь не должен сброс от WDT отличаться от обычного сброса! а отличается...
Насколько я помню беглое прочтение этой части (ну как-то WDT не особо нужен, где-то ставил как таймер) — сброс от WDT отличается от обычного тем, что после него мало что WDT остаётся включенным, так и его нельзя выклчить, пока не очистишь бит WDR в MCUCSR.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jun 25 2010, 19:49
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цэльный день с ним промучился smile3046.gif

Получите правильные битики! Проверено на tiny13 и tiny13a.
Код
//фключить WDT для сброса контроллера
full_out:    //полный сброс контроллера
    wdr //asm
    cli   //asm
    WDTCR=((0<<WDTIE)|(0<<WDP3)|(1<<WDCE)|(1<<WDE)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)) //16ms
    sleep    //asm
    rjmp    $//asm


Код
reset_vect:
//отключить WDT фкдюченный для сброса!
    wdr  //asm
    MCUSR=0
    WDTCR=((0<<WDTIE)|(0<<WDP3)|(1<<WDCE)|(1<<WDE)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)) //16ms
    WDTCR=((0<<WDTIE)|(0<<WDP3)|(0<<WDCE)|(0<<WDE)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)) //16ms

    main(){...
Go to the top of the page
 
+Quote Post
ARV
сообщение Jun 26 2010, 18:03
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(SysRq @ Jun 25 2010, 22:57) *
Выключайте WDT при старте. WDT остается включен после сброса по его таймауту...
спасибо всем smile.gif я уже понял, что читать даташит надо весь до последней запятой.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
sbw
сообщение Oct 4 2010, 11:05
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 5-10-07
Из: Харьков, Украина
Пользователь №: 31 107



Цитата(ReAl @ Jun 25 2010, 21:57) *
Насколько я помню беглое прочтение этой части (ну как-то WDT не особо нужен, где-то ставил как таймер) — сброс от WDT отличается от обычного тем, что после него мало что WDT остаётся включенным, так и его нельзя выклчить, пока не очистишь бит WDR в MCUCSR.


Спасибо за эту мысль! Провозился больше дня... Да, в доке это есть, но в виде примечания под примером, мимо которого я все время проходил (а просто тупо повторить пример, не понимая, что делаю, гордость не позволяла):

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.

то есть, если флаг не сброшен - вачдог не отключишь. Неочевидная фигня.

У меня эта ситуация возникла от того, что зашиваю проц одной прошивкой, в которой возникает событие "переполнение таймера вачдога и сброс по нему", а потом следом за ней - без передергивания питания - другой прошивкой, в которой вачдог перед sleep отключается. И в момент отключения вачдога (стандартная winavr-ная библиотечная процедура) генерится ресет... А если питание передернуть - этого не происходит (WDRF очишается)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 23:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016