マイクロテクニカ製品サポートFAQ
[一覧] [1つ前に戻る] [マニュアル及び各種ダウンロードページへ]
IOピンが思うように制御できない
PICのピンは、1つのピンに複数の機能が割り当てられています。特に新しいデバイスでは搭載する機能が増える傾向にあり、1つのピンに割り当てられている機能が増えています。

そのためよくピンに割り当てられた設定を理解せずに使うと、ピンが意図しない動作をすることがあります。代表的な例はADコンバータです。ADコンバータにアナログ電圧入力ピンに割り当てられているピンは、電源投入時はすべてアナログ入力ピンになっています。そのため、プログラムの中でレジスタの設定を行わないでデジタルIOの制御(H-Lの制御)をしようとすると正しく動作しません。
TRISxレジスタも設定したのになぜ正しくプログラムが出力されないのか?と悩む方が多いようです。

アナログ入力の機能を持ったピンをデジタルIOピンとして使用したい場合には、プログラムの中でレジスタの設定を行いADコンバータをDisabled、すなわち無効に設定するか、デバイスによっては各ピン毎にデジタルIOかアナログ入力にするかを設定できるレジスタ(ANSELレジスタやANSELHレジスタ)がありますので、そこの設定を正しく設定する必要があります。この設定を行わないと正しく動作しません。

トラブルを避ける基本的な方法は、まずデータシートのピン配置図のあるページをご覧ください。

全ピンに名前があり(RA0やRB0,RB1...などのピン名)があり、その横に例えばAN0やAN1などピン名以外の名称が記載されているタイプです。この場合には、使用しようとしているピンに何の機能が割り当てられているかを把握しましょう。例えばPIC16F88のデータシート2ページを見てください。
http://ww1.microchip.com/downloads/en/devicedoc/30487c.pdf

例えば1ピンのRA2には "RA2/AN2/CVREF"と記載があります。このことからRA2は1つは"AN2"であるアナログ入力ピンとして機能があり、もう1つはコンパレータの基準電圧出力である"CVREF"の機能があることがわかります。すなわちRA2を使う場合、もしADコンバータを使わないならアナログ入力としての機能をデジタルIOピンとして使用できるよう設定しなくてはなりません。またコンパレータも使わないなら不用なトラブルを避けるためコンパレータに関わるピンもすべてデジタルIOピンとして設定しなければなりません。
このようにデータシートのピン配置図を見ればそのピンに関わるすべての機能がわかりますので、不要な物はすべてOFF、無効にすることから始めます。

その他、例えば一部のPICにはLow Voltage Programming(LVP)という機能があります。通常PICはHEXファイルを書き込む場合、Vppピン(MCLRと兼用)に12V程度の電圧を印加します。これでデバイスが書き込みモードに移行するわけですが、一部のPICではPGMピンの設定で書き込みモードに移行できるLVP機能があります。代表的なデバイスとしてPIC16F628Aなどがあります。この機能が付いているPICの場合、コンフィギュレーションビットの設定でLVPが有効になっていると、PGMに割り当てられたピン(例:PIC16F628の場合はRB4)は入力だけとなりデジタルIOとして使用できなくなります。デジタルIOとしてこのピンを使いたい場合にはコンフィギュレーションビットの設定でLVPを無効にしないとデジタルIOとして使えないことになります。データシートにはその旨書かれていますが、見落としがちです。ただ例えば上記のようにデータシートでピン配置図を見れば、ピン名の隣に "PGM"と書かれています。「PGMって何かな?」と思いデータシートを見れば、LVPのことが書かれており、その中には「While in this mode, the Rxx pin can no longer be used as a general purpose I/O pin.」と書かれています。そうすれば、「このピンはLVPに設定してしまうとGPIOとして使えないな」ということが分かります。

もう一つ、RA4に関するトラブルがあります。これもデータシートを見れば分かることですが、多くのデバイス(比較的古いタイプのデバイス)でRA4は出力のドライバがオープンドレインの構造になっています。オープンドレインになっているということは、出力として使う場合、「このピンから電流を吸い込むことで周辺デバイスを制御する」ということが分かります。
つまり、通常のIOとしてはそのまま使えないということです。接続したデバイスがプルアップされているなどの条件が必要です。デジタルIOとして電圧のH/Lとして使いたければ、とりあえず10kオーム程度の抵抗でプルアップすれば使えますが、仕様はよく確認しておく必要があります。

デバイスによっては、データシートのピン配置図の所にピン名は記載があるが、それ以外の機能が一切書かれていない場合があります。下記はPIC16F1939のデータシートです。5ページを見しみましょう。
http://ww1.microchip.com/downloads/en/DeviceDoc/41574B.pdf

ピン配置図がありますが、RA0やRA1といったピン名はありますが、それ以外ほとんど記載がありません。この場合には、各ピンに配置される機能は一覧表になっています。9ページに記載があります。この表を見ながら使用するピンにどんな機能が割り当てられているのかを確認しながらプログラムを作る必要があります。

なおデバイスによっては、ピンの機能をレジスタの設定でいくつかの候補から選択して配置できる機能もありますので、なおさら注意が必要です。APFCON0やAPFCON1といったレジスタがあるデバイスを使用する場合には、このレジスタでハードウエア機能に割り当てるピンをある程度自由に設定できるようになっているデバイスですので、ここの設定との兼ね合いも考慮する必要があります。

IOピンが思うように動作しない場合には必ずデータシートを参照してみてください。

1、まずはピン配置一覧でそのピンにどんな機能が割り当てられているのか確認する。
2、GPIO以外の機能が割り当てられている場合には、その機能がGPIOのH/Lを妨げていないかすべて確認する。
3、妨げている機能があればその機能を無効にしたり、レジスタの設定を確認する。



オリジナル - FAQみたいです - 猫でいいです