P89LV51RB2_RC2_RD2_5 © NXP B.V. 2009. All rights reserved.
Product data sheet Rev. 05 — 15 December 2009 54 of 76
NXP Semiconductors
P89LV51RB2/RC2/RD2
8-bit microcontrollers with 80C51 core
module’s CCAPnL SFR the output will be LOW, when it is equal to or greater than, the
output will be HIGH. When CL overflows from FF to 00, CCAPnL is reloaded with the
value in CCAPnH. This allows updating the PWM without glitches. The PWMn and
ECOMn bits in the module’s CCAPMn register must be set to enable the PWM mode.
6.9.5 PCA watchdog timer
An on-board watchdog timer is available with the PCA to improve the reliability of the
system without increasing chip count. Watchdog timers are useful for systems that are
susceptible to noise, power glitches, or electrostatic discharge. Module 4 is the only PCA
module that can be programmed as a Watchdog. However, this module can still be used
for other modes if the Watchdog is not needed. Figure 25 shows a diagram of how the
Watchdog works. The user pre-loads a 16-bit value in the compare registers. Just like the
other compare modes, this 16-bit value is compared to the PCA timer value. If a match is
allowed to occur, an internal reset will be generated. This will not cause the RST pin to be
driven HIGH.
User’s software then must periodically change (CCAP4H, CCAP4L) to keep a match from
occurring with the PCA timer (CH, CL). This code is given in the WATCHDOG routine
shown below.
In order to hold off the reset, the user has three options:
• Periodically change the compare value so it will never match the PCA timer.
• Periodically change the PCA timer value so it will never match the compare values.
• Disable the Watchdog by clearing the WDTE bit before a match occurs and then
re-enable it.
The first two options are more reliable because the watchdog timer is never disabled as in
option #3. If the program counter ever goes astray, a match will eventually occur and
cause an internal reset. The second option is also not recommended if other PCA
modules are being used. Remember, the PCA timer is the time base for all modules;
changing the time base for other modules would not be a good idea. Thus, in most
applications the first solution is the best option.
;CALL the following WATCHDOG subroutine periodically.
CLR EA ;Hold off interrupts
MOV CCAP4L,#00 ;Next compare value is within 255 counts of
current PCA timer value
MOV CCAP4H,CH
SETB EA ;Re-enable interrupts
RET
This routine should not be part of an interrupt service routine, because if the program
counter goes astray and gets stuck in an infinite loop, interrupts are still serviced and the
Watchdog continues to reset. Thus, the purpose of the Watchdog would be defeated.
Instead, call this subroutine from the main program within 2
16
count of the PCA timer.