Подпаял резистор, конденсатор ненашел. Все равно ресетится, но уже со значением MCUCSR=0x01, то есть бит, означающий что на ресет подан низкий уровень равен нулю.
Вопрос: значит, ресет от помех все-таки был, сейчас помеха (0 на ресете) не вылазит - мне искать конденсатор? Проблема то вроде устранена.
ПРо ватчдог я соврал - сейчас проверяю включен он или выключен.
Так, если я правильно понял:
Цитата
Для того, чтобы включить сторожевой таймер, достаточно установить в 1 бит WDE -Watch Dog Enable.
А вот выключить так просто не получится - и сделано это для защиты от тех же сбоев... Для выключения надо проделать следующие действия:
Записать одновременно в WDE и WDTOE значения "1"
В течение 4-х тактов процессора записать "0" в WDE.
ТО выключить сторожевой таймер если он включен нужно так:
WDTCR=0x18;
WDTCR=0x10;
Делаю это. Происходит ресет со значением WDTCR=0, MCUCSR=1; То же и без принудительного выключения. Кстати, почему вы решили что он включен - по умолчанию он ведь выключен.
Что за бред....
BOD - если вы имеете ввиду фьюзы, то у меня BODEN=1.
Далее.....
Последовал совету:
Цитата
Следовательно, если в программе нужно определять режим сброса - то после анализа этих бит их просто нужно установить в "0". Тогда сброс по сторожевому таймеру можно будет определить по отсутствию "1" в вышеописанных битах.
Сделал так:
Код
void main(void)
{
//WDTCR=0x18;
//WDTCR=0x10;
lcd_init();
backcolor=black;
textcolor=yellow;
lcd_clr();
fill_screen(black);
lcd_setxy(20,20);
lcd_str_fl("MCUCSR=",f8x14, textcolor);
lcd_str_ram(MCUCSR,f8x14, textcolor);
lcd_setxy(20,40);
lcd_str_fl("WDTCR=",f8x14, textcolor);
lcd_str_ram(WDTCR,f8x14, textcolor);
MCUCSR=0x00;
delay_ms(3000);
INT_ON; это включение прерывания, установлено черех #define
}
В итоге на экран выводится
WDTCR=0,
MCUCSR=0;
Получается что сброс по сторожевому таймеру?
Убираю комментарии со строк WDTCR=0x18; WDTCR=0x10; (опять таки, если я правильно понял как отключить сторожа) - тот же эффект.