View previous topic :: View next topic |
Author |
Message |
alpchen
Joined: 11 Jun 2009 Posts: 3
|
Setup_wdt() with WDT_18MS, WDT_ON, WDT_DIV_16 |
Posted: Thu Jun 11, 2009 2:43 pm |
|
|
Hi,
16f688.h says:
Code: |
#define WDT_18MS 8
#define WDT_36MS 9
#define WDT_72MS 10
#define WDT_144MS 11
#define WDT_288MS 12
#define WDT_576MS 13
#define WDT_1152MS 14
#define WDT_2304MS 15
// One of the following may be OR'ed in with the above:
#define WDT_ON 0x4100
#define WDT_OFF 0
#define WDT_DIV_16 0x100
#define WDT_DIV_8 0x300
#define WDT_DIV_4 0x500
#define WDT_DIV_2 0x700
#define WDT_TIMES_1 0x900 // Default
#define WDT_TIMES_2 0xB00
#define WDT_TIMES_4 0xD00
#define WDT_TIMES_8 0xF00
#define WDT_TIMES_16 0x1100
#define WDT_TIMES_32 0x1300
#define WDT_TIMES_64 0x1500
#define WDT_TIMES_128 0x1700 |
but what if I want to turn the watchdog on, set prescaler to DIV_16 and set the duration to WDT_18MS?
can I do
Quote: | SETUP_WDT(WDT_18MS | WDT_ON | WDT_DIV_16);
|
or can I set the prescaler first, than other later, like
Code: |
SETUP_WDT(WDT_DIV_16);
SETUP_WDT(WDT_18MS | WDT_ON);
|
thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 11, 2009 3:00 pm |
|
|
Quote: | Can I set the prescaler first, than other later, like
SETUP_WDT(WDT_DIV_16);
SETUP_WDT(WDT_18MS | WDT_ON); |
The functions are not additive. The latest call to the function determines
the settings of the module. The settings of any previous calls are
over-written. So, just call it one time. |
|
|
alpchen
Joined: 11 Jun 2009 Posts: 3
|
|
Posted: Thu Jun 11, 2009 3:04 pm |
|
|
thanks.
but it's not clear if I can do this
SETUP_WDT(WDT_18MS | WDT_ON | WDT_DIV_16);
it looks like WDT_ON might conflict with WDT_DIV_16. And the header says "ONE of the following" |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 11, 2009 5:23 pm |
|
|
Post what you want to do.
There are two prescalers for the Watchdog Timer. There is a
16-bit prescaler with divisors from 1/32 to 1/65536, and there is
an additional prescaler with divisors from 1/1 to 1/128.
What is the final WDT timeout period that you want to get ? |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Jun 11, 2009 11:17 pm |
|
|
As pointed out by Ttelmah in this previous thread http://www.ccsinfo.com/forum/viewtopic.php?t=38826 CCS C is hiding the actual WDT hardware configuration. This is also the case with 16F688. Instead of possibly fruitless experiments, you may want to set the WDT SFR explicitely in your code. |
|
|
alpchen
Joined: 11 Jun 2009 Posts: 3
|
|
Posted: Fri Jun 12, 2009 12:37 am |
|
|
thanks.
I want to turn watchdog on and set the period to as short as possible (1ms) to reset the chip with reset reason == watchdog reset
but you are right, maybe it's easier just to write to registers myself. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 12, 2009 12:53 am |
|
|
Quote: | I want to turn watchdog on and set the period to as short as possible (1ms) |
This code should do it:
Code: | .................... setup_wdt(WDT_18MS | WDT_ON | WDT_DIV_16);
0010: MOVLW 01
0011: MOVWF WDTCON // WDTCON = 0x01
0012: BSF STATUS.RP0
0013: MOVF OPTION_REG,W
0014: ANDLW F0 // Lower 4 bits of OPTION_REG = 0
0015: MOVWF OPTION_REG
0016: CLRWDT |
Setting WDTCON to 0x01, turns on the WDT and sets the main prescaler
to 1/32. Setting the lower 4 bits of OPTION_REG to 0 will assign the
2nd prescaler to Timer0 (and not the WDT). So the only divisor is 1/32.
The WDT clock rate then becomes:
Code: | 31000 / 32 = 969 Hz |
which gives approximately a 1.0 ms WDT period. |
|
|
|