PICのConfigビットの「逆論理」な奴
2014-12-07
PIC工作には抵抗は無くなったものの相変わらずたま~にしか触らないため、その都度開発環境がバージョンアップします。するとその間に操作方法が変わっていたり・・・というか、忘れてしまっていることが多くて嫌になります。まぁ、そもそも上等でない脳みそが時間と共に劣化しているわけですから、何かしらで補わないとねぇ
これまで何度か同じ場面に遭遇し、覚え書きしておかなくちゃ
と思っていたPICのConfig ビットに纏わる「落とし穴」についてまとめておこうと思います。以前にMCLRがアサインされるポートのConfig 設定がおかしいとして書いた記事がありますが、これって全然舌っ足らずな情報なんですね、実は。そこで、その後もう少しきちんと調べた結果を備忘録として残しておこうというのがこの記事の主旨です。
XC8のConfig表現は独特ですが、自分は以下のように使っています。

pragmaで一つひとつ設定しているのが判ると思いますが、ここで「CLKOUTEN」に着目して下さい。ソース内の定義は「ON」であるにも関わらず、コンパイル結果では「OFF」・・・これって一体
・・・答えはデータシートにあります。

実はConfig ビットの各ビット値については、ハード論理とリンクするようにハイ・ローが逆の定義のものがあります。シンボル名にオーバラインがあるものがそれで、CLKOUTENにも実はオーバラインが付いています。すると、ソースで定義した「ON」は逆論理・・・実際の設定値としては「OFF」、即ち「0」になります。IDEの方ではそれをきちんと表現しているんですが、実際の意味合いとしてはデータシート上の値が設定値・・・つまり逆になります。
上記のソース内では「CLKOUTは使いたくないから1に設定しよう」という意図で「ON」(=1)にしています。データシート上、この値では「1 = CLKOUT function is disabled. I/O function on the CLKOUT pin.」となりますから問題なし。ところが、何かの拍子にIDEのConfig ビットを見てしまうと「OFF」となっていて混乱するわけです。
この件はIDEのマニュアルのどこかに書いてありそうですが、流石に探す気になれず・・・まぁ、そんなに頻繁に見る場所でもないですから普通は意識しなくてもいいんですが、「ちょっとEEPROMを・・・」といった場合(bit 8)にも気をつけないと、思わぬ動きに翻弄されかねませんね。

これまで何度か同じ場面に遭遇し、覚え書きしておかなくちゃ

XC8のConfig表現は独特ですが、自分は以下のように使っています。

pragmaで一つひとつ設定しているのが判ると思いますが、ここで「CLKOUTEN」に着目して下さい。ソース内の定義は「ON」であるにも関わらず、コンパイル結果では「OFF」・・・これって一体


実はConfig ビットの各ビット値については、ハード論理とリンクするようにハイ・ローが逆の定義のものがあります。シンボル名にオーバラインがあるものがそれで、CLKOUTENにも実はオーバラインが付いています。すると、ソースで定義した「ON」は逆論理・・・実際の設定値としては「OFF」、即ち「0」になります。IDEの方ではそれをきちんと表現しているんですが、実際の意味合いとしてはデータシート上の値が設定値・・・つまり逆になります。
上記のソース内では「CLKOUTは使いたくないから1に設定しよう」という意図で「ON」(=1)にしています。データシート上、この値では「1 = CLKOUT function is disabled. I/O function on the CLKOUT pin.」となりますから問題なし。ところが、何かの拍子にIDEのConfig ビットを見てしまうと「OFF」となっていて混乱するわけです。
この件はIDEのマニュアルのどこかに書いてありそうですが、流石に探す気になれず・・・まぁ、そんなに頻繁に見る場所でもないですから普通は意識しなくてもいいんですが、「ちょっとEEPROMを・・・」といった場合(bit 8)にも気をつけないと、思わぬ動きに翻弄されかねませんね。
- 関連記事
-
- PICのコンパイル環境刷新!
- PIC焼きと4倍速・・・
- PICのConfigビットの「逆論理」な奴
- PIC16Fシリーズのタイマ0の動作
- LCDライブラリを整える
コメントの投稿
寒すぎて^^;
こんにちは!
PICのconfigulation文(#pragma)は型番ごとに微妙に違うので悩みますよね。とくにBORNやFOSCとか。
最近XC8コンパイラのdocに各型番の設定手順を記述したhtml文を見つけたのでそれを利用しています。たとえば、16F1823ならプログラムフォルダ内の/Microchip/xc8/v1.21/docs/chips/16f1823.htmlを開くと各設定項目とその効果が書かれているので、データシートと合わせて#pragma文を書いています。
ところで、CLKOUTはdoc内のhtmlをみてもONはenable、OFFはdisableとなっていますが、これはFOSCの設定によっては#pragma文の中でONにしても無視されてしまうからではないかと考えているのですが...
いずれにせよややこしいのは変わりませんよね^^;
PICのconfigulation文(#pragma)は型番ごとに微妙に違うので悩みますよね。とくにBORNやFOSCとか。
最近XC8コンパイラのdocに各型番の設定手順を記述したhtml文を見つけたのでそれを利用しています。たとえば、16F1823ならプログラムフォルダ内の/Microchip/xc8/v1.21/docs/chips/16f1823.htmlを開くと各設定項目とその効果が書かれているので、データシートと合わせて#pragma文を書いています。
ところで、CLKOUTはdoc内のhtmlをみてもONはenable、OFFはdisableとなっていますが、これはFOSCの設定によっては#pragma文の中でONにしても無視されてしまうからではないかと考えているのですが...
いずれにせよややこしいのは変わりませんよね^^;
ハンダゴテを持つ手も悴んだり・・・
ぶんきゅうさん、こんにちは。
ご指摘の通り、CLKOUTENについてはFosc絡みで無効になる場合があり、さらに難解さを増しています。「マニュアルをよく読め!」と「もっと分かり易くせい!」というのがせめぎ合いますね。
また、Configのhtmlは自分も使っていますが、これも在処が分かり難い・・・まぁ、タダだから文句言うのもねぇ(^^;
今、floatの扱いでプログラムエリアが逼迫し、新たなPICを仕入れようか迷ってます。PIC16FシリーズでもCだと「デカいメモリ空間」が必要なんで、手持ちの消化を進める筈が「不良在庫」になってしまい弱ってます。
ご指摘の通り、CLKOUTENについてはFosc絡みで無効になる場合があり、さらに難解さを増しています。「マニュアルをよく読め!」と「もっと分かり易くせい!」というのがせめぎ合いますね。
また、Configのhtmlは自分も使っていますが、これも在処が分かり難い・・・まぁ、タダだから文句言うのもねぇ(^^;
今、floatの扱いでプログラムエリアが逼迫し、新たなPICを仕入れようか迷ってます。PIC16FシリーズでもCだと「デカいメモリ空間」が必要なんで、手持ちの消化を進める筈が「不良在庫」になってしまい弱ってます。