日別アーカイブ: 2015年1月10日

PICのBrown-Out Reset (BOR)

PICには供給電圧を監視して、PICが正常に動けそうに無いほどに電圧が低下してたら自立的にリセットを行うBOR(Broun Out Reset)なる機能がある。PIC18F2550の場合、監視電圧の閾値がCONFIGで設定可能で

BORV=0 4.59V
BORV=1 4.33V
BORV=2 2.79V
BORV=3 2.05V

となっている。一定時間この電圧を下回るとPICは自分自身をリセットする。

普通に電源ONでPICが起動したのか(POR, Power-On Reset)、起動後のBORで再起動から立ち上がってきたのかが判断出来るように専用のステータスレジスタが用意されている。それがRCONレジスタ。このレジスタの最下位BITがBORステータスビットとなっている。

が、ここに大きな落とし穴。

RCONレジスタのBORステータスビットは「Power-On ResetまたはBrown-Out Resetによって常に0にクリアされます」と書かれている。なんじゃそりゃ。それじゃBOR発生の判断に使えないじゃん!

まあ、実は正解もちゃんとドキュメントに記載されてるんだけど。正しくBOR発生を検出する為にはPORステータスビットと一緒に判定する必要がある。手順は次のとおり。

  1. RCONレジスタのBORが0でPORが1ならBORが発生したと判断する
  2. 1の判断の後に、プログラムでRCONレジスタのBORとPORを1に初期化する

RCONレジスタのBORステータスビットはBOR発生時もPOR時も0にクリアされる。一方で、同RCONレジスタのPORステータスビットはPOR時は0にクリアされるもののBOR発生時は値が変化しない。よって両方を同時にチェックすることで初めてBOR発生を判断出来る。