PIC16F1823でLCD(SC1602BS-B)の表示ができるようになり、温度センサー(LM61BIZ)からの電圧値をAD変換で読み込めるようになり、さて、タイマー割り込みで一定時間毎に計測するようにしようとしたら、トラブルが発生した。
AD変換の値がFVRで設定した電圧になったきりで一向に温度変化を反映しなくなってしまったのだ。
あれこれ調べた結果、どうもREGISTERの設定がおかしいのではないかと思いはじめた。
というより、良く分からないから適当に設定しておいた部分がREGISTERの値に多々存在する(おいおい)ので、どうみてもこれがまずあやしい。
で、おかしくなる前後を比べるとこんな感じだ。
詳しい人が見れば、「そりゃだめだぜあんた。」と即答なんだろうけど、私にゃ一向に分からない。
要するに、タイマーでの割り込みをしようってんで新たに追加で設定した部分が怪しいわけで、その部分は、
INTCON = %10100000
OPTION_REG = %00000111
PIE1 = %00000000
PIE2 = %00000000
の4つだ。
まず、INTCONだが、どの値も確信は無いけれども現時点ではまあこの設定でいいんじゃないかなという設定値にはなっている。
次に、OPTION_REGだが、WPUEN<7>とINTEDG<6>とTMR0SE<4>は、良く分からんから0で、って感じで設定してしまっているので、ここは次のようにもとの行をコメントアウトして、わからんとこは避けて、わかるとこだけ個別に設定するように直してみた。
‘OPTION_REG = %00000111
OPTION_REG.5 = 0
OPTION_REG.3 = 0
OPTION_REG.2 = 1
OPTION_REG.1 = 1
OPTION_REG.0 = 1
すると、なんと、温度変化に応じて電圧がちゃんと変化するようになったのだった。
さあ、どれが犯人かな?
ここまで来て、やっとまじめに1つ1つの意味をデータ・シートで確認する決心をして、あらためてデータ・シートを見ると、
WPUEN: Weak Pull-up Enable bit
1 = All weak pull-ups are disabled (except MCLR, if it is enabled)
0 = Weak pull-ups are enabled by individual WPUx latch values
と書いてある。
このWPUENを0に設定していたので、WPUxの値に応じてピンが内部でプルアップされておかしなことになった、と考えると、測定値が一定の値から動かなくなったのも理解できる。
WPUx自体の設定には触っていないので、これが実際に初期値でプルアップするようになっているのかどうかは未確認だが、その元締め的なWPUENは初期値ではプルアップしない設定で、私が勝手に0にしてプルアップする設定にしてしまったんだと思う。
さて、そんなこんなで分かったこと。
初期設定に注意しろ。
ちなみに初期設定はたぶんこういう表の上のところに書いてあるやつなんだと思う。
R/W-0/0 R/W-0/0 R/W-1/1 R/W-1/1 R/W-1/1 U-0 R/W-0/0 R/W-0/0
ってやつ。
下にLegendとして-n/n = Value at POR and BOR/Value at all other Resetsってちゃんと書いてあって、この-n/nのところが初期設定なんだろうとすぐにわかりそうなもんだが、POR とか BOR とかが「ん?」ってなって、それをちゃんと確認せずに中途半端で放置するものだから、せっかくの凡例が意味を成さなくなってた。
これのこと。
上の例では、
0111 = 500 kHz MF (default upon Reset)
となってて、
R/W-0/0 R/W-1/1 R/W-1/1 R/W-1/1
となっているから、この-n/nが初期値をあらわしているのは確かだろう。
以後、気をつけるようにしよう。
ちなみに、今回事の発端となったWPUENの初期値は1でDisabledだったのに、TMR0導入で設定したときにわざわざ0にしちゃってたってわけ。
WPUENはWPUAとセットで機能するわけだが、WPUAは初期値ではEnabledになってるから、何にもしなくてもWPUENを間違えただけでプルアップになっちゃう。
LCDも外して、回路自体はこんなに単純。