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