Clear WDRF flag and set WDCE before enabling watchdog

This commit is contained in:
2024-10-01 15:47:31 +02:00
parent 93590f7b75
commit 5a726f5d48
3 changed files with 21 additions and 19 deletions

View File

@@ -50,13 +50,8 @@ DEPENDS := $(FILES:%.c=$(TMPDIR)/%.d)
# AUXILIARY TARGETS (AND FUSE SETTINGS)
# ==============================================================================
# .PHONY: all
# all: flash
.PHONY: run
run: $(TARGET)
$(E) "[SIM] $<"
$(Q) $(SIM) -m $(MCU) -f $(FREQ) $<
.PHONY: all
all: flash
.PHONY: flash
flash: $(TARGET)
@@ -69,6 +64,11 @@ flash: $(TARGET)
-U lock:w:0xFF:m \
-U flash:w:$<
.PHONY: run
run: $(TARGET)
$(E) "[SIM] $<"
$(Q) $(SIM) -m $(MCU) -f $(FREQ) $<
.PHONY: clean
clean:
$(E) "[REM] $(TARGET)"

View File

@@ -36,8 +36,17 @@ void WDT_Enable(void)
// set. Once written to one, hardware will clear
// WDCE after four clock cycles.
// 00001111: Watchdog enabled, 2sec timeout
WDTCSR = BIT(WDE) | BIT(WDP2) | BIT(WDP1) | BIT(WDP0);
// Setting WDCE before enabling the watchdog should
// not be necessary according to the data sheet but
// it does not seem to work otherwise.
// Disable interrupts
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
MCUSR &= ~BIT(WDRF);
WDTCSR = BIT(WDCE) | BIT(WDE);
// 00001111: Watchdog enabled, 2sec timeout
WDTCSR = BIT(WDE) | BIT(WDP2) | BIT(WDP1) | BIT(WDP0);
}
}
void WDT_SetTimeoutFlag(byte flag)
@@ -65,13 +74,13 @@ void WDT_SetTimeoutFlag(byte flag)
// Disable interrupts
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
WDT_Reset();
WDTCSR = BIT(WDCE) | BIT(WDE);
// Set new timer prescalar flag
WDTCSR = (WDTCSR & 0xC8) | flag; // C8=11001000
WDTCSR = BIT(WDE) | flag;
}
}
// XXX: COMMENTS UPDATED!
bool WDT_HasTriggered(void)
{
bool isreset;
@@ -109,6 +118,7 @@ void WDT_Disable(void)
// Disable interrupts
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
WDT_Reset();
WDTCSR = BIT(WDCE) | BIT(WDE);
WDTCSR = 0;
}

View File

@@ -57,14 +57,6 @@ static int Init(void)
Info("Initializing...");
// FIXME: Something is wrong here:
// - AVRDUDE sometimes fails to verify flash.
// - UART sometimes stops working.
// - External crystal problems?
// - Power supply problems?
// - Wrong fuses? Unlikely.
// - Bootloader problems?
// The watchdog timer is clocked from a separate
// on-chip oscillator which runs at 1 MHz. Eight
// different clock cycle periods can be selected