PIC24でdeep sleepモードの設定


PIC24には3つのモードがあり消費電力の管理が可能である。

  1. sleep
  2. idle
  3. deep sleep

ここでは消費電力が最も少ないdeep sleep modeの設定方法とそこから元のプログラムに戻す方法をメモしておく。

 

DEEP SLEEPへの移行

データシートによるとdeepsleepには以下のコードで入れる.


DSGPR0 =0x00;
DSGPR1 =0xFF;
DSCONbits.DSEN = 1;
asm("NOP");
asm("NOP");
asm("NOP");
asm("pwrsav #0");

deepsleepに入るとすべての変数は記憶されずRAMは一度電源がおとされるが、レジスタDSGPR0とDSGPR1はdeepsleepに入ったあとでも保存されており、起動後も値を読み取ることが可能。

asm(” —- “)はインラインアセンブラでアセンブリ言語を実行している。

この処理でdeepsleepモードに突入し、消費電力が省力化される。

消費電流は実測値では10uA程度であった。

 

DEEP SLEEPからのEXIT(RTCCを用いる場合)

deepsleepからの復帰はRTCCによるアラーム割り込み、外部入力割り込み、MTPRによるリセットで可能となるが今回はRTCCとMTPRniyoru

リセットを試した。

まずはrtccから,RTCCのセットとalarmのセットの方法は省力するが、割り込みを設定すると割り込み発生時にdeepsleepが終了され下記割り込み関数内の処理を実行する。


void __attribute__ ((interrupt, no_auto_psv)) _RTCCInterrupt(void)
{
if(RCONbits.DPSLP){
printf(";wake up from deepsleep!!!\r\n");
RCONbits.DPSLP = 0;
}
DSCONbits.RELEASE =0 ;
IFS3bits.RTCIF = 0;
int a = DSGPR0;
int b = DSGPR1;
printf("%d,%d",a,b);
}

実行結果


wake up from deepsleep!!!
0,255

DSGPRレジスタの値は保持されていることが確認できた。

また、この関数内の処理を実施すると再度

 

DEEPSLEEPからのEXIT(MTPR端子のリセットを用いる場合)

MTPRピンを使用すると簡単にdeepsleepから復帰することができる。

MTPRピンは通常highであり、これをlowに立ち下げるとdeepsleep復帰した。

このときプログラムはmain文の頭から再スタートするがDSGPRレジスタの値はキープされていた。

 

感想

10uAと思ったより消費電力が削減できなかった。

回路のプルアップ等が消費している可能性もあるので調べてみる。

The following two tabs change content below.
miyamoto
IoT/ DIY / music / 日本語ラップ
miyamoto

About miyamoto

IoT/ DIY / music / 日本語ラップ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Post Navigation