ちょっと先の未来クイズ第4問

PIC12F629をC言語でプログラミングしています。
GP2ピンをデジタル入力としてスイッチを接続しGP4をデジタル出力
としてLEDを接続し、スイッチを押すたびにLEDが点灯、消灯を繰り返す
ようにプログラミングしてみました。

ところがデジタル入力のピンをGP0,GP1に変更しピンにスイッチを
接続し入力しても同じように動作しません。回路に電源をいれた瞬間
LEDが点灯しスイッチを入力しても点灯したままです。

GP0,1をGP2と同様にデジタル入力として使いたいのですが、単にピンの
番号をプログラム中で変更するだけではダメなのでしょうか?
ご教授おねがいします。

A 回答 (1件)

はじめまして,


私も趣味でPICの魅力にはまっている一人です.
回路図もソースもわかりませんので,想像の範囲でお答えしますと,PIC12F629に内蔵されているコンパレータの初期化が行われていないのではないでしょうか.手持ちにあったPIC12F629/635のデータシートではP35~P37に説明があります.(先月マイクロチップ社のHPよりダウンロードしたものです)
P35に記載されている"6.0 COMPARATOR MODULE"内蔵コンパレータの制御はCMCON(19H)レジスタで行います.このレジスタのデフォルト値は00000000Bですので,CM2,CM1,CM0ともゼロクリアされています.CM0:CM2の意味はP37にありますが,オールゼロの意味は”不使用”ではなく,コンパレータを(使えるように)初期状態にセットします,という意味で,各種ピンは,GP0,GP1をアナログに,GP2をデジタル入出力にセットします.質問者様の文脈から察するに,GP2は動いたのにGP0と1の(ディジタルIOとしての)I/O動作が期待に反したことに近いと思います.
ですので,コンパレータ機能を使わずにGP0,1,2をディジタル入出力で使う場合には,このCMCONに7H(CM2:CM1:CM0=1:1:1)を書き込まなければなりません.一般的には,スタートアップルーチンでTRISIOレジスタにGPIOをセットする手前にCMCONをconfigureします.

最後にアドバイスになるか否かわかりませんが,データシートや仕様書が間違っていることは本当に稀です.汎用ディジタル入出力として使える,と書いてあれば必ず使えます.ただし,ことPICの場合は小型で多機能である反面,ピンの共用がかなり激しく,思わぬところで勘違いを起こします.偉そうに言っていますが,私も実は毎回はまっています.定番のPIC16F84で作成したソフトをPIC16F88に持ってこようとした時はANSEL(アナログ入力の仕様設定)にやられました.またつい最近,非常に単機能なPIC12F509を使い始める時にも,GP2がTMR0のクロック入力とかぶっていて,OPTIONレジスタのデフォルト値がTMR0を優先させていた為にやはりGPIOが動かない,という現象にはまりました.
その時あまりにも悔しかったので備忘録としてブログに挙げてあります.お暇だったら見てください.
http://fp-masamichi.cocolog-nifty.com/pic/2009/0 …
私も異なるPICを使う度にはまっている状態ですが,いずれにしても最後はデータシート通りにちゃんと動きます.PICを信じてやってください.

参考URL:http://fp-masamichi.cocolog-nifty.com/pic/2009/0 …
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。
ご指摘にありましたCMCOMレジスタにデータをセットしてみました。

CMCOM=0x07;
この1文をIOピンの初期設定を行っているサブルーチン書き込んだ
だけでGP0,1ピンをデジタル入力として使えるようになりました。

プログラムのソースコード、回路図等を掲載したかったのですが、
参考書のサンプルソースなので掲載してはよろしくないのでは
と思い掲載しませんでした。

参考書 オーム社 C言語ではじめるPICマイコン
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4- …
この本のP84,85に載っているプログラムです。
(よくみるとこの本にCMCOMレジスタの説明も載ってましたね^^;)

ブログも今度ゆっくり拝見させていただきます。
今回はどうもありがとうございました。

お礼日時:2009/07/21 22:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報