View previous topic :: View next topic |
Author |
Message |
Sam_40
Joined: 07 Jan 2015 Posts: 127
|
Questions about SLEEP();[SOLVED] |
Posted: Mon Nov 16, 2015 7:53 pm |
|
|
Hello Guys,
I am still working on my project. It is working fine, However after further analyses, I found out that the current during the sleep mode is not stable.
The Min is 2.67 uA
The average is 3.43 uA
The Max is 42.04 uA spikes every ~5 seconds. normal around 5.33uA
When everything is running the current is 19.89mA to 19.93mA
My processor is the 18F2685. It uses Timer 1 (with external 32768 crystal) to generate the 1 second, Timer 2 to manage the 8X 7 segments to display time. INT_RB to manage the push button.
All the common on the displays are managed by transistors connected to
C2, C3, C4, C5, C6, C7, B0 and B1 via 4K7
Port A manage the segments via 330 ohms resisters.
MCLR input pulled up via 10k and diode.
B2, B3, B4 and B5 inputs pulled up via 10k.
B6 and B7 floats but I set them as output and low.
I am using .1 uf decoupling capacitor and 47uf/35v bypass capacitor
I followed all microchip guide lines as far as the crystal circuit.
I am driving the processor with 5 v and it is stable.
This is my header and fuses
Code: | #include <18f2685.h>
#fuses INTRC_IO, NOWDT, NOBROWNOUT
#use fast_io(b)
|
and this is my main
Code: | void main()
{
/* Use the internal oscillator block which provides an
8 MHz clock (±2% accuracy) */
setup_oscillator(OSC_8MHZ);
/* Use Timer1 external oscillator which provides an
32768Hz clock */
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT);
RD16 = 0; // Modify T1CON setup to allow r/w of TMR1H
/* Use Timer2 to generate 1mS tick to manage the displays */
setup_timer_2(T2_DIV_BY_16,124,1);
set_timer1(0x8000); // This makes T1 interrupt in 1 second
clear_interrupt(INT_TIMER1);
clear_delta();
/* Use to manage the port B interrupt on pin 4 and 5 only as */
/* The example EX_PBUTT.C */
enable_interrupts(INT_RB);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
output_low(PIN_B6); /* Pin is floating and used for ICSP only! */
output_low(PIN_B7); /* Pin is floating and used for ICSP only! */
while(true)
{
if(dbutton4) {
++hour;
tosleep = 10;
if (hour == 24)
{
hour=0;
}
dbutton4=FALSE;
}
if(dbutton5) {
++minute;
tosleep = 10;
if (minute == 60)
{
minute=0;
}
dbutton5=FALSE;
}
if(tosleep == 0)
{
output_low(PIN_C2); /* Digit 1 comm */
output_low(PIN_C3); /* Digit 2 comm */
output_low(PIN_C4); /* Digit 3 comm */
output_low(PIN_C5); /* Digit 4 comm */
output_low(PIN_C6); /* Digit 5 comm */
output_low(PIN_C7); /* Digit 6 comm */
output_low(PIN_B0); /* Digit 7 comm */
output_low(PIN_B1); /* Digit 8 comm */
output_low(PIN_B6); /* Pin is floating and used for ICSP only! */
output_low(PIN_B7); /* Pin is floating and used for ICSP only! */
output_A(0x00); /* 7 Segments */
sleep();
delay_cycles(1);
}
}
}
|
I am using 60mHz oscilloscope and Fluke 189 to measure and monitor what is going on.
I want to note that I am using #use fast_io(b) for port b because I set the trisb to 0X3C to make the interrupt work as per the example.
Is my current reading normal or do I need to do something? I just want my Timer1 and the interrupt on port B and the global variables to keep updating and I want everything else to turn off. My understanding is SLEEP(); instruction will take care of that?
Thanks,
Last edited by Sam_40 on Sun Nov 22, 2015 10:04 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Questions about SLEEP(); |
Posted: Mon Nov 16, 2015 11:19 pm |
|
|
Sam_40 wrote: |
The Min is 2.67 uA
The average is 3.43 uA
The Max is 42.04 uA spikes every ~5 seconds. normal around 5.33uA
|
Based on this, we would be looking for something in your code that
happens every 5 seconds. But you didn't show the interrupt routines
or the #use delay() statement. A small complete test program, not code
snippets, would be the most help. |
|
|
Sam_40
Joined: 07 Jan 2015 Posts: 127
|
|
Posted: Tue Nov 17, 2015 8:08 am |
|
|
Good morning PCM,
I have nothing in my code that happen around when it spikes. I also have nothing that happen every 5 sec. I did not post the complete code because I believe it is against the forum rule as I am using part of the CCS examples code!
Basically what I have is:
Timer1: interrupt to advance sec, min, hr and to check if tosleep is greater than 0 then it would tosleep. I am using your code that you provided me in the past and I just added the sec++, min++, hr++ and if tosleep > 0 then tosleep--.
Timer2: Only handle the displays using a simple math of % and / to display the time when the PIC is running.
INT_RB: to handle the button press as per CCS example "ex_pbutt.c" the only thing that is different is I added the use fast IO as per manual.
I can post the complete code however my understanding it is against the forum. Or I can PM you the complete code only if it is OK with you. Do you see any problem with my main?
Thanks, |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 17, 2015 11:06 am |
|
|
My advice is to start stripping out sections of your code and see if you
continue to get the current spiking during sleep. Also remove pieces of
the hardware.
Eventually you may get it down to a program that consists of putting all
the pins in a low power state, and then executing a sleep statement, with
while(TRUE); at the end.
At that point, I would look at:
1. Changing the PIC.
2. Changing to a different PIC family.
3. Changing the power supply, board, etc.
4. Changing your ammeter to a different one.
Somewhere, there is something with a 5-second timer on it. It could be
an RC time constant in your meter, on the low microamp scale.
But by stripping down the program and the hardware, and changing it too,
you will eventually come up with an answer. |
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
|
Posted: Tue Nov 17, 2015 12:07 pm |
|
|
I would reduce the bulk capacitance then connect a resistor inline and scope the surge. Maybe the duration and type of the surge will tell you something. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9219 Location: Greensville,Ontario
|
|
Posted: Tue Nov 17, 2015 2:31 pm |
|
|
really we need to see a small program that has the same problem. That 'magical' 5 seconds is interesting.
It could be an analog comparator tripping due to it's input not being terminated. Maybe an ADC pin is 'confused'.
Without seeing the whole program or best a small, cut down one that has the problem we can only guess....
Jay |
|
|
Sam_40
Joined: 07 Jan 2015 Posts: 127
|
|
Posted: Tue Nov 17, 2015 4:12 pm |
|
|
Guys,
Thanks for the reply, I did what you guys advised. The problem I believe is when I am using the "#use fast_io(b)" and "set_tris_b( the hex value of IOs);". If I comment those 2, this is what I get:
Min 0.08uA
Avg 0.18 uA
Max 0.26uA
Using the MIN/MAX on the ammeter! study no spike with this test code:
Code: | #include <18f2685.h>
#fuses INTRC_IO, NOWDT, NOBROWNOUT
void main()
{
setup_oscillator(OSC_8MHZ);
while(true)
{
output_low(PIN_C0); /* TO TEST */
output_low(PIN_C1); /* TO TEST */
output_low(PIN_C2); /* Digit 1 comm */
output_low(PIN_C3); /* Digit 2 comm */
output_low(PIN_C4); /* Digit 3 comm */
output_low(PIN_C5); /* Digit 4 comm */
output_low(PIN_C6); /* Digit 5 comm */
output_low(PIN_C7); /* Digit 6 comm */
output_low(PIN_B0); /* Digit 7 comm */
output_low(PIN_B1); /* Digit 8 comm */
output_low(PIN_B6); /* Pin is floating and used for ICSP only! */
output_low(PIN_B7); /* Pin is floating and used for ICSP only! */
output_A(0x00); /* 7 Segments */
sleep();
delay_cycles(1);
}
} |
If I use "#use fast_io(b)" and "set_tris_b();" My reading will be higher and I see a spike every about 5 seconds. I may miss something in the datasheet? Do I have to manually disable other features that I am not using or do the compiler do it?
Same thing happen on a different processor with the same part number!
I think Jay is on the right track maybe when using the fast IO something else happen? That is over my head I may have to change the RB4-RB5 interrupt code to not use the fast IO and the set tris and see. However if you guys have more suggestions please let me know so I can try them.
Thanks, |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9219 Location: Greensville,Ontario
|
|
Posted: Tue Nov 17, 2015 6:26 pm |
|
|
OK silly question but do you have the programmer or an ICD unit attached to the PIC ? Or is it just the PIC,power supply and the measurement equipment?
Jay |
|
|
Sam_40
Joined: 07 Jan 2015 Posts: 127
|
|
Posted: Tue Nov 17, 2015 6:45 pm |
|
|
I am using PICKIT3, When it is connected it draw an additional about 5mA. I only take the measurements for the PIC, pull up resister(if any), capacitors(if any), the crystal on timer1(it only requires .1uW) I also have 220k "Serial Resistor" as recommended by this but for the timer 1 "http://ww1.microchip.com/downloads/en/AppNotes/91097A.pdf". I am taking the reading between the power supply and the above. I do not read the power that the PS draw.
Thanks, |
|
|
|