View previous topic :: View next topic |
Author |
Message |
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
Timing on a two speed program |
Posted: Mon Apr 22, 2024 12:50 pm |
|
|
I have a PIC16LF1827 and, since is a low power battery device, I change the device speed from 31kHz to 4MHz when needed but I need a time base and since all the timers must run from the internal oscillator the clock timing will change a lot.
I don't need super precision, the 4MHZ phase last around 2 seconds but it depends on the user.
I was thinking in to run the timer only when is in low power mode(31kHz) and add 2 seconds for every time the device is wake up before goes in low speed mode.
Do you have a better approach? _________________ Electric Blue |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1909
|
|
Posted: Mon Apr 22, 2024 12:57 pm |
|
|
When high speed is invoked, implement some sort of timer ASAP. Clock source will be the 4MHz clock.
Simply use that timer to count.
When it's time to go back to sleep, calculate how many 31kHz ticks have elapsed. Update your second clock and then use the remainder to preset the 31kHz timer. For example, if 2.7 seconds have elapsed, add 2 to your second counter and preset the 31kHz timer to expire in 0.3 seconds. |
|
|
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Mon Apr 22, 2024 1:05 pm |
|
|
Cool, nice approach, I wasn't thinking in to use a second timer on HiSpeed mode. I was thinking in a way to read the WDT that always run with the same clock but yours is better.
I will try your approach. thanks. _________________ Electric Blue |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Mon Apr 22, 2024 5:00 pm |
|
|
'adding 2 seconds' sounds like you have a 'real time clock' as part of the PIC project ?
If so add an external RTC module, maybe splurge for the high accurate one ! I use them in every PIC project and the one I use has an EEPROM as well.
Using the external RTC also gives you the option of having it send an interrupt.
Mine are set for 1 second to 'trigger' main() to update the LCD, trigger the DS temperature sensors, and a few other 'things'.
Being battery backed up, no loss of real time either. |
|
|
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Mon Apr 22, 2024 6:08 pm |
|
|
Nope. Is an RF PIR, so is interrupted every time a person walk in front of it.
I need to send a test signal to the alarm panel every 12 hours to know that the device is there.
I can't add any external crystal or base time, is something super cheap. _________________ Electric Blue |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Tue Apr 23, 2024 5:20 am |
|
|
random thoughts....
hmm, remember the internal RC OSC isn't 'great' at accurate timing and varies on temperature.
Only sending once every 12 hrs is 'scary' to me. My luck it'd fail 12.3 seconds after the last 'I'm OK'......My remote energy systems talked every 15 seconds, even when on batteries.
Is your communications 2 way ? If so,send the remote the current time.
batteries lose a lot of power when cold,so use bigger batteries.....or play every 'trick' Microchip has to reduce power consumption.Obvious ones are turnin goff peripherals, 10meg pullups, largecap across battery, etc. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Apr 23, 2024 7:08 am |
|
|
Just have a timer interrupt for the clock. Perhaps use Timer0, with /32, and
then this will interrupt every 0.946 second when running at 31KHz. Remember
this is quite a low accuracy oscillator, so +/-5%. Simply have a global
count variable. Set this to '1' when you are running 31KHz, and to 122
when you switch to 4MHz. In the interrupt have a static variable counter,
and increment your time whenever this matches or exceeds the global
variable (and resets to zero when this happens). When your clock is 4Mhz,
you will get your time incrementing every 122*256*32 = 999424 clocks
(= 0.999 seconds), while when in 31KHz mode it will increment every
256*32 = 8192 clocks = 0.946 seconds. |
|
|
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Tue Apr 23, 2024 10:50 am |
|
|
temtronic wrote: | random thoughts....
hmm, remember the internal RC OSC isn't 'great' at accurate timing and varies on temperature.
Only sending once every 12 hrs is 'scary' to me. My luck it'd fail 12.3 seconds after the last 'I'm OK'......My remote energy systems talked every 15 seconds, even when on batteries.
Is your communications 2 way ? If so,send the remote the current time.
batteries lose a lot of power when cold,so use bigger batteries.....or play every 'trick' Microchip has to reduce power consumption.Obvious ones are turnin goff peripherals, 10meg pullups, largecap across battery, etc. |
I know that has very low accuracy but my boss doesn't want to add anything else.
The batteries are 2 AAA and must last at least a year, so, is not viable to send data every 15 seconds.
The device is one way, only has an RF TX. _________________ Electric Blue |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Wed Apr 24, 2024 5:28 am |
|
|
Redesign using ONE lithium battery (18650) instead of two AAA cells.
yes, a little more money but WILL last over a year. Also no worry about corrosion(leaky ) AAA batteries and fewer connections.
I'm assuming some type of plastic AAA cell holder, so you could hardwire battery onto PCB.
If possible, cut code to send battery condition to 'central command'. Most if not all 'burglar alarm' battery powered sensors do this, for,well, obvious reasons.
Using 'cheap' batteries in any product is a false economy. If the 18650 is 'too big' or 'costs too much', look for a physically smaller, less expensive battery.
Do the 'math' to see how many electrons you need for 12 months, add 25% more. I spent about 3 MONTHS figuring out the best battery. NOT being called at 2AM in the middle of Winter due to 'battery low alarm' as NICE ! |
|
|
jeremiah
Joined: 20 Jul 2010 Posts: 1354
|
|
Posted: Wed Apr 24, 2024 7:56 am |
|
|
You probably don't have to redesign, they make AAA lithium batteries. Most I've seen have been in the 1100-1200 mAH range, which is a good 50% more shelf life / power budge than a 750 mAH battery. |
|
|
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Wed Apr 24, 2024 10:06 am |
|
|
Lithium batteries doesn't have a bigger self discharge index?
I'm setting T1 this
Code: | set_timer1(0xFFFF-(31000/4)); |
This setting is giving me 1.08s base time. Doing some math gives me around 28.7kHZ. That's around -7% of deviation from 31kHz.
This is normal?
I know you said UP TO 5% but was expecting, at most 3%, but this is beyond. _________________ Electric Blue |
|
|
|