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 CCS Technical Support

why wdt is not sparking in this code

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



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

why wdt is not sparking in this code
PostPosted: Wed Jul 25, 2018 2:57 am     Reply with quote

HI,
I'm wondering why watchdog timer not work here in my code:

Code:


#include <18F4525.h>
#device ADC=10
#fuses HS,NOLVP,WDT,PUT
//#use delay(clock = 16000000, restart_wdt)
#use delay(clock = 16000000)



#byte PORTA    =  0x80
#byte PORTB    =  0x81     
#byte PORTC    =  0x82
#byte PORTD    =  0x83                   
#byte PORTE    =  0x84

#define secs            (pin_D7)        // CS/load pin for seconds
#define ten_secs        (pin_D6)        // CS/load pin for ten seconds
#define mins            (pin_D5)        // CS/load pin for minutes
#define ten_mins        (pin_D4)        // CS/load pin for ten minutes
#define hours           (pin_D3)        // CS/load pin for hours
#define ten_hours       (pin_D2)        // CS/load pin for ten hours
#define CLK             (pin_D1)        //clock pin to MAX7219

//these: devided two parts because of data errors!
#define Data_In         (pin_D0)        //data in  pin all exept seconds ! to MAX7219
#define Data_In_Secs    (pin_C4)        //data in  pin seconds ! to MAX7219
#define CLK_From_Owen   (pin_B0)        //clock pin from owen
#define Display_Off     PIN_B2
#define Set_Run         PIN_B1
#define Minus_Button    PIN_B5          //active low 
#define Plus_Button     PIN_B4          //active low   
#define Set_Button      PIN_B3          //active low   

void lamp_test(void);
void pixel_test(void);
void send_data (int16 data,int8 digit);
void clock_7219(void);             //send clock pulse to MAX7219, clock pin = CLK =  D1
void zero_rows(int8 digit);        //make all rows empty                           
void init_max7219(void);                             
void show_numbers(int8 number, int8 digit);                         
void update_digits(void);         //update Globals G_ten_hours...G_secs
void turn_display_off(void);       
void turn_display_on(void); 
void Set_Time(void);
void Main_Init(void);
void count_from_clock(void);       //interrupt function
void Auto_Bright(void);
void Max_Bright(void);

unsigned int G_ten_hours,G_hours,G_ten_mins,G_mins,G_ten_secs,G_secs,G_Digit_Update;
int1 G_Sec_Done;
int1 G_Set_Pressed;

//*********************************************************************************************

void main(void){
     
      int1 forever = TRUE;
      int8 digit;
     
     
      delay_ms(201);
           
     
      SETUP_WDT(WDT_DIV_32);
     
      SETUP_WDT(WDT_ON);
     
      SETUP_WDT(WDT_DIV_32);
     
     
      init_max7219();
      Main_Init();       
     
      G_Sec_Done = FALSE;
      G_Set_Pressed = FALSE;
     
     
     
delay_ms(500);     
      show_numbers(0, 1);            //digit 1 is seconds         
      delay_ms(3000);   
     
     
      //HERE WDT IS NOT RESTARTED ANYWAY  STILL WDT IS NOT SPARKING ???????????????????????   
     
      while(1){
     
            show_numbers(5, 1);            //digit 1 is seconds  NUMBER IS 5       
     
            delay_ms(500);
            show_numbers(8, 1);            //digit 1 is seconds       
            delay_ms(500);
           
         }       
     
//*********************************************************************************************

void init_max7219(void) {
       
        int8 digit;
       
         for(digit = 1; digit <= 6; ++digit){
         
         send_data (0x0C00,digit);       //shutdown     
         send_data (0x0C01,digit);       //shutdown, normal operation 
         send_data (0x0900,digit);       //no decode mode
         send_data (0x0B06,digit);       //enable columns 0...6         
         send_data (0x0A0F,digit);       //intensity max. (= 0f)
         zero_rows(digit);               //this: clears all rows         
         send_data(0x0C01,digit);        //shutdown, normal operation         
         send_data(0x0F00,digit);         
         send_data(0x700,digit);         //lamp test OFF     
         }
}

//*********************************************************************************************

void Main_Init(void){

      int8 digit;
     
      setup_port_a( AN0 );
      setup_adc( ADC_CLOCK_INTERNAL );
      set_adc_channel( 0 );
      setup_timer_2(T2_DIV_BY_16, 127, 1);            //this is for PWM 1 & PWM 2
      setup_ccp1(CCP_PWM);   // Configure CCP1 as a PWM
      setup_ccp2(CCP_PWM);   // Configure CCP2 as a PWM
      set_pwm1_duty(100);
      set_pwm2_duty(100);     

      //check if these G_ten_hours,G_hours,G_ten_mins,G_mins,G_ten_secs,G_secs; are OK after boot:
     
      if(G_ten_hours > 2)
         G_ten_hours = G_hours = G_ten_mins = G_mins = G_ten_secs = G_secs = 0;
      if(G_ten_hours <= 2){
         if(G_hours > 9)     
         G_ten_hours = G_hours = G_ten_mins = G_mins = G_ten_secs = G_secs = 0;     
      }
      if(G_ten_mins > 5)
         G_ten_hours = G_hours = G_ten_mins = G_mins = G_ten_secs = G_secs = 0;
      if(G_mins > 9)
         G_ten_hours = G_hours = G_ten_mins = G_mins = G_ten_secs = G_secs = 0;
      if(G_ten_secs > 5)
         G_ten_hours = G_hours = G_ten_mins = G_mins = G_ten_secs = G_secs = 0;
      if(G_secs > 9)
         G_ten_hours = G_hours = G_ten_mins = G_mins = G_ten_secs = G_secs = 0;
     
     
      //show all digits:
     
        for(digit = 1; digit <=6 ; ++digit) zero_rows(digit);
         
         show_numbers(G_secs, 1);            //digit 1 is seconds     
         show_numbers(G_ten_secs, 2);        //digit 2 is ten_seconds     
         show_numbers(G_mins, 3);            //digit 3 is minutes     
         show_numbers(G_ten_mins, 4);        //digit 4 is ten_minutes   
         show_numbers(G_hours, 5);            //digit 5 is hours
         show_numbers(G_ten_hours, 6);        //digit 8 is ten_hours             
     
      setup_timer_0 (RTCC_EXT_L_TO_H | RTCC_DIV_32) ;
     
      enable_interrupts(INT_TIMER0);
      enable_interrupts(GLOBAL);
}

//***********************************************************************************************************
     


I'm very pleased if someone help me !
all the best
-arto-
Ttelmah



Joined: 11 Mar 2010
Posts: 19540

View user's profile Send private message

PostPosted: Wed Jul 25, 2018 3:07 am     Reply with quote

A question. How are you testing this?.
If with a debugger, you need to be aware that ICD, automatically disables the watchdog....

Then second, you have 'restart_wdt' selected in the delay setup. This means that whenever the code is executing delays, it'll automatically reset the watchdog. Result if it is looping and using delays, the watchdog will never trigger.
This is an example of why this 'feature' should not be used. It results in restart_wdt instructions being placed into the code that can accidentally be reached, so the watchdog becomes useless......
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Wed Jul 25, 2018 3:26 am     Reply with quote

Ttelmah wrote:
A question. How are you testing this?.
If with a debugger, you need to be aware that ICD, automatically disables the watchdog....

Then second, you have 'restart_wdt' selected in the delay setup. This means that whenever the code is executing delays, it'll automatically reset the watchdog. Result if it is looping and using delays, the watchdog will never trigger.
This is an example of why this 'feature' should not be used. It results in restart_wdt instructions being placed into the code that can accidentally be reached, so the watchdog becomes useless......


I know I have to restart wdt but it's commented out in the top of my code for test purposes...

<This is an example of why this 'feature' should not be used. It results in restart_wdt instructions being placed into the code that can accidentally be reached, so the watchdog becomes useless......>

I don't see what you mean ...? how to fix the problem ?

now i'm looking my display and it seems to me that watchdog is working but it takes very long time !

thank you Smile
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Wed Jul 25, 2018 3:30 am     Reply with quote

Ttelmah wrote:
A question. How are you testing this?.
If with a debugger, you need to be aware that ICD, automatically disables the watchdog....

Then second, you have 'restart_wdt' selected in the delay setup. This means that whenever the code is executing delays, it'll automatically reset the watchdog. Result if it is looping and using delays, the watchdog will never trigger.
This is an example of why this 'feature' should not be used. It results in restart_wdt instructions being placed into the code that can accidentally be reached, so the watchdog becomes useless......

I'm testing it PICKIT2 in circuit programmer.
Ttelmah



Joined: 11 Mar 2010
Posts: 19540

View user's profile Send private message

PostPosted: Wed Jul 25, 2018 3:51 am     Reply with quote

The whole point of a watchdog, is that the restart should _only_ be reachable if the code is actually working right. You need a 'test' routine, which checks the status of everything the code is meant to do, and only resets the watchdog, if every part of the code is actually functioning correctly. Otherwise the watchdog is largely pointless...
<https://www.embedded.com/design/debug-and-optimization/4402288/Watchdog-Timers>
Look particularly at the section 'Sanity checks'.
Misuse of watchdogs is a very common fault.

Your problem is simple. WDT. You don't want this fuse. Selecting the watchdog in hardware, overrides the setup_wdt instruction. Yours is being hardware programmed to enabled, with the longest possible timeout. To software configure the WDT you need the NOWDT fuse (on some chips you have to use the WDT_SW fuse).
temtronic



Joined: 01 Jul 2010
Posts: 9243
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Jul 25, 2018 4:57 am     Reply with quote

also...
your slection for adc_clock speed appears to be in error.
Table 19-1 of the datasheet shows what are valid adc_clock sources vs PIC speeds.
I'm assuming you let some 'wizard' automatically configure it for you... well the 'wizard' is wrong. The only time 'internal' is used is when the PIC is asleep according to the Note (3) under the table.
While you won't see any ADC problems during 'simulation' or possibly 'ICD' operations, you will when the PIC operates in the Real World.
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Wed Jul 25, 2018 5:08 am     Reply with quote

temtronic wrote:
also...
your slection for adc_clock speed appears to be in error.
Table 19-1 of the datasheet shows what are valid adc_clock sources vs PIC speeds.
I'm assuming you let some 'wizard' automatically configure it for you... well the 'wizard' is wrong. The only time 'internal' is used is when the PIC is asleep according to the Note (3) under the table.
While you won't see any ADC problems during 'simulation' or possibly 'ICD' operations, you will when the PIC operates in the Real World.


Thanks for your good answer ... I'm not using that adc anymore it was for
other version of my program so it is not valid anymore...

BTW this works :

#fuses HS,NOLVP,WDT16,PUT

so it must be that WDT16 !

thank you

Smile
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Wed Jul 25, 2018 5:10 am     Reply with quote

temtronic wrote:
also...
your slection for adc_clock speed appears to be in error.
Table 19-1 of the datasheet shows what are valid adc_clock sources vs PIC speeds.
I'm assuming you let some 'wizard' automatically configure it for you... well the 'wizard' is wrong. The only time 'internal' is used is when the PIC is asleep according to the Note (3) under the table.
While you won't see any ADC problems during 'simulation' or possibly 'ICD' operations, you will when the PIC operates in the Real World.

I found this useful : #fuses HS,NOLVP,WDT16,PUT

so it must be WDT16 it's working no fine Smile
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Wed Jul 25, 2018 5:18 am     Reply with quote

artohautala wrote:
temtronic wrote:
also...
your slection for adc_clock speed appears to be in error.
Table 19-1 of the datasheet shows what are valid adc_clock sources vs PIC speeds.
I'm assuming you let some 'wizard' automatically configure it for you... well the 'wizard' is wrong. The only time 'internal' is used is when the PIC is asleep according to the Note (3) under the table.
While you won't see any ADC problems during 'simulation' or possibly 'ICD' operations, you will when the PIC operates in the Real World.


I found this useful : #fuses HS,NOLVP,WDT16,PUT

so it must be WDT16 it's working now fine Smile
Ttelmah



Joined: 11 Mar 2010
Posts: 19540

View user's profile Send private message

PostPosted: Wed Jul 25, 2018 6:18 am     Reply with quote

No. That's now turning it on in hardware at the time you want. Not the same thing. Means you can never turn it off, or change the interval.
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