| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			Omarfarouk
 
 
  Joined: 24 Mar 2022 Posts: 10
  
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				| Saving power for battery device [PIC16F722A] | 
			 
			
				 Posted: Thu Mar 24, 2022 4:23 am     | 
				     | 
			 
			
				
  | 
			 
			
				Hey there It's my first post so I will try my best to put in all the info in the post.
 
I have only started working with pics 4-5 months ago and yet learning.
 
 
I am currently working on a project using PIC16F722A with an external eeprom, sensor, LED, and a button. The program goes on in a loop checking for any change on inputs (button or sensor) and it's all working as intended but the device will be using a battery and need it to last for as long as possible.
 
[ccs c version 5.102]
 
So I was searching for how to use less power specially while going on in the loop (I have tried using watchdog & sleep but did nothing as it wake ups up frequently to check the pins). I also wanted to add some kind of a time counter. (I made one using delay for 500ms or 1sec and incrementing the counter)(and replaced the delay with the sleep function when I was trying watchdog).
 
 
I am still new to this so I am trying to explain as much as possible    
 
 
Also, when I put in "setup_wdt(WDT_ON)" I get an error saying "WDT_ON" is "unidentified identifier".
 
 
& that's a bit of my code:
 
 	  | Code: | 	 		  
 
#include <16F722A.h>
 
#device ADC=16
 
 
#FUSES WDT                      //Watch Dog Timer
 
#FUSES NOBROWNOUT               //No brownout reset
 
#FUSES BORV19                   //Brownout reset at 1.9V
 
#FUSES NOVCAP                   //VCAP pin disabled
 
#FUSES NOMCLR
 
 
#use delay(internal=4000000,restart_wdt)
 
#include <2404.C>
 
 
 
void hygienee(){
 
   if(hygiene_ == 0){            //12hours //a variable/flag for a switch
 
      h_counter++;
 
      sleep();                        //counting using WDT & sleep
 
      //delay_ms(500);          //simple delay counting
 
      if(h_counter == 86400){
 
         open_valve();
 
      }
 
   }
 
   if(hygiene_ == 1){            //24hours
 
      h_counter++;
 
      sleep();
 
      //delay_ms(500);
 
      if(h_counter == 172800){
 
         open_valve();
 
      }
 
   }
 
}
 
 
void main(){
 
   setup_wdt(WDT_1152MS);      //~1.125 s reset
 
   
 
   init_ext_eeprom();            // command to initiate the external eeprom
 
   delay_ms(3000);
 
   Initialization();
 
   
 
   bat_check();                  //battery check
 
   fresh_setup();
 
   transferattributes();         //copy data from eeprom to its variables
 
   powerupflush();
 
   
 
   while(true){
 
      
 
      PIR_detect();
 
      test();
 
      Setup_Buttoncheck();
 
      Lowbat_alert();
 
      hygienee();
 
   }
 
}
 
 
 | 	  
 
Hope I was able to fill in all the information needed! | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Mar 24, 2022 7:07 am     | 
				     | 
			 
			
				
  | 
			 
			
				hmm, open up the device header (#include <16F722A.h> ) file.
 
About 3 'page downs' you'll see the predefined 'definitions' for the WDT 'options'. I do see WDT_ON in my file.\
 
 
Had a quick look at the datasheet. that PIC can wake up from sleep, using interrupts on PortB. I'd put the 'sensor' and 'button' on those pins. When coded properly the PIC will stay asleep UNTIL the button is pressed. No need to sleep, wake up, test button status, go back to sleep.
 
 
Jay | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Mar 24, 2022 7:32 am     | 
				     | 
			 
			
				
  | 
			 
			
				The reason WDT_ON does not work, is that this chip does not support
 
software control of the watchdog. On this chip the watchdog is 
 
enabled/disabled in the fuses only. Once it is on, it is on. No ability for 
 
software control. 
 
 
The first critical thing you do not show is which pins you are using, and 
 
what you are 'doing' with the pins you do not use. It is critical that pins
 
are not left 'floating'. Every pin must be driven. So any pin that does not
 
have a connection externally, should be explicitly driven high or low
 
by your code. 
 
 
The watchdog is of little use for a timer. It is very inaccurate. On your chip
 
the watchdog has nearly 3:1 range of timings it gives 10 to 27mSec. 
 
Awful. The way to do a timer is to use an external clock chip. When you
 
wake read the time from this. The watchdog is not a way to get anything
 
remotely accurate. The 1.152 second nominal time can be anything
 
from 0.64 seconds to 1.728 seconds. 
 
 
Now the other thing that will drink power is your LED. Even a low power 
 
one will draw more than the PIC when on. 
 
 
Then note in the data sheet. "All VCAP functions are disabled (not 
 
recommended)". If you want to run without Vcap, you should be using
 
the LF chip, not the F chip. The regulator wastes you 50uA, even when 
 
switched off. It actually draws less when enabled (just 30uA). So long
 
as you can guarantee that the supply is not going to go above 3.6v,
 
use the LF chip and don't worry about Vcap. Otherwise enable Vcap
 
and add the capacitor for this. This will save you power. Particularly
 
since with the LDO disabled the 50uA consumption is there even when
 
the chip is asleep. With the regulator enabled this drops to 5uA.
 
 
You can save power when 'on', by dropping the clock rate. Running at
 
250KHz, means the PLL is not enabled, and drops the power to well under
 
half what is used at 4MHz. | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Mar 24, 2022 8:55 am     | 
				     | 
			 
			
				
  | 
			 
			
				hmm.curious am I 
 
 
I assumed it could be controlled after seeing WDT_ON and WDT_OFF in the device header.
 
 
Downloaded the datasheet, again, as Windows put it 'somewhere'....
 
 
.. saw this
 
 	  | Quote: | 	 		  The WDTE bit is located in the Configuration Word
 
Register 1. When set, the WDT runs continuously.
 
somewhere near section 3.4.2
 
 | 	  
 
The diagram kinda says WDT should be controllable.
 
 
Don't take much to confuse me these days though.... | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Mar 24, 2022 11:42 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Key bit in your post "located in the Configuration Word". 
 
 
Fuse only. | 
			 
		  | 
	
	
		  | 
	
	
		
			Omarfarouk
 
 
  Joined: 24 Mar 2022 Posts: 10
  
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 28, 2022 3:53 am     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Ttelmah wrote: | 	 		  
 
The first critical thing you do not show is which pins you are using, and 
 
what you are 'doing' with the pins you do not use. It is critical that pins
 
are not left 'floating'. Every pin must be driven. So any pin that does not
 
have a connection externally, should be explicitly driven high or low
 
by your code. 
 
 | 	  
 
 
most of the pins are in use for other functions through the code and the pins not in use are all 0 volts as I measured them  but I did not pull them down in my code.
 
 
 	  | Code: | 	 		  
 
#define temp PIN_A0
 
#define chargecheck PIN_A1
 
#define LED PIN_A2
 
#define openvalve PIN_A3
 
#define closevalve PIN_A4
 
#define button PIN_A7
 
#define tester PIN_B0
 
#define charge PIN_B1
 
#define mode PIN_B2
 
#define PIR PIN_B3
 
#define hygiene PIN_B4
 
#define five PIN_B5
 
#define ten PIN_B6
 
#define twenty PIN_B7
 
 | 	  
 
 
 	  | Ttelmah wrote: | 	 		  
 
Then note in the data sheet. "All VCAP functions are disabled (not 
 
recommended)". If you want to run without Vcap, you should be using
 
the LF chip, not the F chip. The regulator wastes you 50uA, even when 
 
switched off. It actually draws less when enabled (just 30uA). So long
 
as you can guarantee that the supply is not going to go above 3.6v,
 
use the LF chip and don't worry about Vcap. Otherwise enable Vcap
 
and add the capacitor for this. This will save you power. Particularly
 
since with the LDO disabled the 50uA consumption is there even when
 
the chip is asleep. With the regulator enabled this drops to 5uA.
 
 | 	  
 
 
About power the board will be powered by 4 batteries which is 6V input. So I will definitely be above the 3.6V. I want the board to stay for 1 year or so. And I think the key fix is to find a way to save on power while waiting for any inputs(sensor or button).
 
 
 	  | temtronic wrote: | 	 		  
 
using interrupts on PortB. I'd put the 'sensor' and 'button' on those pins. When coded properly the PIC will stay asleep UNTIL the button is pressed.
 
 | 	  
 
That might actually help but I will not be able to measure the time passed tho. I think...[/quote] | 
			 
		  | 
	
	
		  | 
	
	
		
			Omarfarouk
 
 
  Joined: 24 Mar 2022 Posts: 10
  
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 28, 2022 3:57 am     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | temtronic wrote: | 	 		  hmm.curious am I 
 
 
I assumed it could be controlled after seeing WDT_ON and WDT_OFF in the device header.
 
 
Downloaded the datasheet, again, as Windows put it 'somewhere'....
 
 
.. saw this
 
 	  | Quote: | 	 		  The WDTE bit is located in the Configuration Word
 
Register 1. When set, the WDT runs continuously.
 
somewhere near section 3.4.2
 
 | 	  
 
The diagram kinda says WDT should be controllable.
 
 
Don't take much to confuse me these days though.... | 	  
 
 
yea but it only turns on and never goes off. thb I can't even test if it will work or not. CCS does not accept these commands for this chip at all. | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 28, 2022 5:51 am     | 
				     | 
			 
			
				
  | 
			 
			
				As Mr T pointed out, it's a 'configuration FUSE' , so it'll ALWAYS be on(or off).
 
I looked at the diagram,assumed ( thought ), GREAT 'controlled' by a bit in a register...later found out it's NOT an accessable bit.....
 
 
Actually controllable WDT is a 'new' thing to me, then again I remember when single chip UARTs came out.   | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 28, 2022 6:59 am     | 
				     | 
			 
			
				
  | 
			 
			
				On  the pins, 'being at 0v', if you test with a meter, does not mean they
 
will stay at 0v. If a pin floats (they all do), it can get into the transition
 
region of the chip's inputs. This then means a lot of extra power is drawn.
 
Just in your code, set all the unused pins low (output_low(PINxx);). | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 28, 2022 7:04 am     | 
				     | 
			 
			
				
  | 
			 
			
				hmm... battery powered for a year...
 
Some things you need to consider 
 
 
actual temperature the product is in
 
power really used
 
ideal pullups on pins
 
read Microchip's AN806
 
size allocated for 'battery' | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 28, 2022 7:26 am     | 
				     | 
			 
			
				
  | 
			 
			
				Key thing he can do is switch to the LF chip. The overhead for the regulator 
 
on the F chip _even when turned off_, is wasting power. Seriously this will
 
probably about double the battery life!... | 
			 
		  | 
	
	
		  | 
	
	
		 |