Attiny watchdog timer
Miroslav Mraz
mraz na seznam.cz
Sobota Leden 19 19:15:23 CET 2013
Jasně. Chyba byla jako vždy mezi židlí a klávesnicí. Možná by tedy bylo
dobře upravit to makro wdt_disable() přímo v knihovně nějak takto:
#define wdt_disable() \
__asm__ __volatile__ ( \
"in __tmp_reg__, __SREG__" "\n\t" \
"cli" "\n\t" \
"wdr" "\n\t" \
"out %2, __zero_reg__" "\n\t" \
"out %0, %1" "\n\t" \
"out %0, __zero_reg__" "\n\t" \
"out __SREG__,__tmp_reg__" "\n\t" \
: /* no outputs */ \
: "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
"r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), \
"I"(_SFR_IO_ADDR(MCUSR)) \
: "r0" \
)
Tuším, že kolega wek se trochu věnuje údržbě těchto knihoven, nechávám
na úvaze zda udělat bug-report. Je diskutabilní, zda je rozumné cpát do
celého toho MCUSR natvrdo nulu. Nicméně to takhle funguje.
Mrazík
Miroslav Šinko píše v So 19. 01. 2013 v 16:09 +0100:
> wdt_disable() na zaciatku nestaci a je to popisane v datasheete pri
> popise registra WDTCR – Watchdog Timer Control Register, konkretne Bit 3
> – WDE: Watchdog Enable. Vyssie je aj vzorovy kod.
>
> Ked nastane reset od watchdogu, nastavi sa bit MCUSR.WDRF. Ten musite
> najprv znulovat, az potom volat wdt_disable(), inac watchdog nezakazete.
>
> miro
>
Další informace o konferenci Hw-list