| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			Josep Robert
 
 
  Joined: 27 Mar 2018 Posts: 25
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| PIC18LF47K40 - restart_cause() returns unknown values. | 
			 
			
				 Posted: Thu Oct 03, 2019 4:12 am     | 
				     | 
			 
			
				
  | 
			 
			
				Hello!
 
 
When I try to use the restart_cause() function I obtain values that are not in the list of constants in 18LF47K40.h file.
 
 
Can you help me to obtain the real cause of any restart cause?
 
 
I use: PCH Compiler 5.076 and MPLAB X IDE v5.25.
 
 
Here a small code to check one of these problems:
 
 
 	  | Code: | 	 		  
 
#include <18LF47K40.h>
 
#use delay(clock = 16MHZ, internal)
 
 
#FUSES WDT_SW
 
#FUSES WDT65536 
 
 
void main()
 
{
 
   int16 RestartCause;
 
   int8 RChigh, RClow;
 
    
 
   RestartCause = restart_cause();
 
   
 
   RChigh = make8(RestartCause, 1);
 
   RClow = make8(RestartCause, 0);
 
   
 
   write_eeprom(0, RChigh);
 
   delay_ms(1);
 
   write_eeprom(1, RClow);
 
         
 
   setup_wdt(WDT_ON);
 
   
 
   while(TRUE)
 
   {  
 
      //restart_wdt();
 
 
      delay_ms(1000);
 
   } 
 
}
 
 
/*
 
    EE Data Memory
 
  
 
Address   00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F     ASCII
 
 
310000    03  2F  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  ./...... ........
 
310010    FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  ........ ........ 
 
 
    0x032F is an unknown restart cause in ccs file 18LF47K40.h:
 
 
   // Constants returned from RESTART_CAUSE() are:
 
   #define NORMAL_POWER_UP       0x33C 
 
   #define BROWNOUT_RESTART      0x33E 
 
   #define MCLR_FROM_SLEEP       0x237 
 
   #define WDT_TIMEOUT           0x12F 
 
   #define WDT_FROM_SLEEP        0x03F 
 
   #define INTERRUPT_FROM_SLEEP  0x23F 
 
   #define MCLR_FROM_RUN         0x337 
 
   #define RESET_INSTRUCTION     0x33B 
 
   #define STACK_OVERFLOW        0x3BF 
 
   #define STACK_UNDERFLOW       0x37F 
 
   #define WDT_WINDOW_VIOLATION  0x31F 
 
 
 */
 
 | 	  
 
 
Thank you very much.
 
 
Best Regards,
 
 
Josep Robert | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 03, 2019 7:21 am     | 
				     | 
			 
			
				
  | 
			 
			
				OK, 'silly' test.
 
Instead of saving the restart cause to EEPROM and reading it, just print it to PC terminal program.
 
There 'might' be a problem with the EERPROM writing, reading or the actual EEPROM cell.
 
Also is 1ms long enough  ?
 
Can that PIC write individual bytes ? Most need to read a block, erase, then write a block...
 
 I'm sure others who use that PIC or family will respond....
 
Jay | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 03, 2019 12:59 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Unfortunately this is now common.
 
On the earlier chips, most restart states had specific patterns of bits.
 
The CCS function and defines assume this. However on a lot of the newer
 
chips some of the restart causes have several bit as 'u' (indeterminate), 
 
so the simple equality test that could be applied with the more basic chips
 
no longer works. 
 
The watchdog reset only guarantees 2 bits to be 0. Every other bit is 
 
indeterminate. 
 
CCS really need a major rethink about these tests for the later chips. | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Re: PIC18LF47K40 - restart_cause() returns unknown values. | 
			 
			
				 Posted: Thu Oct 03, 2019 1:21 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Josep Robert wrote: | 	 		  
 
    0x032F is an unknown restart cause in ccs file 18LF47K40.h:
 
 
   // Constants returned from RESTART_CAUSE() are:
 
   #define NORMAL_POWER_UP       0x33C 
 
   #define BROWNOUT_RESTART      0x33E 
 
   #define MCLR_FROM_SLEEP       0x237 
 
   #define WDT_TIMEOUT           0x12F 
 
   #define WDT_FROM_SLEEP        0x03F 
 
   #define INTERRUPT_FROM_SLEEP  0x23F 
 
   #define MCLR_FROM_RUN         0x337 
 
   #define RESET_INSTRUCTION     0x33B 
 
   #define STACK_OVERFLOW        0x3BF 
 
   #define STACK_UNDERFLOW       0x37F 
 
   #define WDT_WINDOW_VIOLATION  0x31F 
 
 
 | 	  
 
The lower 8 bits match, so it's some form of Watchdog reset. | 
			 
		  | 
	
	
		  | 
	
	
		
			benoitstjean
 
 
  Joined: 30 Oct 2007 Posts: 590 Location: Ottawa, Ontario, Canada 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 03, 2019 5:02 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Haven't looked at that chip but for the PIC24EP, it has an RCON (Reset Control Register) and each bit specifies a reset type as seen below. These (for the PIC24) can be seen in document DS70602B pages 8-5 and 8-6.
 
 
Maybe there's a similar document for your device?
 
 
bit 15 TRAPR: Trap Reset Flag bit
 
1 = A Trap Conflict Reset has occurred
 
0 = A Trap Conflict Reset has not occurred
 
 
bit 14 IOPUWR: Illegal Opcode or Uninitialized W Access Reset Flag bit
 
1 =An illegal opcode detection, an illegal address mode or an uninitialized W register used as an Address Pointer caused a Reset
 
0 =An illegal opcode or uninitialized W register Reset has not occurred
 
 
bit 13 SBOREN: Software BOR Enable/Disable bit(4)
 
1 =BOR is turned on in software
 
0 =BOR is turned off in software
 
 
bit 12 Unimplemented: Read as ‘0’
 
 
bit 11 VREGSF: Flash Voltage Regulator Stand-by During Sleep bit
 
1 =Flash voltage regulator is active during Sleep
 
0 =Flash voltage regulator goes into Stand-by mode during Sleep
 
 
bit 10 Unimplemented: Read as ‘0’
 
 
bit 9 CM: Configuration Mismatch Flag bit(2)
 
1 = A configuration mismatch Reset has occurred
 
0 = A configuration mismatch Reset has not occurred
 
 
bit 8 VREGS: Voltage Regulator Stand-by During Sleep bit
 
1 =Voltage regulator is active during Sleep
 
0 =Voltage regulator goes into Stand-by mode during Sleep
 
 
bit 7 EXTR: External Reset Pin bit
 
1 = A Master Clear (pin) Reset has occurred
 
0 = A Master Clear (pin) Reset has not occurred
 
 
bit 6 SWR: Software Reset (Instruction) Flag bit
 
1 = A RESET instruction has been executed
 
0 = A RESET instruction has not been executed
 
 
bit 5 SWDTEN: Software Enable/Disable of WDT bit(3)
 
1 = WDT is enabled
 
0 = WDT is disabled
 
 
bit 4 WDTO: Watchdog Time-out Flag bit
 
1 = WDT time-out has occurred
 
0 = WDT time-out has not occurred
 
 
bit 3 SLEEP: Wake-up from Sleep Flag bit
 
1 = Device has been in Sleep mode
 
0 = Device has not been in Sleep mode
 
 
bit 2 IDLE: Wake-up from Idle Flag bit
 
1 = Device was in Idle mode
 
0 = Device was not in Idle mode
 
 
bit 1 BOR: Brown-out Reset Flag bit
 
1 = A Brown-out Reset or Power-on Reset has occurred
 
0 = A Brown-out Reset has not occurred
 
 
bit 0 POR: Power-on Reset Flag bit
 
1 = A Power-on Reset has occurred
 
0 = A Power-on Reset has not occurred
 
 
 
The you can probably add some assembly code that reads the register immediately at power-up...
 
 
 
Ben | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 03, 2019 10:40 pm     | 
				     | 
			 
			
				
  | 
			 
			
				The restart is flagged by the RCON and STATUS registers.
 
On this chip both return 'indeterminate' for all but two bits on a 
 
watchdog restart. This makes the simple test for equality used by the
 
CCS system, not work. 
 
Restart_cause inverts bit 8 in the value, So it is a watchdog, if bit 4 of 
 
restart_casue == 0 and bit 8 == 1.
 
So 0x12F or 0x32F are both watchdog restarts. 
 
As I said CCS need to rethink how this is coded.... | 
			 
		  | 
	
	
		  | 
	
	
		
			benoitstjean
 
 
  Joined: 30 Oct 2007 Posts: 590 Location: Ottawa, Ontario, Canada 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Oct 04, 2019 4:53 am     | 
				     | 
			 
			
				
  | 
			 
			
				| Ah! Sorry! My mistake. | 
			 
		  | 
	
	
		  | 
	
	
		
			dgi
 
 
  Joined: 07 Jan 2004 Posts: 11 Location: Philadelphia, USA 
			
			 
			 
			
			 
			
			
			
			
			
  
		  | 
		
			
				| restart_cause() only returns 8 bits?? | 
			 
			
				 Posted: Thu Sep 17, 2020 2:20 pm     | 
				     | 
			 
			
				
  | 
			 
			
				I'm using PIC18F27Q10 and PCWHD 5.095.
 
 
In my program I call restart_cause() to find out what caused the last restart. Right now it is returning 0x2F. The problem is that restart_cause() returns only 8 bits, while the constants in 18F27Q10.h are 12 bits, and the upper bits don't match. Is this a big in the compiler? How do I get the rest of the bits from restart_cause() ?
 
 
 	  | Code: | 	 		  
 
void hotel_print_powerup_message(void)
 
{
 
   int16 what_happened = restart_cause();
 
   printf(nmea_txt,"$RESTART,");
 
    if (what_happened == NORMAL_POWER_UP)
 
        printf(nmea_putc,"NORMAL*");
 
    else if (what_happened == RESET_INSTRUCTION)
 
        printf(nmea_putc,"RESET_CMD*");
 
    else if (what_happened == WDT_TIMEOUT)
 
 
.. etc..etc... | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Sep 18, 2020 1:03 am     | 
				     | 
			 
			
				
  | 
			 
			
				That needs to be pointed out to CCS.
 
It's just a fault with the declaration in the .h file.
 
It needs to be:
 
 
_bif int16 restart_cause(void);
 
 
It is correct for many(most) other chips. So (for example) the 27K40,
 
the 26J11 etc. etc... 
 
 
If I make this change to the header and save a copy of it (then set the
 
compiler to use this copy rather than the 'master' stored with the compiler),
 
it does correctly put stuff into the upper byte of the return value.
 
 
So:
 
 	  | Code: | 	 		  
 
#include "18F27Q10.h" //Inverted commas so it uses the local copy
 
#device ADC=10
 
 
#FUSES NOWDT                    //No Watch Dog Timer
 
 
#use delay(crystal=20000000)
 
 
void main()
 
{
 
   int16 val;
 
   val=restart_cause();
 
//assembly shows stuff being written into the high byte here
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		 |