Цитата(max_mart @ Oct 9 2012, 07:58)

Как тогда посоветуете правильно его отключить?
static inline void WDT_off(void)
{
wdt_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR = 0b00011000;
/* Turn off WDT */
WDTCSR = 0x00;
}
Так?
Я делал примерно также, просто в однажды ИАР сгенерил код который перестал укладываться в 4 цикла.
Переделал так:
Код
void WDT_Prescaler_Change(unsigned char new_wdt_period);
int main() {
MCUSR = ~(1<<WDRF);
WDT_Prescaler_Change(6|(1<<WDE));
__watchdog_reset();
Код
WDT_Prescaler_Change:
; Turn off global interrupt
push r17
mov r17, r16
cli
; Reset Watchdog Timer
wdr
; Start timed sequence
lds r16, 0x60
ori r16, 0x18
sts 0x60, r16
; -- Got four cycles to set the new values from here -
; Set new prescaler(time-out) value = 64K cycles (~0.5 s)
sts 0x60, r17
; -- Finished setting new values, used 2 cycles -
; Turn on global interrupt
pop r17
ret
Цитата(max_mart @ Oct 9 2012, 07:58)

И еще момент:
после сброса, я флаги все обнуляю и выключаю вотчдог. Но если мне он опять нужен , то перед включением я должен бит WDRF выставить в 1?
Либо он(WDRF) устанавливается автоматически при записи 1 в WDE?
Цитата
This bit is set if a Watchdog System Reset occurs.
Вы не можете установить WDRF - он устанавливается аппаратно. Его нужно просто сбросить на старте записью в него единицы и больше о нём не вспоминать.