93#define wdt_reset() __asm__ __volatile__ ("wdr")
97#include <bits/attribs.h>
100# define _WD_PS3_MASK _BV(WDP3)
102# define _WD_PS3_MASK 0x00
106# define _WD_CONTROL_REG WDTCSR
108# define _WD_CONTROL_REG WDTCR
110# define _WD_CONTROL_REG WDT
114#define _WD_CHANGE_BIT WDTOE
116#define _WD_CHANGE_BIT WDCE
131#define wdt_enable(timeout)
135#if defined(__AVR_XMEGA__)
137#if defined (WDT_CTRLA) && !defined(RAMPD)
139#define wdt_enable(timeout) \
141 __asm__ __volatile__ ( \
143 "1: lds __tmp_reg__, %[wdt_status_reg]" "\n\t" \
144 "sbrc __tmp_reg__, %[wdt_syncbusy_bit]" "\n\t" \
146 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
147 "sts %[wdt_reg], %[wdt_enable_timeout]" "\n\t" \
148 "2: lds __tmp_reg__, %[wdt_status_reg]" "\n\t" \
149 "sbrc __tmp_reg__, %[wdt_syncbusy_bit]" "\n\t" \
152 : [ccp_reg] "n" (& CCP), \
153 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
154 [wdt_reg] "n" (& WDT_CTRLA), \
155 [wdt_enable_timeout] "r" ((uint8_t)(timeout)), \
156 [wdt_status_reg] "n" (& WDT_STATUS), \
157 [wdt_syncbusy_bit] "I" (WDT_SYNCBUSY_bp) \
161static __ATTR_ALWAYS_INLINE__
164 __asm__ __volatile__ (
166 "1: lds __tmp_reg__, %[wdt_status_reg]" "\n\t"
167 "sbrc __tmp_reg__, %[wdt_syncbusy_bit]" "\n\t"
169 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t"
170 "sts %[wdt_reg], %[wdt_off]"
172 : [ccp_reg]
"n" (& CCP),
173 [ioreg_cen_mask]
"r" ((
uint8_t)CCP_IOREG_gc),
174 [wdt_reg]
"n" (& WDT_CTRLA),
175 [wdt_off]
"r" ((
uint8_t)WDT_PERIOD_OFF_gc),
176 [wdt_status_reg]
"n" (& WDT_STATUS),
177 [wdt_syncbusy_bit]
"I" (WDT_SYNCBUSY_bp)
194#define wdt_enable(timeout) \
197 __asm__ __volatile__ ( \
198 "in __tmp_reg__, %i[rampd]" "\n\t" \
199 "out %i[rampd], __zero_reg__" "\n\t" \
200 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
201 "sts %[wdt_reg], %[wdt_enable_timeout]" "\n\t" \
202 "1:lds %[tmp], %[wdt_status_reg]" "\n\t" \
203 "sbrc %[tmp], %[wdt_syncbusy_bit]" "\n\t" \
205 "out %i[rampd], __tmp_reg__" \
206 : [tmp] "=r" (__temp) \
207 : [rampd] "n" (& RAMPD), \
208 [ccp_reg] "n" (& CCP), \
209 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
210 [wdt_reg] "n" (& WDT_CTRL), \
211 [wdt_enable_timeout] "r" ((uint8_t)(WDT_CEN_bm \
213 | ((timeout + 1) << 2))), \
214 [wdt_status_reg] "n" (& WDT_STATUS), \
215 [wdt_syncbusy_bit] "I" (WDT_SYNCBUSY_bp) \
219static __ATTR_ALWAYS_INLINE__
222 __asm__ __volatile__ (
223 "in __tmp_reg__, %i[rampd]" "\n\t"
224 "out %i[rampd], __zero_reg__" "\n\t"
225 "out %i[ccp_reg], %[ioreg_cen_mask]" "\n\t"
226 "sts %[wdt_reg], %[disable_mask]" "\n\t"
227 "out %i[rampd], __tmp_reg__"
229 : [rampd]
"n" (& RAMPD),
230 [ccp_reg]
"n" (& CCP),
231 [ioreg_cen_mask]
"r" ((
uint8_t)CCP_IOREG_gc),
232 [wdt_reg]
"n" (& WDT_CTRL),
233 [disable_mask]
"r" ((
uint8_t)((~WDT_ENABLE_bm) | WDT_CEN_bm))
239#elif defined(__AVR_TINY__)
241#define wdt_enable(value) \
242 __asm__ __volatile__ ( \
243 "in __tmp_reg__,__SREG__" "\n\t" \
246 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t" \
247 "out %i[WDTREG],%[WDVALUE]" "\n\t" \
248 "out __SREG__,__tmp_reg__" \
250 : [CCPADDRESS] "n" (& CCP), \
251 [SIGNATURE] "r" ((uint8_t)0xD8), \
252 [WDTREG] "n" (& _WD_CONTROL_REG), \
253 [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00) \
254 | _BV(WDE) | (value & 0x07) )) \
257static __ATTR_ALWAYS_INLINE__
261 __asm__ __volatile__ (
262 "in __tmp_reg__,__SREG__" "\n\t"
265 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
266 "in %[TEMP_WD],%i[WDTREG]" "\n\t"
267 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
268 "out %i[WDTREG],%[TEMP_WD]" "\n\t"
269 "out __SREG__,__tmp_reg__"
270 : [TEMP_WD]
"=d" (__temp_wd)
271 : [CCPADDRESS]
"n" (& CCP),
272 [SIGNATURE]
"r" ((
uint8_t)0xD8),
273 [WDTREG]
"n" (& _WD_CONTROL_REG),
274 [WDVALUE]
"n" (1 << WDE)
280static __ATTR_ALWAYS_INLINE__
283 if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
285 __asm__ __volatile__ (
286 "in __tmp_reg__,__SREG__" "\n\t"
289 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
290 "sts %[WDTREG],%[WDVALUE]" "\n\t"
291 "out __SREG__,__tmp_reg__"
293 : [CCPADDRESS]
"n" (& CCP),
294 [SIGNATURE]
"r" ((
uint8_t)0xD8),
295 [WDTREG]
"n" (& _WD_CONTROL_REG),
296 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
297 |
_BV(WDE) | (value & 0x07) ))
300 else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P (_WD_CONTROL_REG))
302 __asm__ __volatile__ (
303 "in __tmp_reg__,__SREG__" "\n\t"
306 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
307 "out %i[WDTREG],%[WDVALUE]" "\n\t"
308 "out __SREG__,__tmp_reg__"
310 : [CCPADDRESS]
"n" (& CCP),
311 [SIGNATURE]
"r" ((
uint8_t)0xD8),
312 [WDTREG]
"n" (& _WD_CONTROL_REG),
313 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
314 |
_BV(WDE) | (value & 0x07) ))
317 else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
319 __asm__ __volatile__ (
320 "in __tmp_reg__,__SREG__" "\n\t"
323 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
324 "sts %[WDTREG],%[WDVALUE]" "\n\t"
325 "out __SREG__,__tmp_reg__"
327 : [CCPADDRESS]
"n" (& CCP),
328 [SIGNATURE]
"r" ((
uint8_t)0xD8),
329 [WDTREG]
"n" (& _WD_CONTROL_REG),
330 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
331 |
_BV(WDE) | (value & 0x07) ))
336 __asm__ __volatile__ (
337 "in __tmp_reg__,__SREG__" "\n\t"
340 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
341 "out %i[WDTREG],%[WDVALUE]" "\n\t"
342 "out __SREG__,__tmp_reg__"
344 : [CCPADDRESS]
"n" (& CCP),
345 [SIGNATURE]
"r" ((
uint8_t)0xD8),
346 [WDTREG]
"n" (& _WD_CONTROL_REG),
347 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
348 |
_BV(WDE) | (value & 0x07) ))
353static __ATTR_ALWAYS_INLINE__
356 if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
359 __asm__ __volatile__ (
360 "in __tmp_reg__,__SREG__" "\n\t"
363 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
364 "lds %[TEMP_WD],%[WDTREG]" "\n\t"
365 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
366 "sts %[WDTREG],%[TEMP_WD]" "\n\t"
367 "out __SREG__,__tmp_reg__"
368 : [TEMP_WD]
"=d" (__temp_wd)
369 : [CCPADDRESS]
"n" (& CCP),
370 [SIGNATURE]
"r" ((
uint8_t)0xD8),
371 [WDTREG]
"n" (& _WD_CONTROL_REG),
372 [WDVALUE]
"n" (1 << WDE)
375 else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P(_WD_CONTROL_REG))
378 __asm__ __volatile__ (
379 "in __tmp_reg__,__SREG__" "\n\t"
382 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
383 "in %[TEMP_WD],%i[WDTREG]" "\n\t"
384 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
385 "out %i[WDTREG],%[TEMP_WD]" "\n\t"
386 "out __SREG__,__tmp_reg__"
387 : [TEMP_WD]
"=d" (__temp_wd)
388 : [CCPADDRESS]
"n" (& CCP),
389 [SIGNATURE]
"r" ((
uint8_t)0xD8),
390 [WDTREG]
"n" (& _WD_CONTROL_REG),
391 [WDVALUE]
"n" (1 << WDE)
394 else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
397 __asm__ __volatile__ (
398 "in __tmp_reg__,__SREG__" "\n\t"
401 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
402 "lds %[TEMP_WD],%[WDTREG]" "\n\t"
403 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
404 "sts %[WDTREG],%[TEMP_WD]" "\n\t"
405 "out __SREG__,__tmp_reg__"
406 : [TEMP_WD]
"=d" (__temp_wd)
407 : [CCPADDRESS]
"n" (& CCP),
408 [SIGNATURE]
"r" ((
uint8_t)0xD8),
409 [WDTREG]
"n" (& _WD_CONTROL_REG),
410 [WDVALUE]
"n" (1 << WDE)
416 __asm__ __volatile__ (
417 "in __tmp_reg__,__SREG__" "\n\t"
420 "out %i[CCPADDRESS],%[SIGNATURE]" "\n\t"
421 "in %[TEMP_WD],%i[WDTREG]" "\n\t"
422 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
423 "out %i[WDTREG],%[TEMP_WD]" "\n\t"
424 "out __SREG__,__tmp_reg__"
425 : [TEMP_WD]
"=d" (__temp_wd)
426 : [CCPADDRESS]
"n" (& CCP),
427 [SIGNATURE]
"r" ((
uint8_t)0xD8),
428 [WDTREG]
"n" (& _WD_CONTROL_REG),
429 [WDVALUE]
"n" (1 << WDE)
444static __ATTR_ALWAYS_INLINE__
447 if (_SFR_IO_REG_P (_WD_CONTROL_REG))
449 __asm__ __volatile__ (
450 "in __tmp_reg__,__SREG__" "\n\t"
454 "out __SREG__,__tmp_reg__" "\n\t"
457 :
"n" (& _WD_CONTROL_REG),
459 "r" ((
uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00)
460 |
_BV(WDE) | (value & 0x07)) )
465 __asm__ __volatile__ (
466 "in __tmp_reg__,__SREG__" "\n\t"
470 "out __SREG__,__tmp_reg__" "\n\t"
473 :
"n" (& _WD_CONTROL_REG),
475 "r" ((
uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00)
476 |
_BV(WDE) | (value & 0x07)) )
484static __ATTR_ALWAYS_INLINE__
487 if (_SFR_IO_REG_P (_WD_CONTROL_REG))
490 __asm__ __volatile__ (
491 "in __tmp_reg__,__SREG__" "\n\t"
494 "in %[TEMPREG],%i[WDTREG]" "\n\t"
495 "ori %[TEMPREG],%[WDCE_WDE]" "\n\t"
496 "out %i[WDTREG],%[TEMPREG]" "\n\t"
497 "out %i[WDTREG],__zero_reg__" "\n\t"
498 "out __SREG__,__tmp_reg__"
499 : [TEMPREG]
"=d" (__temp_reg)
500 : [WDTREG]
"n" (& _WD_CONTROL_REG),
507 __asm__ __volatile__ (
508 "in __tmp_reg__,__SREG__" "\n\t"
511 "lds %[TEMPREG],%[WDTREG]" "\n\t"
512 "ori %[TEMPREG],%[WDCE_WDE]" "\n\t"
513 "sts %[WDTREG],%[TEMPREG]" "\n\t"
514 "sts %[WDTREG],__zero_reg__" "\n\t"
515 "out __SREG__,__tmp_reg__"
516 : [TEMPREG]
"=d" (__temp_reg)
517 : [WDTREG]
"n" (& _WD_CONTROL_REG),
547#if defined(__DOXYGEN__) || defined(__AVR_XMEGA__)
584#if defined(__DOXYGEN__) || defined(WDP3) || defined(__AVR_XMEGA__)
640#if defined(WDT_CTRLA) && !defined(RAMPD)
651#define WDTO_8MS WDT_PERIOD_8CLK_gc
653#define WDTO_15MS WDT_PERIOD_16CLK_gc
655#define WDTO_30MS WDT_PERIOD_32CLK_gc
657#define WDTO_60MS WDT_PERIOD_64CLK_gc
659#define WDTO_120MS WDT_PERIOD_128CLK_gc
661#define WDTO_250MS WDT_PERIOD_256CLK_gc
663#define WDTO_500MS WDT_PERIOD_512CLK_gc
665#define WDTO_1S WDT_PERIOD_1KCLK_gc
667#define WDTO_2S WDT_PERIOD_2KCLK_gc
669#define WDTO_4S WDT_PERIOD_4KCLK_gc
671#define WDTO_8S WDT_PERIOD_8KCLK_gc
#define _BV(bit)
Definition: sfr_defs.h:206
unsigned char uint8_t
Definition: stdint.h:88
static void wdt_disable(void)
Definition: wdt.h:485
#define wdt_enable(timeout)
Definition: wdt.h:131