こんにちは、ENGかぴです。
PICマイコンなどソフト開発していると何らかの要因でマイコンがリセットし調査が必要になることがあります。リセット要因の特定の一例としてPIC16F1827のブラウンアウト・ソフトウェア及びWDTエラーによるリセットの動作確認を行いました。
LCDはAQM1602XA-RN-GBW(秋月電子)を使用しています。PIC16F1827で動作確認したことについてリンクをまとめています。
PICマイコン(PIC16F1827)で実現できる機能と解説リンクまとめ
PIC16F1827のリセット
PIC16F1827の設定はMCCを使っています。MCCの使い方については下記記事にまとめています。
MPLAB Code Configurator(MCC)の追加と使い方
今回はMCCを使用してSystem Module・TMR0・MSSP1の設定を行っています。LCDの動作は下記記事を流用しています。
PICマイコン(PIC16F1827)のI2C通信を実装する
System Moduleの設定
最初に共通事項であるSystem Moduleの設定を行います。MPLAB X IDEを起動しMCCのアイコンをクリックしてMCCを有効にします。

内部クロックを使用するためINTOSCを選択しています。クロック周波数は任意でもよいですが4MHz_HFを選択しています。クロックを高速にするほど消費電流が増えてしまいます。

WDTの設定を行います。WDTが動作するタイミングは任意でよいですが4秒程度にしています。4秒CLRWDT()によってWDTがリフレッシュされなかった場合はWDTが動作してソフトウェアリセットがかかります。
WDTのモードが4種類ありますがWDTの動作を常にONしたいためWDT_enabledを選択しています。WDT_enabledを選択するとSWDTENビットの設定は無効になります。

ブラウンアウトリセットを使用するためCONFIG1のBORENビットでBrown-out Reset enabledを選択しています。電源立ち上げ時に遅延を持たせるためPWRTEビットをPWRT enabledを選択しています。WDTを使用するためWDTEビットをWDT enabledを選択しています。
ブラウンアウトリセットのリセット条件を2.5Vにするためhigh trip point selectedを選択しています。MCLRを使用するためMCLREをMCLR/VPP pin function is MCLRを選択しています。
PR:RUNTEQ(ランテック )- マイベスト3年連続1位を獲得した実績を持つWebエンジニア養成プログラミングスクール
リセットのコールドスタートとホットスタートの意味

電源をONしてマイコンの動作がスタートした場合はマイコンが動作したばかりなので熱を持っていないためコールドスタートと表現しています。
電源をONしている状態でマイコンがリスタートした場合はマイコンが動作していた状態なので熱を持っているためホットスタートと表現しています。
マイコンがユーザーが予期していない状態でリセット状態になると致命的な動作不良につながることから意図したリスタートでない限りリスタートの要因を調査する必要があります。
PICマイコンではリスタートしたときにリセット要因を特定する目安としてSTATUSレジスタやPCONレジスタを確認してリセット時の状況を確認することができます。
if( PCONbits.nBOR == 0 && PCONbits.nPOR == 0 ){
PCONbits.nPOR = 1; //パワーオンリセットをクリア(発生すると0)
PCONbits.nBOR = 1; //ブラウンアウトリセットをセット(発生すると0)
PCONbits.nRMCLR = 1; //MCLRクリア(発生すると0)
}
else{ //ホットスタート
if( PCONbits.nBOR == 0){
starttyp.bits.bor = 1; //ブラウンアウトリセットでリセット
PCONbits.nBOR = 1; //ブラウンアウトリセットをセット(発生すると0)
}
if( PCONbits.nPOR == 0 ){
starttyp.bits.por = 1;
PCONbits.nPOR = 1; //パワーオンリセットをクリア(発生すると0)
}
if( PCONbits.nRI == 0){
starttyp.bits.ri = 1;
PCONbits.nRI = 1;
}
if( PCONbits.nRMCLR == 0){
starttyp.bits.rmclr = 1;
PCONbits.nRMCLR = 1;
}
if( PCONbits.STKOVF == 1 ){ //スタックオーバー
starttyp.bits.so = 1;
PCONbits.STKOVF = 0;
}
if( PCONbits.STKUNF == 1 ){ //スタックアンダーフロー
starttyp.bits.su = 1;
PCONbits.STKUNF = 0;
}
starttyp.bits.hot = 1; //ホットスタートしたことをセット
}
電源をONしたときはPCONレジスタの/BORおよび/PORビットは0になります。BORとPORを使用する場合はユーザーで1をセットすることが必要なのでコールドスタート時に1をセットします。
PCONレジスタ以外のSTATUSレジスタで確認するビットは/TOと/PDになりますが/PDはスリーブを使用しないため/PDは変化しないため集約してビットを立てて確認しています。
【クリエイターズファクトリー】卒業がない!挫折する心配なし!Webスクール説明会申し込み
リセットの動作を確認する
リセットの要因のうちWDTによるリセット・RESET()によるリセット・ブラウンアウトリセット・/MCLRピンによるリセット動作を確認します。リセット要因は下記の構造体で対象のビットを立てて発生したことを確認します。
typedef union{
uint8_t byte;
struct{
uint8_t dmy :1; //LSB
uint8_t hot :1;
uint8_t so :1;
uint8_t su :1;
uint8_t rmclr :1;
uint8_t ri :1;
uint8_t bor :1;
uint8_t por :1; //MSB
}bits;
}START_TYP;
動作確認用の回路図

SW1を押すとWDTCLR()がコールされないようになり4秒程度経過するとWDTが働いてリセットがかかるようにします。SW2を2秒間押し続けるとRESET()をコールしてソフトウェアリセットがかかるようにします。
/MCLRの確認はVDDに接続している配線をGND(DC5Vのマイナス側)に接続するとリセットがかかります。VR1の可変抵抗で電圧を減圧していくとPICマイコンの電源が低下していきブラウンアウトリセットがかかります。MCCのピン設定は以下の通りです。

PB2/PB3はINPUTでウィークプルアップ(WPU)設定しています。WPUを有効にするためにはRegistersのnWPUENをenabledにする必要があります。
Easy SetupでWPUにチェックするのみでは有効にならないので注意が必要です。Notificationsにワーニングで通知されます。
WDT及びRESET()によるリセット
if( DiData[1].di == 1){
CLRWDT(); //WDTをリフレッシュ
}
if( timreswait == TIME_UP){
timreswait = TIME_OFF;
RESET(); //ソフトウェアリセット
}
SW1を押すとDiData[1].diが0になるためCLRWDT()がコールされなくなりWDTがリフレッシュされない期間が経過するとリセット条件となりリスタートします。SW2を長押しして2秒経過するとRESET()によってソフトウェアリセットがかかります。

SW1を長押するとWDTによるリセットがかかりHOTスタートになります。その後SW2を長押しするとRESET()関数がコールされHOTスタートとなりますが、PCONレジスタの/RIビットがセットされているためRESET()によるリスタートであることが分かります。
LCDの一段目のSTART TYPEの値は34(10進数)であり、2進数に置き換えてSTART_TYP構造体を確認するとhotビットとriビットが立っていることが分かります。
PR:アクセンチュアの転職なら【コンサルアクシスコンサルティング】
/MCLRピンの確認
/MCLRピンはLアクティブなのでMCLRピンがLの時はマイコンにリセット状態になります。マイコンを動作させるためにはMCLRピンをHにする必要があります。/MCLRピンがHとなりリセットが解除されプログラムが動作します。

電源が切断されていないリセットになるためホットスタートとなりPCONレジスタの/RMCLRビットが0になっているためMCLRピンによるリセットであることが分かります。
LCDの一段目のSTART TYPEの値は18(10進数)であり、2進数に置き換えてSTART_TYP構造体を確認するとhotビットとrmclrビットが立っていることが分かります。
ブラウンアウトリセットの確認
ブラウンアウトリセットは電源電圧がブラウンアウトリセット電圧よりも低くなった時にマイコンのリセットをかけるものです。PIC16F1827のブラウンアウトリセット電圧は約2.5Vもしくは2.0Vになっています。
System設定で2.5Vにしているため電源が2.5V付近になるとブラウンアウトリセットがかかります。ブラウンアウトリセットの確認は電源に可変抵抗VR1で分圧した電圧を印加することで確認します。

電源がOFFしていないリセットになるためホットスタートとなりPCONレジスタの/BORビットが0になっているためブラウンアウトリセットであることが分かります。
START TYPE横の値は十進数で66であるため2進数に置き換えた時START_TYP構造体のhotビットとborビットが立っていることが分かります。
ブラウンアウトリセット電圧を使用すると数百uA消費電流が増えてしまいます。系統電源が取れる場合は消費電流の増加は気になりませんが、エナジーハーベストなどの微弱な電源である場合、数百uAの消費電流は大きなものになります。
外付けのリセットICを使用して/MCLRピンをコントロールすることで2.5V付近でリセットがかかる仕組みを検討したほうが良いこともあります。

例ではTPS3839G25(TI製)を使用していますが、低消費で150nA程度となるのでブラウンアウトリセットよりも低消費でリセットとなります。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
main.cをコピーすると使用できます。本ソースコードはMPLAB X IDEにMCCのプラグインをインストールしていることが前提となります。MCCをインストールする方法は下記記事を参考にしてください。
MPLAB Code Configurator(MCC)の追加と使い方
関連リンク
PICマイコンを使ってマイコンのレジスタの設定やMPLAB X IDEのプラグインであるMCCを使用して動作確認したことについてまとめています。
PICマイコン(PIC12F675)で実現できる機能と解説リンクまとめ
PICマイコン(PIC16F1827)で実現できる機能と解説リンクまとめ
PR:アクセンチュアの転職なら【コンサルアクシスコンサルティング】
最後まで、読んでいただきありがとうございました。
リセットICを使用すると部品とコストが増えてしまうため電源の容量がシビアでない限りはブラウンアウトリセットで十分です。