CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug Reports on this forum. Send them to support@ccsinfo.com

Problems waking PIC24FJ128GB204 from deep sleep

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
JamesW



Joined: 23 Apr 2007
Posts: 83
Location: Rochester, England

View user's profile Send private message Visit poster's website

Problems waking PIC24FJ128GB204 from deep sleep
PostPosted: Wed Feb 21, 2018 6:38 am     Reply with quote

Hi Guys,

I may be missing something here (at least I hope I am).

By my understanding I can put my processor into deep sleep, where it will only be woken by an event on INT_EXT.

When it does get woken, rather than returning to the point after the sleep() command like normal however, it does a normal "power on reboot".

I've been tinkering a bit with normal sleep, before I found out about deep sleep and use the following routine to put the device to sleep.

Code:

void Send_To_Sleep()
{
   /* TURN OFF THE ADC */
   setup_adc(ADC_OFF);
   
   /* TURN OFF BAND GAP VOLTAGE REFERENCE */
   VBGEN = FALSE;
   BGREQ = FALSE; 
   
   /* DISABLE THE UARTS */
   setup_uart(FALSE, DEBUG_PORT);
   setup_uart(FALSE, BLUETOOTH_PORT);
   
   /* TURN ALL I/O TO OUTPUTS AND TURN OFF */
   output_drive(LCD_D0);
   output_low(LCD_D0);
   output_drive(LCD_D1);
   output_low(LCD_D1);
   output_drive(LCD_D2);
   output_low(LCD_D2);
   output_drive(LCD_D3);
   output_low(LCD_D3);
   output_drive(LCD_D4);
   output_low(LCD_D4);
   output_drive(LCD_D5);
   output_low(LCD_D5);
   output_drive(LCD_D6);
   output_low(LCD_D6);
   output_drive(LCD_D7);
   output_low(LCD_D7);

   output_drive(LCD_EN);
   output_low(LCD_EN);
   output_drive(LCD_RESET);
   output_low(LCD_RESET);
   output_drive(LCD_CD);
   output_low(LCD_CD);
   output_drive(LCD_CS0);
   output_low(LCD_CS0);
   output_drive(LCD_RW);
   output_low(LCD_RW);
   
   /* BUZZER */
   output_drive(BUZZER);
   output_low(BUZZER);

   /* BLUETOOTH MODULE */
   output_drive(BLUETOOTH_RESET);
   output_low(BLUETOOTH_RESET);
   output_drive(BLUETOOTH_RTS);
   output_low(BLUETOOTH_RTS);
   output_drive(BLUETOOTH_SLEEP);
   output_low(BLUETOOTH_SLEEP);
   output_drive(BLUETOOTH_POWER);
   output_low(BLUETOOTH_POWER);
   output_drive(BLUETOOTH_CTS);
   output_low(BLUETOOTH_CTS);
   
   /* TURN OFF THE I2C PORT */   
   i2c_init(DRV_PRESSURE_I2C,0);
   
   /* BRING THE I2C PINS LOW */
   output_drive(DRV_PRESSURE_SCL);
   output_drive(DRV_PRESSURE_SDA);
   output_low(DRV_PRESSURE_SCL);
   output_low(DRV_PRESSURE_SDA);
   
   /* TURN OFF THE WATCHDOG */
   setup_wdt(WDT_OFF);

   /* TURN OFF THE SWITCHED 3.3V LINE */
   output_high(POWER_ENABLE);

   /* MAKE SURE THAT EVERY SOURCE OF WAKE IS CLEARED */
   Disable_And_Clear_All_IRQS();
   
   /* WAKE ON THE ENTER BUTTON ONLY */
   enable_interrupts(INT_EXT0);
   clear_interrupt(INT_EXT0);
}


This is followed by the sleep(DEEP_SLEEP) or sleep(SLEEP_FULL) command in another routine.

If I use SLEEP_FULL - try as I might, I can't get the standby current to any less than 980uA. What else do I need to disable/turn off to reduce this? (I do have USB enabled, but can't seen to find a command to turn this off during sleep).

Using SLEEP_FULL the processor wakes up, and carries on.

However I digress, the above just serves to illustrate that I can wake up.

If however I put the device into deep sleep, it goes to sleep - my current drops to under 10uA (this does include quiescent current of power supply etc).

When I press the wake button however - the current increases from 10uA to 713uA but absolutely nothing else happens - the device certainly doesn't reboot!

so in essence :
a) what am I doing wrong with deep sleep?
b) How can I reduce my current in FULL_SLEEP? (If I can bring this current down to something sensible - it will enable me to use both of the buttons on the device to wake me up, which would be preferable).

Thanks in advance


James
temtronic



Joined: 01 Jul 2010
Posts: 6215
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Feb 21, 2018 6:54 am     Reply with quote

Ok, now I don't use that PIC but...

generally speaking you need to place a NOP instruction AFTER the sleep command, well, that's been said here a few times...it might be applicable for your PIC.

sleep current consumption can be VDD related. What the spec says is based on VDD. I know some are Ultra Low Power but NOT at 5volts, rather 1.8V, so you have to read the 'specs' real careful.

have another look at the data sheet to see how to disable each peripheral. Maybe code in order of the datasheet chapters ? So you don't have to 2nd guess yourself...did I do this or not ??

other who use that PIC will chime in, just take awhile, we're all in different time zones !
Ttelmah



Joined: 11 Mar 2010
Posts: 13358

View user's profile Send private message

PostPosted: Wed Feb 21, 2018 7:06 am     Reply with quote

I think you are misunderstanding the sleep modes.

Look at table 10-2 in the data sheet.
If you are putting the chip into a full 'deep sleep', then the RAM is lost, and the wake-up will result in a POR.
You probably want to be using the Low voltage sleep mode, which is almost the same, but retains the regulator running to feed the RAM. Slightly more power used, but it can wake to the next instruction.
JamesW



Joined: 23 Apr 2007
Posts: 83
Location: Rochester, England

View user's profile Send private message Visit poster's website

PostPosted: Wed Feb 21, 2018 7:06 am     Reply with quote

Stuck a delay_cycles(1) after the sleep(DEEP_SLEEP) command and it made no difference - I still don't wake up, but the current increases.

The unit is running on 3.3V
JamesW



Joined: 23 Apr 2007
Posts: 83
Location: Rochester, England

View user's profile Send private message Visit poster's website

PostPosted: Wed Feb 21, 2018 7:42 am     Reply with quote

I'm not worried about the RAM contents, as on a power up reset everything is loaded from eeprom anyway.

I'm running on batteries, so the key thing here is that I take as little power as possible when I am "off".

As such deep sleep should be perfect.
temtronic



Joined: 01 Jul 2010
Posts: 6215
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Feb 21, 2018 8:10 am     Reply with quote

option ? use a higher capacity battery ??
I did this 'trick' 25 years ago when 10ma was 'low power'.....

While I understand the 'quest to reduce', consider your TIME vs a $1 upgrade in battery..

Jay
JamesW



Joined: 23 Apr 2007
Posts: 83
Location: Rochester, England

View user's profile Send private message Visit poster's website

PostPosted: Wed Feb 21, 2018 8:12 am     Reply with quote

Love to - but designing a new product for our client to fit inside a case for an existing product, which means that I'm stuck with a 9V PP3 battery.
JamesW



Joined: 23 Apr 2007
Posts: 83
Location: Rochester, England

View user's profile Send private message Visit poster's website

PostPosted: Wed Feb 21, 2018 8:19 am     Reply with quote

Back to deep sleep mode - I've also just added in the code, to check the state of the INT_EXT pin and then determine whether I need a H_TO_L or an L_TO_H wake and this makes no difference.

As mentioned - in deep sleep mode, the current does increase when I push the button - but the processor doesn't wake up. (And then you get stuck with a processor taking more power but unable to do anything).

According to the datasheet, on a wake the DSEN bit is automatically cleared.
Ttelmah



Joined: 11 Mar 2010
Posts: 13358

View user's profile Send private message

PostPosted: Wed Feb 21, 2018 9:52 am     Reply with quote

The 'nop' after the sleep will make no difference to waking. What it does is avoid a problem on normal sleep that can lead to the next instruction being corrupted. It is required by the PIC.

On your power, you do need to switch off the USB. The best way is to only wake it when the USB connection is made. usb_detach is the call to disable the USB. All you do it test the connection sense pin, and only attach when this is high (usb_attach).
jeremiah



Joined: 20 Jul 2010
Posts: 989

View user's profile Send private message

PostPosted: Thu Feb 22, 2018 9:38 pm     Reply with quote

As for your current in non deepsleep. I do a lot of low current applications with PIC24 chips. Some things to look out for:

PMD - Peripheral Module Disable - Use this to completely disable unused parts of your device before going to sleep. Be aware that doing this may reset some of the configuration SFR registers, so you may need to redo your setup routines after lifting the disable for some peripherals. UARTS come to mind here (I had to re-enable the TX buffer because using the PMD to disable the UART reset that bit to disabled).

Make sure all I/O are either driven or have appropriate pullups/pulldowns in the power down state.

Errata - Make sure you read your chips errata sheet. In the past I have been burned by extra power consumption because something doesn't fully cut off (like ADC for some chips) without a workaround.

We've used the PIC24F32KAxxx for sub micro amp current draw in sleep mode and the PIC24FJ64GA104 for single digit microamp current in sleep mode. It is possible if the chip supports it.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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