Search

2014年7月8日 星期二

Arduino WDT ISR

  用AVR C Library有wdt_enable & wdt_disable這兩個Function,他們會用cli清除中斷Flag,所以timer0會被影響因此delay在註冊的WDT ISR會失效只要記得在裡面用sei即可,WDTCSR暫存器除了Set WDE Flag外也要Set WDIE Flag才會在Intterup時進行中斷Jmp到註冊的ISR,若只有Set WDE intterup時會直接Reset,Reference Page54~56 & Table 10-1

wdt_enable:

#define wdt_enable (value)
__asm__ __volatile__ (  \
        "in __tmp_reg__,__SREG__" "\n\t"    \
        "cli" "\n\t"    \
        "wdr" "\n\t"    \
        "out %0,%1" "\n\t"  \
        "out __SREG__,__tmp_reg__" "\n\t"   \
        "out %0,%2" \
        : /* no outputs */  \
        : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
        "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)),   \
        "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
            _BV(WDE) | (value & 0x07)) ) \
        : "r0"  \
    )

wdt_disable:


#define wdt_disable ()
__asm__ __volatile__ (  \
    "in __tmp_reg__, __SREG__" "\n\t" \
     "cli" "\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))) \
    : "r0" \
)

wdt_reset:

#define wdt_reset ()  __asm__ __volatile__ ("wdr")


沒有留言:

張貼留言