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