ARV 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба сломал голову на, казалось бы, простейшем... задумал в определенные моменты времени сделать программный сброс контроллера attiny13. на WinAVR это выглядит так wdt_enable(WDTO_15MS); while(1); сброс я делаю при определенных условиях из обработчика прерывания INT0, на котором все время присутствует меандр 50 Гц. то есть если что-то там происходит - внутри обработчика выполняется упомянутый код. сброс, само собой, происходит, но после него программа уже не работает, как надо. по всем внешним признакам нет реакции на внешние запросы прерывания. уже голову сломал - ну ведь не должен сброс от WDT отличаться от обычного сброса! а отличается... из положения вышел костылем, отказавшись от такого сброса... но понять проблему все-таки хочется... что скажет коллективный разум? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Выключайте WDT при старте. WDT остается включен после сброса по его таймауту... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба уже голову сломал - ну ведь не должен сброс от WDT отличаться от обычного сброса! а отличается...Насколько я помню беглое прочтение этой части (ну как-то WDT не особо нужен, где-то ставил как таймер) — сброс от WDT отличается от обычного тем, что после него мало что WDT остаётся включенным, так и его нельзя выклчить, пока не очистишь бит WDR в MCUCSR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Цэльный день с ним промучился :smile3046: Получите правильные битики! Проверено на 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(){... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 26 июня, 2010 Опубликовано 26 июня, 2010 · Жалоба Выключайте WDT при старте. WDT остается включен после сброса по его таймауту...спасибо всем :) я уже понял, что читать даташит надо весь до последней запятой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sbw 0 4 октября, 2010 Опубликовано 4 октября, 2010 · Жалоба Насколько я помню беглое прочтение этой части (ну как-то 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 очишается) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться