CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Watchdog with 18F26J50

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
jinmoon



Joined: 05 Dec 2012
Posts: 3

View user's profile Send private message

Watchdog with 18F26J50
PostPosted: Wed Dec 05, 2012 11:09 pm     Reply with quote

Hi, I'm trying to figure out how the watchdog works.. Below's the full code. I set NOWDT for software control. It never comes out of sleep()... What can be possibly wrong? The compiler version is 4.128. I'm looking at PIN_A1 with an oscilloscope with nothing else connected.

Code:

#include   "18F26J50.h"

#fuses      NOWDT,      PLL1,      NOSTVREN,   NOXINST,      NODEBUG
#fuses      NOCPUDIV,   NOPROTECT
#fuses      INTRC_IO,   NOT1DIG,      NOLPT1OSC,   NOFCMEN,      NOIESO
#fuses      WDT64
#fuses      DSWDTOSC_INT,   RTCOSC_INT,   NODSBOR,      NODSWDT,      DSWDT2
#fuses      NOIOL1WAY,   MSSPMSK5
#fuses      NOWPFP,      WPEND,      NOWPCFG
#fuses      WPDIS
#use         delay(clock=4000000, restart_wdt)

void main() {
   setup_wdt(WDT_ON);
   while(TRUE) {
      sleep();
      setup_wdt(WDT_OFF);
      output_bit(PIN_A1, 1);
      delay_ms(400);
      output_bit(PIN_A1, 0);
      delay_ms(400);
   }
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19328

View user's profile Send private message

PostPosted: Thu Dec 06, 2012 2:29 am     Reply with quote

OK.
It's doing what it should.
Key is that you are going fully asleep. This includes stopping the low power oscillator, so the watchdog will also stop. You can wake from this with an external trigger (so external interrupt etc.).
You need to look at the sleep options in the include file for the processor. Note that the default is 'SLEEP_FULL'.
Now look at the data sheet, section 4.4 'Idle Modes'.
So, you have choices. User the idle mode, and keep the standard watchdog running. Use deep sleep, and use the optional deep sleep watchdog.
Easiest is just to use:

sleep(SLEEP_IDLE);

this will leave the peripheral clock running.
You can also use 'WAKE_FROM_RTCC', which will also leave the watchdog running, if the timer1 oscillator is not enabled (your's isn't).

Best Wishes
jinmoon



Joined: 05 Dec 2012
Posts: 3

View user's profile Send private message

PostPosted: Thu Dec 06, 2012 8:44 am     Reply with quote

Thanks Ttelmah,

I tried sleep(SLEEP_IDLE), and it's not still working. When using '#fuse INTRC', I could see on the scope that the main clock is still running even after sleep(), but still stuck at sleep (not executing the next codes). No go for 'WAKE_FROM_RTCC' either.

I also checked the LST file that NODEBUG is correctly applied.

And when I checked the manual, I found this. The watchdog is supposed to be running on INTRC, the 31kHz oscillator. Isn't it?

Quote:

The main output (INTOSC) is an 8 MHz clock source
which can be used to directly drive the device clock. It
also drives the INTOSC postscaler which can provide a
range of clock frequencies from 31 kHz to 8 MHz.
Additionally, the INTOSC may be used in conjunction
with the PLL to generate clock frequencies up to
48 MHz.
The other clock source is the internal RC oscillator
(INTRC) which provides a nominal 31 kHz output.
INTRC is enabled if it is selected as the device clock
source. It is also enabled automatically when any of the
following are enabled:
• Power-up Timer
• Fail-Safe Clock Monitor
• Watchdog Timer
• Two-Speed Start-up
Ttelmah



Joined: 11 Mar 2010
Posts: 19328

View user's profile Send private message

PostPosted: Thu Dec 06, 2012 9:34 am     Reply with quote

Yes.
Seen people having problems with this before. It seems that sometimes the INTRC does not run, though the data sheet says it should. Selecting something else that should keep it running normally solves the problem....
I have tried in the past switching the CPU to run off this clock, and it then worked....
What compiler version are you on?. Will check that it is enabling the watchdog.

Best Wishes
jinmoon



Joined: 05 Dec 2012
Posts: 3

View user's profile Send private message

PostPosted: Thu Dec 06, 2012 9:59 am     Reply with quote

I have two code versions, both of which should be functioning identical.

The first one is using 'WDT', and the second one is using 'NOWDT' and controlling the WDT with software. The first one works, and the second one does not.

I think it's CCS' fault? maybe assigning weird values to the WDTCON register?


Code:

#include   "18F26J50.h"

#fuses   WDT, WDT128, NODEBUG, INTRC_IO
#use      delay(clock=4000000, restart_wdt)

void main() {
   while(TRUE) {
      output_bit(PIN_A1, 1);
      sleep();
      output_bit(PIN_A1, 0);
      sleep();
   }
}


The above code works with 4ms*128 = 512ms high/low duration.




Code:

#include   "18F26J50.h"

#fuses   NOWDT, WDT128, NODEBUG, INTRC_IO
#use      delay(clock=4000000, restart_wdt)

void main() {
   while(TRUE) {
      output_bit(PIN_A1, 1);
      setup_wdt(WDT_ON);
      restart_wdt();
      sleep();
      setup_wdt(WDT_OFF);

      output_bit(PIN_A1, 0);
      setup_wdt(WDT_ON);
      restart_wdt();
      sleep();
      setup_wdt(WDT_OFF);
   }
}


The above code does not work. It doesn't get out of the first sleep().


The compiler version is 4.128. I'm looking at PIN_A1 with an oscilloscope with nothing else connected.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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