Reply by B1ackwater July 4, 20082008-07-04
On Fri, 27 Jun 2008 00:32:48 -0400, Neil <NeilKurzm@worldnet.att.net>
wrote:

>John B wrote: >> On 25/06/2008 B1ackwater wrote: >> >>> On 25 Jun 2008 11:02:23 GMT, "John B" >>> <spamj_baraclough@blockerzetnet.co.uk> wrote: >>> >>>> You need to decide whether you want the WDT or the interrupt to >>>> wake up the processor. If it's the latter, then you must turn off >>>> the WDT before putting the processor to sleep. >>> Actually, I need BOTH to wake up the processor. The >>> "normal" mode is a wakeup interrupt from one of several >>> possible external devices saying "I've got something >>> for you !". >>> >>> However I'd ALSO like the WDT to kick in every so often >>> just in case the processor got hung-up and can't hear the >>> external requests anymore. "Wastes" a tiny speck of power >>> every few minutes, but ensures the device is always working >>> (these are going out "in the field" ... WAY out). >>> >>> A couple of good docuphiles pointed out ANOTHER section >>> that affected my interpretation of events ... that it's >>> only an INTERRUPT during sleep that can cause a jump to >>> the ISR if GIE is set. A WDT timeout during sleep just >>> resumes the code, regardless of GIE, and a WDT timeout >>> during normal running (or a hang-up) resets the processor >>> as if the power had been cycled. >>> >>> So, I've gotta write code to deal with each possible >>> scenerio ... POR/WDT, SLEEP+GIE & SLEEP+WDT. What fun ... :-) >> >> Hmmm, sounds pretty chaotic. I think I'll stick with my tried and >> tested AVRs thanks. >> >No it make perfect sense if you are asleep and an interrupt happens you >expect to goto an interrupt. If the watchdog is used to wake from sleep >it would require it own flag so you could tell which interrupt happened.
Followup : Although the WDT does indeed set its own flag so you can tell if that's why the CPU restarted, I didn't actually need to use it. Just set up my initiallization code so it didn't care whether it was a WDT or a power-on reset ... a restart was a restart regardless. This was easier than using a seperate re-init routine JUST for WDT resets. My app is working just fine now ... waits for an external interrupt to wake it up and, if the wait is long enough, the WDT periodically reboots the thing so it will never become 'stuck' (for long) - whereupon it just goes back to sleep again almost immediately. Power is conserved and the app remains robust ... who could ask for more ?
Reply by Neil June 27, 20082008-06-27
John B wrote:
> On 25/06/2008 B1ackwater wrote: > >> On 25 Jun 2008 11:02:23 GMT, "John B" >> <spamj_baraclough@blockerzetnet.co.uk> wrote: >> >>> You need to decide whether you want the WDT or the interrupt to >>> wake up the processor. If it's the latter, then you must turn off >>> the WDT before putting the processor to sleep. >> Actually, I need BOTH to wake up the processor. The >> "normal" mode is a wakeup interrupt from one of several >> possible external devices saying "I've got something >> for you !". >> >> However I'd ALSO like the WDT to kick in every so often >> just in case the processor got hung-up and can't hear the >> external requests anymore. "Wastes" a tiny speck of power >> every few minutes, but ensures the device is always working >> (these are going out "in the field" ... WAY out). >> >> A couple of good docuphiles pointed out ANOTHER section >> that affected my interpretation of events ... that it's >> only an INTERRUPT during sleep that can cause a jump to >> the ISR if GIE is set. A WDT timeout during sleep just >> resumes the code, regardless of GIE, and a WDT timeout >> during normal running (or a hang-up) resets the processor >> as if the power had been cycled. >> >> So, I've gotta write code to deal with each possible >> scenerio ... POR/WDT, SLEEP+GIE & SLEEP+WDT. What fun ... :-) > > Hmmm, sounds pretty chaotic. I think I'll stick with my tried and > tested AVRs thanks. >
No it make perfect sense if you are asleep and an interrupt happens you expect to goto an interrupt. If the watchdog is used to wake from sleep it would require it own flag so you could tell which interrupt happened.
Reply by John B June 25, 20082008-06-25
On 25/06/2008 B1ackwater wrote:

> On 25 Jun 2008 11:02:23 GMT, "John B" > <spamj_baraclough@blockerzetnet.co.uk> wrote: > > > You need to decide whether you want the WDT or the interrupt to > > wake up the processor. If it's the latter, then you must turn off > > the WDT before putting the processor to sleep. > > Actually, I need BOTH to wake up the processor. The > "normal" mode is a wakeup interrupt from one of several > possible external devices saying "I've got something > for you !". > > However I'd ALSO like the WDT to kick in every so often > just in case the processor got hung-up and can't hear the > external requests anymore. "Wastes" a tiny speck of power > every few minutes, but ensures the device is always working > (these are going out "in the field" ... WAY out). > > A couple of good docuphiles pointed out ANOTHER section > that affected my interpretation of events ... that it's > only an INTERRUPT during sleep that can cause a jump to > the ISR if GIE is set. A WDT timeout during sleep just > resumes the code, regardless of GIE, and a WDT timeout > during normal running (or a hang-up) resets the processor > as if the power had been cycled. > > So, I've gotta write code to deal with each possible > scenerio ... POR/WDT, SLEEP+GIE & SLEEP+WDT. What fun ... :-)
Hmmm, sounds pretty chaotic. I think I'll stick with my tried and tested AVRs thanks. -- John B
Reply by June 25, 20082008-06-25
On Jun 25, 9:27 am, b...@barrk.net (B1ackwater) wrote:

> A WDT exit from SLEEP resumes from where you left off > while a WDT trigger during normal running (or a hang) > causes a device reset. > > Another case of where the info you need is scattered in > several places across 350+ pages of small print.
That's one of the few areas where a PDF document trumps a paper one: searchability. (Portability/archivability being another. But even with large dual monitors, it's a pain to reference one while trying to code / test)
Reply by B1ackwater June 25, 20082008-06-25
On 25 Jun 2008 11:02:23 GMT, "John B"
<spamj_baraclough@blockerzetnet.co.uk> wrote:

>You need to decide whether you want the WDT or the interrupt to wake up >the processor. If it's the latter, then you must turn off the WDT >before putting the processor to sleep.
Actually, I need BOTH to wake up the processor. The "normal" mode is a wakeup interrupt from one of several possible external devices saying "I've got something for you !". However I'd ALSO like the WDT to kick in every so often just in case the processor got hung-up and can't hear the external requests anymore. "Wastes" a tiny speck of power every few minutes, but ensures the device is always working (these are going out "in the field" ... WAY out). A couple of good docuphiles pointed out ANOTHER section that affected my interpretation of events ... that it's only an INTERRUPT during sleep that can cause a jump to the ISR if GIE is set. A WDT timeout during sleep just resumes the code, regardless of GIE, and a WDT timeout during normal running (or a hang-up) resets the processor as if the power had been cycled. So, I've gotta write code to deal with each possible scenerio ... POR/WDT, SLEEP+GIE & SLEEP+WDT. What fun ... :-)
Reply by B1ackwater June 25, 20082008-06-25
On Wed, 25 Jun 2008 00:11:07 GMT, John Temples <usenet@xargs-spam.com>
wrote:

>On 2008-06-24, B1ackwater <bw@barrk.net> wrote: >> While I've used PICs for many things, I've never made >> use of the SLEEP mode. For my 18f2620, the docs state : >> >> "All external interrupts (INT0, INT1 and INT2) can >> wake-up the processor from SLEEP, if bit INTxE was >> set prior to going into SLEEP. If the global interrupt >> enable bit GIE is set, the processor will branch to >> the interrupt vector following wake-up." > >[...] > >> BUT ... a WDT timeout while sleeping does NOT branch to >> the ISR, but instead just picks up the program exactly >> where it left off, ie executing the code beyond the >> SLEEP instruction. This is OK, convenient even ... >> but not what the docs SAY it will do. > >The WDT does not generate an interrupt, so it will not branch to the >ISR. When it times out, it wakes from sleep if sleeping, or resets >the PIC if running.
After reading some other parts of the manual pointed out by another poster, it's clear that what I had first read applied only to exiting SLEEP because of an external interrupt ... where the state of GIE will decide whether you jump to the ISR or do a device reset. A WDT exit from SLEEP resumes from where you left off while a WDT trigger during normal running (or a hang) causes a device reset. Another case of where the info you need is scattered in several places across 350+ pages of small print. Hmmm ... does MicroChip have a seperate document entitled "About Interrupts" or something, where all the pertinent data and possible register/state interactions are brought together in one place ? As so many people seem to go so wrong with interrupts it would seem a smart thing to do. I'll try to search ...
Reply by B1ackwater June 25, 20082008-06-25
On Tue, 24 Jun 2008 23:20:27 GMT, Pete <pjetson@pobox.com> wrote:

>B1ackwater wrote: > >> "All external interrupts (INT0, INT1 and INT2) can >> wake-up the processor from SLEEP, if bit INTxE was >> set prior to going into SLEEP. If the global interrupt >> enable bit GIE is set, the processor will branch to >> the interrupt vector following wake-up." > >> BUT ... a WDT timeout while sleeping does NOT branch to >> the ISR, but instead just picks up the program exactly >> where it left off, ie executing the code beyond the >> SLEEP instruction. This is OK, convenient even ... >> but not what the docs SAY it will do. > >The paragraph that you quoted doesn't seem to mention the WDT. I >downloaded the data sheet and a quick check turned up this: > > > If the device is not executing code (all Idle modes and > > Sleep mode), the time-out will result in an exit from > > the power-managed mode (see Section 3.2 "Run Modes" and > > Section 3.3 "Sleep Mode"). If the device is executing > > code (all Run modes), the time-out will result in a WDT > > Reset (see Section 23.2 "Watchdog Timer (WDT)"). > >That suggests to me that the operation you're observing is what the chip >was designed to do. It's been a very long time since I've written code >for a PIC, but that's also how I remember sleep mode working.
I'll check that section and see (this is what you get with 350+ page documents ... the info you need is scattered all over the place). Apparently it means that if the CPU is righteously hung (or most anything that delays clearing the WDT) then it WILL jump to the ISR on WDT timeout if GIE is set - but if it's sleeping, then it just resumes where it left off regardless of the GIE status. Alas, section 3 says "all run modes" but doesn't mention the effect of GIE ... where you don't get a true "reset" but instead a jump to the ISR. There oughtta be an "also see ..." footnote at least. Anyway, this is fine with me ... except it means I have to write a little extra code to deal with THREE modes of program resumption now ... GIE enabled (->ISR), GIE disabled or power-cycle (->reset) and SLEEP (->resume) :-( Thanks.
Reply by John B June 25, 20082008-06-25
You need to decide whether you want the WDT or the interrupt to wake up
the processor. If it's the latter, then you must turn off the WDT
before putting the processor to sleep.

-- 
John B
Reply by John Temples June 24, 20082008-06-24
On 2008-06-24, B1ackwater <bw@barrk.net> wrote:
> While I've used PICs for many things, I've never made > use of the SLEEP mode. For my 18f2620, the docs state : > > "All external interrupts (INT0, INT1 and INT2) can > wake-up the processor from SLEEP, if bit INTxE was > set prior to going into SLEEP. If the global interrupt > enable bit GIE is set, the processor will branch to > the interrupt vector following wake-up."
[...]
> BUT ... a WDT timeout while sleeping does NOT branch to > the ISR, but instead just picks up the program exactly > where it left off, ie executing the code beyond the > SLEEP instruction. This is OK, convenient even ... > but not what the docs SAY it will do.
The WDT does not generate an interrupt, so it will not branch to the ISR. When it times out, it wakes from sleep if sleeping, or resets the PIC if running. -- John W. Temples, III
Reply by Pete June 24, 20082008-06-24
B1ackwater wrote:

> "All external interrupts (INT0, INT1 and INT2) can > wake-up the processor from SLEEP, if bit INTxE was > set prior to going into SLEEP. If the global interrupt > enable bit GIE is set, the processor will branch to > the interrupt vector following wake-up."
> BUT ... a WDT timeout while sleeping does NOT branch to > the ISR, but instead just picks up the program exactly > where it left off, ie executing the code beyond the > SLEEP instruction. This is OK, convenient even ... > but not what the docs SAY it will do.
The paragraph that you quoted doesn't seem to mention the WDT. I downloaded the data sheet and a quick check turned up this: > If the device is not executing code (all Idle modes and > Sleep mode), the time-out will result in an exit from > the power-managed mode (see Section 3.2 "Run Modes" and > Section 3.3 "Sleep Mode"). If the device is executing > code (all Run modes), the time-out will result in a WDT > Reset (see Section 23.2 "Watchdog Timer (WDT)"). That suggests to me that the operation you're observing is what the chip was designed to do. It's been a very long time since I've written code for a PIC, but that's also how I remember sleep mode working. Peter