Attiny watchdog timer
Miroslav Šinko
sinkomiro na gmail.com
Sobota Leden 19 19:34:42 CET 2013
Nie je bug, ze wdt_disable() neobsahuje nulovanie bitu v MCUSR. Toto
nulovanie je potrebne len raz po resete, ked bol reset vyvolany
watchdogom. OK, po resete je najjednoduchsie znulovat cely MCUSR.
Ak je potom pocas behu programu potrebne zakazat watchdog, staci
wdt_disable vo verzii, aka je. Rozsirenie o dalsie instrukcie zbytocne
kradne kapacitu programovej pamati a strojovy cas.
Vo wdt.h je v uvodnom komentari uvedeny aj doporuceny kod na zakazanie
WDT po resete (ktory priamo vyvracia teoriu o bugu :-) ):
uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
void get_mcusr(void) \
__attribute__((naked)) \
__attribute__((section(".init3")));
void get_mcusr(void)
{
mcusr_mirror = MCUSR;
MCUSR = 0;
wdt_disable();
}
Aj to pisu, ze premenna mcusr_mirror je potrebna, len ak chceme neskor
vysetrovat povodny stav MCUSR.
miro
On 19. 1. 2013 19:15, Miroslav Mraz wrote:
> 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