![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
adnan jafar
Joined: 26 Sep 2014 Posts: 11
|
Sleep Mode in PIC16F877 |
Posted: Fri Sep 26, 2014 7:10 am |
|
|
Hello everyone!
I have written subroutine for putting the PIC16F877 into sleep and the wake. I have few confusions in this program. Kindly help me
I have implemented the sleep mode in PIC16F877 can anyone tell me that how can i enable/Disable the watch dog timer in software. I have added comments where i require little help of you.
Code: |
void plzsleep()
{
//output_high(penll);
//delay_ms(100);
//output_low(penll);
//output_low(penll);
//delay_ms(50);
//output_low(penll);
disable_interrupts(INT_TIMER0);
setup_wdt(wdt_ON); ///////////// kindly tell me that what is the equivalent statement for PIC16F877 for watch dog timer enable because i want to enable the watch dog timer at programming level not with fuse bits
//setup_wdt(WDT_ON);
//delay_ms(100);
while(i<1)
{
//output_low(penll);
//output_high(penll);
output_A(0x00);
output_B(0x00);
output_C(0x00);
output_D(0x00);
output_E(0x00);
delay_ms(100);
//delay_ms(1000);
//restart_wdt();
sleep();
restart_wdt();
//sleep();
//output_e(0x00);
//output_low(penll);
i++;
}
setup_wdt(WDT_OFF);//////////// Also tell me that what will be equivalent statement for disable the Watch dog timer in PIC16F877 because i want to disable the watch dog timer in programming level not with fuse bits.
//i=0;
output_low(penll);
count=0;
enable_interrupts(INT_TIMER0);
enable_interrupts(Global);
//count=800;
//output_high(penll);
} |
|
|
![](templates/subSilver/images/spacer.gif) |
drh
Joined: 12 Jul 2004 Posts: 192 Location: Hemet, California USA
|
|
Posted: Fri Sep 26, 2014 7:48 am |
|
|
Section 14.5 of the data sheet
REGISTER 14-3: WDTCON: WATCHDOG TIMER CONTROL REGISTER
U-0 U-0 U-0 R/W-0 R/W-1 R/W-0 R/W-0 R/W-0
— — — WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN(1)
bit 7 bit 0
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
bit 7-5 Unimplemented: Read as ‘0’
bit 4-1 WDTPS<3:0>: Watchdog Timer Period Select bits
Bit Value = Prescale Rate
0000 = 1:32
0001 = 1:64
0010 = 1:128
0011 = 1:256
0100 = 1:512 (Reset value)
0101 = 1:1024
0110 = 1:2048
0111 = 1:4096
1000 = 1:8192
1001 = 1:16384
1010 = 1:32768
1011 = 1:65536
1100 = reserved
1101 = reserved
1110 = reserved
1111 = reserved
bit 0 SWDTEN: Software Enable or Disable the Watchdog Timer(1)
1 = WDT is turned on
0 = WDT is turned off (Reset value)
Note 1: If WDTE Configuration bit = 1, then WDT is always enabled, irrespective of this control bit. If WDTE
Configuration bit = 0, then it is possible to turn WDT on/off with this control bit.
Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Value on
POR, BOR
Value on
all other
Resets
CONFIG1(1) CPD CP MCLRE PWRTE WDTE FOSC2 FOSC1 FOSC0 — —
OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
WDTCON — — — WDTPS3 WDTPS2 WSTPS1 WDTPS0 SWDTEN ---0 1000 ---0 1000
Legend: Shaded cells are not used by the Watchdog Timer.
Note 1: See Register 14-1 for operation of all Configuration Word Register 1 bits. _________________ David |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Fri Sep 26, 2014 9:20 am |
|
|
drh wrote: | Section 14.5 of the data sheet | @drh: You didn't mention for which PIC this datasheet is, but it isn't the PIC16F877. Seems to me like the PIC16F887.
@adnan: The PIC16F877 is an older type of PIC which doesn't have the hardware feature to switch the watchdog on/off from software.
So, short answer, it is impossible to do what you want to do with this PIC. |
|
![](templates/subSilver/images/spacer.gif) |
kx9
Joined: 05 Nov 2013 Posts: 3 Location: portland OR
|
|
Posted: Fri Sep 26, 2014 12:25 pm |
|
|
I went and read the data sheet.
The 16F877 and 16F877A does state this PIC has a watchdog timer.
Always go back to the data sheet, it is your friend.
Yes, this pic is going/is obsolete. |
|
![](templates/subSilver/images/spacer.gif) |
drh
Joined: 12 Jul 2004 Posts: 192 Location: Hemet, California USA
|
|
Posted: Fri Sep 26, 2014 12:36 pm |
|
|
ckielstra wrote: | drh wrote: | Section 14.5 of the data sheet | @drh: You didn't mention for which PIC this datasheet is, but it isn't the PIC16F877. Seems to me like the PIC16F887.
@adnan: The PIC16F877 is an older type of PIC which doesn't have the hardware feature to switch the watchdog on/off from software.
So, short answer, it is impossible to do what you want to do with this PIC. |
Right you are. Must be getting old, bad eyesight, too early in the morning, or "something else".
Time for the OP to upgrade to the 887. _________________ David |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19382
|
|
Posted: Fri Sep 26, 2014 2:15 pm |
|
|
You can though if you must 'simulate' a disable.
Just have a tick interrupt that runs slightly faster than your watchdog period, then code as:
Code: |
int1 Wdog_On=FALSE;
#INT_TIMERx //whatever timer you use
void tick(void)
{
if (Wdog_On==FALSE)
restart_wdt();
}
|
When you want to enable the watchdog, set Wdog_On=TRUE, while to disable it set Wdog_On=FALSE.
When Wdog_On is FALSE, the watchdog will never trigger, since the tick keeps it reset. |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Sep 27, 2014 3:21 pm |
|
|
Ttelmah wrote: | You can though if you must 'simulate' a disable. | Nice trick, but:
- Ttelmah's workaround is just that; it introduces extra complexity and requires an extra Timer resource.
- The PIC16F877 is old and not recommended for new designs. Sales price is around $7. The replacement PIC16F887 has the software watchdog enable and other features and is with $2.45 a lot cheaper.
- Rethink if the project really needs a watchdog, only about 1% of the projects on this forum require a watchdog. Is this such a project? In my experience I see the value of a watchdog being overrated. The way it is often implemented it doesn't solve the actual problem and either the watchdog is being triggered too often which misses the whole point, or a crucial trigger is forgotten somewhere and causes an unwanted reset. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19382
|
|
Posted: Sun Sep 28, 2014 12:46 am |
|
|
Lets take a step back here.
He is not using a watchdog!.....
He is talking about using the watchdog timer, as a way of waking the chip from sleep.
This is a critical 'distinction'.
Actually using a watchdog, for it's primary purpose, is much more complex, than most people think. If (for instance), you scatter 'restart_wdt' calls through the code, you might as well not be using the watchdog at all....
The key point is that the only places where the restart should be reached, are carefully trapped locations in the code, setup, so they are _only_ reached, when everything _is_ working correctly. This is the key point Ckielstra is making....
There are lots of other caveats as well. Any use of the watchdog timer (either for waking, or as a genuine watchdog), needs to be 'aware' of just how inaccurate this is on these older chips. The nominal '18mSec' watchdog, has a tolerance, of something like 7mSec to 21+mSec....
I agree about being much better to use a more modern chip. Generally these are cheaper, in many cases have much more accurate timers, and will usually offer the ability to enable/disable in software.
Now, the 'workaround', is generally acceptable, for the 'sleep' application, since in most code, I'd expect there to be at least one timer already in use. Does anyone program without at least one 'tick' timer running!.... In fact the posted code, has a timer interrupt running, right at the point where he wants to disable the watchdog.
If he 'must' use this chip, it is a way to 'solve' the requirement. Not a good way, but a useable solution to the problem as originally posed. Especially since for the 'sleep' type application, I'd expect the watchdog timeout to be set to quite a high value.
Whatever solution he uses here, I'd suggest searching to forum, for threads about power consumption during sleep. Unless the hardware is carefully setup, the consumption of other things on the board may be many times that of the PIC. |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|