|
|
View previous topic :: View next topic |
Author |
Message |
dazlogan
Joined: 19 Oct 2003 Posts: 24 Location: Cambridge, UK
|
12F629 @ 32kHz - driving me barmy! |
Posted: Wed Apr 14, 2004 4:55 pm |
|
|
Hi,
Please help before I jump out of the window...
I have a PIC12F629 running at 3V with a 32kHz watch crystal as the clock.
I simply want to put the PIC to sleep() and wake up on a timer 1 overflow but cannot for the life of me get it to work.
The PIC is running ok, i've got an LED to flash so I know the hardware's ok. It's just this damn sleep/wake up on timer 1 overflow i cant fathom out.
The window is open and i'm ready to jump!
Regards,
Darren |
|
|
asjad
Joined: 09 Mar 2004 Posts: 52 Location: Greater Manchester - UK
|
Do not jump yet! |
Posted: Thu Apr 15, 2004 2:20 am |
|
|
I think that you need to know that when a PIC is in sleep mode
The timers will not be counting (As stated in the microchip datasheet)
IF the timer does not count then THE TIMER will never overflow!!!
-----------------------------------------------------------------------
Best Regards _________________ Best Regards |
|
|
Ttelmah Guest
|
Re: Do not jump yet! |
Posted: Thu Apr 15, 2004 2:25 am |
|
|
asjad wrote: | I think that you need to know that when a PIC is in sleep mode
The timers will not be counting (As stated in the microchip datasheet)
IF the timer does not count then THE TIMER will never overflow!!!
-----------------------------------------------------------------------
Best Regards |
To do what is wanted, the poster needs to add a second crystal. Attach this to Timer1, and set Timer1 to 'oscillator' mode. Timer 1 _will_ run when the chip is asleep, _but only if it is being clocked by an external source (in asynchronous mode), or using it's own oscillator_....
Reading the chips data sheet, is vital.
Best Wishes |
|
|
arif Guest
|
sleep |
Posted: Thu Apr 15, 2004 1:44 pm |
|
|
#include <12f675.h>
#device adc=10
#use delay(clock=4000000)
#fuses intrc_io,WDT,NOPROTECT,NOMCLR,NOBROWNOUT
#define vericiled pin_a5
#define alarmled pin_a4
main()
{
long int offset,olcum;
int i=0,olc;
setup_counters(RTCC_INTERNAL,WDT_2304MS);
setup_timer_1(T1_DISABLED);
while(1)
{
sleep();
output_high(alarmled);
delay_ms(1);
output_low(alarmled);
}
}
i used this code. this will sleep and wake up every 2304 ms.
i tried this for 12F675 and i hope it will work for 12Fxx too. |
|
|
Ttelmah Guest
|
Re: sleep |
Posted: Thu Apr 15, 2004 2:41 pm |
|
|
arif wrote: | #include <12f675.h>
#device adc=10
#use delay(clock=4000000)
#fuses intrc_io,WDT,NOPROTECT,NOMCLR,NOBROWNOUT
#define vericiled pin_a5
#define alarmled pin_a4
main()
{
long int offset,olcum;
int i=0,olc;
setup_counters(RTCC_INTERNAL,WDT_2304MS);
setup_timer_1(T1_DISABLED);
while(1)
{
sleep();
output_high(alarmled);
delay_ms(1);
output_low(alarmled);
}
}
i used this code. this will sleep and wake up every 2304 ms.
i tried this for 12F675 and i hope it will work for 12Fxx too. |
This only wakes up at very approximate intervals. It is great if you don't want accuracy, but not if you want things to be done at exact times. The variation in time for the watchdog timeout, depending on voltage, chip example, and temperature, can be massive (I have seen the 'nominal' 18mSec watchdog, timeout at around 8mSec...).
Best Wishes |
|
|
dazlogan
Joined: 19 Oct 2003 Posts: 24 Location: Cambridge, UK
|
Oh dear |
Posted: Thu Apr 15, 2004 2:52 pm |
|
|
Hi,
Thanks for watchdog trick, but as the poster above says, it is inaccurate and I do need a certain amount of accuracy.
The PIC needs to count up to 6 months (183 days) - the tolerance on this is plus/minus 5 days.
So the only way I can wake up on timer 1 interrupt is by applying a second crystal - is that right?
So I guess in this situation, I could use the internal 4MHz clock for normal running mode but power timer 1 from the 32KHz watch crystal?
EEeek!, that means high currents (mA or so in normal running mode) which I want to avoid, as I'm using a 3V CR2032 coin cell to power the PIC which must stay alive for at least 9 months.
Regards,
Darren |
|
|
Neutone
Joined: 08 Sep 2003 Posts: 839 Location: Houston
|
Re: Oh dear |
Posted: Thu Apr 15, 2004 4:05 pm |
|
|
dazlogan wrote: | Hi,
Thanks for watchdog trick, but as the poster above says, it is inaccurate and I do need a certain amount of accuracy.
The PIC needs to count up to 6 months (183 days) - the tolerance on this is plus/minus 5 days.
So the only way I can wake up on timer 1 interrupt is by applying a second crystal - is that right?
So I guess in this situation, I could use the internal 4MHz clock for normal running mode but power timer 1 from the 32KHz watch crystal?
EEeek!, that means high currents (mA or so in normal running mode) which I want to avoid, as I'm using a 3V CR2032 coin cell to power the PIC which must stay alive for at least 9 months.
Regards,
Darren |
The oscillator running at 32K has a typical supply current of 18uA with a 3V supply. At that level you can run for a long time. You don't need a sleep mode at all. Just don't power any external circuits unless they are in use. |
|
|
dazlogan
Joined: 19 Oct 2003 Posts: 24 Location: Cambridge, UK
|
190uA!? |
Posted: Tue Apr 20, 2004 6:09 pm |
|
|
Hi,
Sorry to drag this thread up again.
I've got the 12F629 being driven by a 32kHz crystal. With only the PIC attached to a 3V, I am finding a current draw of about 190uA.
(I know the PIC is running correctly i've had a LED flashing just to prove the thing is ok)
Any ideas why im getting such a high current draw?
Code: |
#include <12F629.h>
#use delay(clock=32768)
#fuses LP,BROWNOUT,WDT,PUT
//#fuses XT,BROWNOUT,NOWDT,PUT
#define PIN_LED PIN_A0
#define PIN_RESET PIN_A1
// Main function
void main() {
int NumMins,i,j;
long NumHours;
boolean FirstPower=TRUE;
#byte CMCON=0x19
setup_counters(RTCC_INTERNAL,WDT_2304MS);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_vref(VREF_LOW|6);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_COMP);
enable_interrupts(global);
// other basic code...
|
Cheers
Darren |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Apr 20, 2004 6:25 pm |
|
|
Quote: | I've got the 12F629 being driven by a 32kHz crystal. With only the PIC attached to a 3V, I am finding a current draw of about 190uA.
Any ideas why im getting such a high current draw? |
I know you don't want to hear this, but go to Microchip's website
and download the data sheet for the 12F629, here:
http://www.microchip.com/1010/pline/picmicro/category/embctrl/8kbytes/devices/12f629/index.htm
Then look at the appropriate chart in Section 12. Find the chart
the shows the current used for your particular oscillator mode,
and also find a chart for the various perpherals that you have
turned on. (ie., WDT, Brownout, etc.) Just add up the currents. |
|
|
dazlogan
Joined: 19 Oct 2003 Posts: 24 Location: Cambridge, UK
|
8-) |
Posted: Wed Apr 21, 2004 1:15 am |
|
|
Hi,
Errrr, do I detect a hint of sarcasm? (yes, of course I do)
The reasons I post such questions are:
a/ I've found that 10-15% of the time, problems are due to bugs in the compiler and i'd rather tap into members of this message boards vast and helpful experience rather than waste weeks of time trying to find the problem
b/ Sometimes I have a hunch at what the problem is, and it is reassuring to hear others from this board confirm my thoughts
c/ I would like to think that the use of this board, speeds up development time
There are often many things to be taken into consideration when using PICs for special projects. I've always used PICs at 4.0MHz without a care for current consumption but this time current is critical, and there are new areas to explore.
Apart from that, thanks for your reply.
Regards,
Darren |
|
|
Ttelmah Guest
|
Re: 8-) |
Posted: Wed Apr 21, 2004 2:35 am |
|
|
dazlogan wrote: | Hi,
Errrr, do I detect a hint of sarcasm? (yes, of course I do)
The reasons I post such questions are:
a/ I've found that 10-15% of the time, problems are due to bugs in the compiler and i'd rather tap into members of this message boards vast and helpful experience rather than waste weeks of time trying to find the problem
b/ Sometimes I have a hunch at what the problem is, and it is reassuring to hear others from this board confirm my thoughts
c/ I would like to think that the use of this board, speeds up development time
There are often many things to be taken into consideration when using PICs for special projects. I've always used PICs at 4.0MHz without a care for current consumption but this time current is critical, and there are new areas to explore.
Apart from that, thanks for your reply.
Regards,
Darren |
Using PICs at low current, does require a lot of 'thinking'. The critical things are to ensure that no inputs are allowed to float, and no outputs are 'driving'. Either of these, makes a huge difference to the consumption of the chip. Other things that make large effects (wouldn't apply off a 3v battery), are voltage regulators (many normal types draw several mA themselvs). Also when running at low speeds, remember that pull-up/pull down resistors can also scale with frequency. So a line that needs a 4K7 resistor, to make it settle quickly on a part running at 4MHz, can work with a 100K or more resistor at 32KHz. The watchdog draws an extra amount of current, but this can be worthwhile for reliability. The 'brownout' detector, also uses a suprising amount of current (disable this on such an application).
Remember if using an external oscillator, that these will typically draw more power than the PIC. They have fairly powerful 'drive' outputs, and unfortunately, these require a significant current. Special ultra low power designs are available. Try:
http://www.euroquartz.co.uk/oscillators-lowpower.htm
You might want to consider something like a DS1307 real-time clock chip. This is specifically designed to draw little power. Then sleep the PIC with the watchdog, and when it wakes, read the 'real' time from this chip. Also don't be afraid of the PIC drawing mA's when 'awake'. If you do things right, the PIC can sleep for (say) 2 seconds, and wake for just 50-60uSec, drawing perhaps 5uA when asleep, and 200uA when awake (and driving the I2C bus). With the consumption of the RTC chip (0.5uA typically), the whole unit then averages a consumption of under 6uA.
Your high consumption 'on test', suggests you have something 'missed', like a floating input, and (of course), the fact that it is driving an LED...
Best Wishes |
|
|
Pete Smith
Joined: 17 Sep 2003 Posts: 55 Location: Chester, UK
|
Re: 8-) |
Posted: Wed Apr 21, 2004 7:22 am |
|
|
Ttelmah wrote: |
You might want to consider something like a DS1307 real-time clock chip. This is specifically designed to draw little power. Then sleep the PIC with the watchdog, and when it wakes, read the 'real' time from this chip. Also don't be afraid of the PIC drawing mA's when 'awake'. |
You could also try hooking the "Test" output of this RTC (when in 1Hz output mode) to a wakeup on change/interrupt pin.
This way, you don't need to use the WDT at all (which IME is quite power hungry).
You could also try a PCF8583 (IIRC), which has a programmable alarm output. You could set it to interrupt you 30sec in the future, and just shut everything down.
If power is an important factor, you'll have to consider the RTC read/Alarm set time when accessing the I2C bus, and weigh up the pros & cons of the power used to write and power used to sleep/wake.
HTH
Pete. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Apr 21, 2004 11:45 am |
|
|
Quote: | Errrr, do I detect a hint of sarcasm? |
Actually it was mild exasperation. I know I shouldn't do it,
but sometimes I just give in to it.
But truly, the current data sheet (Rev. C) for the 12F629/12F675
is a lot better in the Electrical section than the typical Microchip
data sheet. The typical data sheet has "TBD" or "Preliminary"
plastered all over the charts. The Rev. C data sheet has very
detailed charts for power consumption. For example, Tables
12-3 and 12-4 show the following values for 3.0v operation:
LP MODE: 18 ua
WDT: 1.8 ua
BOD: 58 ua
T1OSC: 4.6 ua
CVREF: 85 ua
COMP: 6.1
--------------
Total 173.5 ua
That list above explains most of the current draw that you're seeing.
There may be other peripherals that you have turned on, that I'm not
aware of. Also, the values given above are from the "Typical" column
in the chart. It also gives "Maximum" values, so one or more of the
numbers above could actually be higher. Then it would explain the
entire 190 ua that you're seeing.
This is why I was mildly bugging you to look at the data sheet.
It's because the answer is there. |
|
|
Neutone
Joined: 08 Sep 2003 Posts: 839 Location: Houston
|
|
Posted: Wed Apr 21, 2004 1:07 pm |
|
|
You might try turning the refrence on and off as needed it can be configured on the fly. Same for the comparitor. Brownout is not going to help you. |
|
|
dazza Guest
|
thanks |
Posted: Fri Apr 23, 2004 1:08 am |
|
|
Hi,
Thanks everyone.
PCM - yes it was because of all those features I had enabled. After disabling them, I'm down to about 30uA.
I do not have a regulator - instead im running directly off the CR2032 battery.
I shall have to put some sort of low-batt detection on here... I was going to use the on-chip comparator but that takes too much juice to be left on permanently.
So my next question is, can I turn the comparator on, do a batt. check and then turn it off again, say once every hour??? or does it need to be left on permanently?
Im thinking that a low batt. condition is when the voltage is 2.1V or less. If 2.1V, simply go to sleep.
Is there an on-chip voltage reference which will still be reliable at 2.1V?
Or do you think it's better to have an external ref. / op-amp configuration to detect low batt. at these low voltage levels?
Regards,
Darren |
|
|
|
|
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
|