97#define wdt_reset() __asm__ __volatile__ ("wdr")
101#include <bits/attribs.h>
104# define _WD_PS3_MASK _BV(WDP3)
106# define _WD_PS3_MASK 0x00
110# define _WD_CONTROL_REG WDTCSR
112# define _WD_CONTROL_REG WDTCR
114# define _WD_CONTROL_REG WDT
118#define _WD_CHANGE_BIT WDTOE
120#define _WD_CHANGE_BIT WDCE
136#define wdt_enable(timeout)
140#if defined(__AVR_XMEGA__)
142#if defined (WDT_CTRLA) && !defined(RAMPD)
144#define wdt_enable(timeout) \
147__asm__ __volatile__ ( \
149 "out %[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
150 "lds %[tmp], %[wdt_reg]" "\n\t" \
151 "sbr %[tmp], %[wdt_enable_timeout]" "\n\t" \
152 "sts %[wdt_reg], %[tmp]" "\n\t" \
153 "1:lds %[tmp], %[wdt_status_reg]" "\n\t" \
154 "sbrc %[tmp], %[wdt_syncbusy_bit]" "\n\t" \
156 : [tmp] "=d" (__temp) \
157 : [ccp_reg] "I" (_SFR_IO_ADDR(CCP)), \
158 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
159 [wdt_reg] "n" (_SFR_MEM_ADDR(WDT_CTRLA)), \
160 [wdt_enable_timeout] "M" (timeout), \
161 [wdt_status_reg] "n" (_SFR_MEM_ADDR(WDT_STATUS)), \
162 [wdt_syncbusy_bit] "I" (WDT_SYNCBUSY_bm) \
166#define wdt_disable() \
169__asm__ __volatile__ ( \
171 "out %[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
172 "lds %[tmp], %[wdt_reg]" "\n\t" \
173 "cbr %[tmp], %[timeout_mask]" "\n\t" \
174 "sts %[wdt_reg], %[tmp]" \
175 : [tmp] "=d" (__temp) \
176 : [ccp_reg] "I" (_SFR_IO_ADDR(CCP)), \
177 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
178 [wdt_reg] "n" (_SFR_MEM_ADDR(WDT_CTRLA)),\
179 [timeout_mask] "I" (WDT_PERIOD_gm) \
197#define wdt_enable(timeout) \
200__asm__ __volatile__ ( \
201 "in __tmp_reg__, %[rampd]" "\n\t" \
202 "out %[rampd], __zero_reg__" "\n\t" \
203 "out %[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
204 "sts %[wdt_reg], %[wdt_enable_timeout]" "\n\t" \
205 "1:lds %[tmp], %[wdt_status_reg]" "\n\t" \
206 "sbrc %[tmp], %[wdt_syncbusy_bit]" "\n\t" \
208 "out %[rampd], __tmp_reg__" \
209 : [tmp] "=r" (__temp) \
210 : [rampd] "I" (_SFR_IO_ADDR(RAMPD)), \
211 [ccp_reg] "I" (_SFR_IO_ADDR(CCP)), \
212 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
213 [wdt_reg] "n" (_SFR_MEM_ADDR(WDT_CTRL)), \
214 [wdt_enable_timeout] "r" ((uint8_t)(WDT_CEN_bm | WDT_ENABLE_bm | ((timeout + 1) << 2))), \
215 [wdt_status_reg] "n" (_SFR_MEM_ADDR(WDT_STATUS)), \
216 [wdt_syncbusy_bit] "I" (WDT_SYNCBUSY_bm) \
221#define wdt_disable() \
222__asm__ __volatile__ ( \
223 "in __tmp_reg__, %[rampd]" "\n\t" \
224 "out %[rampd], __zero_reg__" "\n\t" \
225 "out %[ccp_reg], %[ioreg_cen_mask]" "\n\t" \
226 "sts %[wdt_reg], %[disable_mask]" "\n\t" \
227 "out %[rampd], __tmp_reg__" \
229 : [rampd] "I" (_SFR_IO_ADDR(RAMPD)), \
230 [ccp_reg] "I" (_SFR_IO_ADDR(CCP)), \
231 [ioreg_cen_mask] "r" ((uint8_t)CCP_IOREG_gc), \
232 [wdt_reg] "n" (_SFR_MEM_ADDR(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 %[CCPADDRESS],%[SIGNATURE]" "\n\t" \
247 "out %[WDTREG],%[WDVALUE]" "\n\t" \
248 "out __SREG__,__tmp_reg__" \
250 : [CCPADDRESS] "I" (_SFR_IO_ADDR(CCP)), \
251 [SIGNATURE] "r" ((uint8_t)0xD8), \
252 [WDTREG] "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
253 [WDVALUE] "r" ((uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00) \
254 | _BV(WDE) | (value & 0x07) )) \
258#define wdt_disable() \
261__asm__ __volatile__ ( \
262 "in __tmp_reg__,__SREG__" "\n\t" \
265 "out %[CCPADDRESS],%[SIGNATURE]" "\n\t" \
266 "in %[TEMP_WD],%[WDTREG]" "\n\t" \
267 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t" \
268 "out %[WDTREG],%[TEMP_WD]" "\n\t" \
269 "out __SREG__,__tmp_reg__" \
270 : [TEMP_WD] "=d" (__temp_wd) \
271 : [CCPADDRESS] "I" (_SFR_IO_ADDR(CCP)), \
272 [SIGNATURE] "r" ((uint8_t)0xD8), \
273 [WDTREG] "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
274 [WDVALUE] "n" (1 << WDE) \
281static __ATTR_ALWAYS_INLINE__
284 if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
286 __asm__ __volatile__ (
287 "in __tmp_reg__,__SREG__" "\n\t"
290 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
291 "sts %[WDTREG],%[WDVALUE]" "\n\t"
292 "out __SREG__,__tmp_reg__"
294 : [CCPADDRESS]
"n" (_SFR_MEM_ADDR(CCP)),
295 [SIGNATURE]
"r" ((
uint8_t)0xD8),
296 [WDTREG]
"n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
297 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
298 |
_BV(WDE) | (value & 0x07) ))
302 else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P (_WD_CONTROL_REG))
304 __asm__ __volatile__ (
305 "in __tmp_reg__,__SREG__" "\n\t"
308 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
309 "out %[WDTREG],%[WDVALUE]" "\n\t"
310 "out __SREG__,__tmp_reg__"
312 : [CCPADDRESS]
"n" (_SFR_MEM_ADDR(CCP)),
313 [SIGNATURE]
"r" ((
uint8_t)0xD8),
314 [WDTREG]
"I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
315 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
316 |
_BV(WDE) | (value & 0x07) ))
320 else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P (_WD_CONTROL_REG))
322 __asm__ __volatile__ (
323 "in __tmp_reg__,__SREG__" "\n\t"
326 "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
327 "sts %[WDTREG],%[WDVALUE]" "\n\t"
328 "out __SREG__,__tmp_reg__"
330 : [CCPADDRESS]
"I" (_SFR_IO_ADDR(CCP)),
331 [SIGNATURE]
"r" ((
uint8_t)0xD8),
332 [WDTREG]
"n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
333 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
334 |
_BV(WDE) | (value & 0x07) ))
340 __asm__ __volatile__ (
341 "in __tmp_reg__,__SREG__" "\n\t"
344 "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
345 "out %[WDTREG],%[WDVALUE]" "\n\t"
346 "out __SREG__,__tmp_reg__"
348 : [CCPADDRESS]
"I" (_SFR_IO_ADDR(CCP)),
349 [SIGNATURE]
"r" ((
uint8_t)0xD8),
350 [WDTREG]
"I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
351 [WDVALUE]
"r" ((
uint8_t)((value & 0x08 ? _WD_PS3_MASK : 0x00)
352 |
_BV(WDE) | (value & 0x07) ))
358static __ATTR_ALWAYS_INLINE__
359void wdt_disable (
void)
361 if (!_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
364 __asm__ __volatile__ (
365 "in __tmp_reg__,__SREG__" "\n\t"
368 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
369 "lds %[TEMP_WD],%[WDTREG]" "\n\t"
370 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
371 "sts %[WDTREG],%[TEMP_WD]" "\n\t"
372 "out __SREG__,__tmp_reg__"
373 : [TEMP_WD]
"=d" (__temp_wd)
374 : [CCPADDRESS]
"n" (_SFR_MEM_ADDR(CCP)),
375 [SIGNATURE]
"r" ((
uint8_t)0xD8),
376 [WDTREG]
"n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
377 [WDVALUE]
"n" (1 << WDE)
381 else if (!_SFR_IO_REG_P (CCP) && _SFR_IO_REG_P(_WD_CONTROL_REG))
384 __asm__ __volatile__ (
385 "in __tmp_reg__,__SREG__" "\n\t"
388 "sts %[CCPADDRESS],%[SIGNATURE]" "\n\t"
389 "in %[TEMP_WD],%[WDTREG]" "\n\t"
390 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
391 "out %[WDTREG],%[TEMP_WD]" "\n\t"
392 "out __SREG__,__tmp_reg__"
393 : [TEMP_WD]
"=d" (__temp_wd)
394 : [CCPADDRESS]
"n" (_SFR_MEM_ADDR(CCP)),
395 [SIGNATURE]
"r" ((
uint8_t)0xD8),
396 [WDTREG]
"I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
397 [WDVALUE]
"n" (1 << WDE)
401 else if (_SFR_IO_REG_P (CCP) && !_SFR_IO_REG_P(_WD_CONTROL_REG))
404 __asm__ __volatile__ (
405 "in __tmp_reg__,__SREG__" "\n\t"
408 "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
409 "lds %[TEMP_WD],%[WDTREG]" "\n\t"
410 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
411 "sts %[WDTREG],%[TEMP_WD]" "\n\t"
412 "out __SREG__,__tmp_reg__"
413 : [TEMP_WD]
"=d" (__temp_wd)
414 : [CCPADDRESS]
"I" (_SFR_IO_ADDR(CCP)),
415 [SIGNATURE]
"r" ((
uint8_t)0xD8),
416 [WDTREG]
"n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
417 [WDVALUE]
"n" (1 << WDE)
424 __asm__ __volatile__ (
425 "in __tmp_reg__,__SREG__" "\n\t"
428 "out %[CCPADDRESS],%[SIGNATURE]" "\n\t"
429 "in %[TEMP_WD],%[WDTREG]" "\n\t"
430 "cbr %[TEMP_WD],%[WDVALUE]" "\n\t"
431 "out %[WDTREG],%[TEMP_WD]" "\n\t"
432 "out __SREG__,__tmp_reg__"
433 : [TEMP_WD]
"=d" (__temp_wd)
434 : [CCPADDRESS]
"I" (_SFR_IO_ADDR(CCP)),
435 [SIGNATURE]
"r" ((
uint8_t)0xD8),
436 [WDTREG]
"I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
437 [WDVALUE]
"n" (1 << WDE)
445static __ATTR_ALWAYS_INLINE__
448 if (_SFR_IO_REG_P (_WD_CONTROL_REG))
450 __asm__ __volatile__ (
451 "in __tmp_reg__,__SREG__" "\n\t"
455 "out __SREG__,__tmp_reg__" "\n\t"
458 :
"I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
460 "r" ((
uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) |
461 _BV(WDE) | (value & 0x07)) )
467 __asm__ __volatile__ (
468 "in __tmp_reg__,__SREG__" "\n\t"
472 "out __SREG__,__tmp_reg__" "\n\t"
475 :
"n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
477 "r" ((
uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) |
478 _BV(WDE) | (value & 0x07)) )
484static __ATTR_ALWAYS_INLINE__
485void wdt_disable (
void)
487 if (_SFR_IO_REG_P (_WD_CONTROL_REG))
490 __asm__ __volatile__ (
491 "in __tmp_reg__,__SREG__" "\n\t"
494 "in %[TEMPREG],%[WDTREG]" "\n\t"
495 "ori %[TEMPREG],%[WDCE_WDE]" "\n\t"
496 "out %[WDTREG],%[TEMPREG]" "\n\t"
497 "out %[WDTREG],__zero_reg__" "\n\t"
498 "out __SREG__,__tmp_reg__"
499 : [TEMPREG]
"=d" (__temp_reg)
500 : [WDTREG]
"I" (_SFR_IO_ADDR(_WD_CONTROL_REG)),
508 __asm__ __volatile__ (
509 "in __tmp_reg__,__SREG__" "\n\t"
512 "lds %[TEMPREG],%[WDTREG]" "\n\t"
513 "ori %[TEMPREG],%[WDCE_WDE]" "\n\t"
514 "sts %[WDTREG],%[TEMPREG]" "\n\t"
515 "sts %[WDTREG],__zero_reg__" "\n\t"
516 "out __SREG__,__tmp_reg__"
517 : [TEMPREG]
"=d" (__temp_reg)
518 : [WDTREG]
"n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
549#if defined(__DOXYGEN__) || defined(__AVR_XMEGA__)
583#if defined(__DOXYGEN__) || defined(WDP3) || defined(__AVR_XMEGA__)
#define _BV(bit)
Definition: sfr_defs.h:206
unsigned char uint8_t
Definition: stdint.h:81
#define wdt_enable(timeout)
Definition: wdt.h:136