- 締切済み
PIC C Liteを使い加速度センサの値を読む
始めまして。 最近PICの勉強を始めました。 ADWINのキットを買い、後閑さんの本を読んでいる最中ですが、質門があります。 【Kionix社の加速度センサ「KXP84-2050」を使い、その値を取り込むにはどうすればいいのでしょうか。】 学生時代にC言語を少し触っており簡単な気持ちで始めたら、大変なことになりました。 PC内部だけでプログラムするのとは分けが違い、途方に暮れています。 どうか、皆様のお力をお借りしたいです。 以下、質問の詳細です。 1.X軸の信号値を8個のLEDで8bitデータに見立てて表示しようと考えています。 センサを傾けると、 秋月電子でセンサーのモジュールを買いました。 私の理解では ・あるポートのレジスタ(ここではRB0とします)をまずは入力ポートにする ・センサーからの値を代入する ・その値をLEDに出力する です。 ここで、センサーの仕様書にはレジスタネーム「XOUT_H」のアドレスは0x00であり、これはMSBで送られてくる。(8bitデータ)I2Cでのデータ送受信時 センサ側のデータをどう受信して、値を格納すればいいのでしょうか? センサ側のアドレスを指定する? などがADWINの入門書ではまったく無いので・・・ PIC側とセンサー側のやり取りが分からず困っています。 シリアルでデータがくるので、8bitデータをもらうのには8回ループをまわして、別に定義した変数にセンサデータを入れればいいのでしょうか? センサーとPICを繋ぐ線は1つですので、シリアルデータの扱い方がわかりません。 PIC側で、 char X_data[8]のような配列を定義し を定義し、 そこに X_data[i]=XOUT_H[i]そして出力でしょうか? 私なりに、ネットも調べたのですが分からずじまいでした。 よろしくお願いします。 乱文申し訳ございません。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kaoaru
- ベストアンサー率33% (42/127)
どの程度Cを習熟されたかは存知ませんが、「共用体」はご存知ですよね? それを使うとビットアクセスはとても簡単になるのですが、PIC Cはそれを使えないのです。 だから、#defineで特定ポートを指定するとか、バイト単位で論理演算によるビットアクセスをするとか、そのような方法になります。 だから、LSBのみ交互に1と0を繰り返すような場合、 iVal ^= 0x01; という風に「排他OR」でやるわけです。 上位4ビットに影響を与えないで下位4ビットのみを変化させる場合なんかは iVal &= 0xf0; してから iVal |= out_bit; のようにして変化分をORさせることになります。 むずかしく考えすぎるみたいですねぇ~、「3線式通信」。 シリアルEEPROMもそうですが、 CS(セレクト)してからDATA確定してCLKを上げるか下げるかでリードライト・・・を繰り返してCSを上げたら終わりです。 たったそれだけのことです。 ビット操作のプログラミングができないと、どうにもならないので慣れてください。 しかし、ミッドレンジの規模の小さいPICの場合、C言語からは早めに卒業されたほうがいいかもしれません。もっと上位のマイコンにシフトするならばいいのですが・・・。 最後に、ルネサスのマイコンでしたらコンパイラが共用体をサポートしていて、PCでやるようなプログラミングが可能です。C言語しか眼中にないのであれば、R8Cあたりもおすすめです。
- kaoaru
- ベストアンサー率33% (42/127)
なんか、参考サイトをさがされているようですが、私のところでも見ていって遊んでみてください。 http://www42.tok2.com/home/kaoaru0/html/old/PICmicom.htm 情報は「古い!」って思います。Cよりもアセンブラのほうが多いですね!
- kaoaru
- ベストアンサー率33% (42/127)
>学生時代にC言語を少し触っており まずここからクリアしていかないといけないですね! このような小型マイコンのプログラミングではビット処理が頻繁に出ます。かなりC言語を使われていないと「イメージ」しにくいのですね、それは。 また、PICのCはとっつきやすさはあるのですが、方言(?)がキツイし、初心者がミッドレンジを充分つかいこなせなくなってあきらめてしまうケースが多いと思います。 >センサーとPICを繋ぐ線は1つですので、シリアルデータの扱い方がわかりません。 これは、もう、PICとかC言語以前の話でして、組込み機器開発の基本でもあります。 >ADWINのキットを買い、後閑さんの本を読んでいる最中 せっかく本まで買われているワケですから、著者に直接質問するのもいい方法ですよ!もっとも「後閑さん」はブログがありますので、本を買った旨の投稿からはじめてカキコしていけばいろいろ情報をもらえるのではないですか? だから、こんなところで質問なんてしている場合じゃないですよ!その時間のほうがムダというものです。
- uruz
- ベストアンサー率49% (417/840)
回答が付かないようなので ここの限られた文字数ではとても無理なのでヒントを まず、I2Cシリアル通信についての知識が必要です、ご自身で調べて完全に理解してください。 I2Cは2線式シリアル通信です、通信には2本の線が必要です(GNDを含めると3本)。 次に、センサモジュールに使用されているチップ(KPX84)のI2C通信仕様を完全に理解することが必要です。 I2C通信仕様については秋月の商品ページにリンクがあります KXP84-2050_Specifications_Rev2.pdf 上記PDFファイルの10ページからI2C通信の説明が書かれています。 KXP84で測定開始するには最初にKXP84のコンフィグレーション・レジスタを適切に設定する必要があります。 以上2点を理解すれば答えが見えてきます。 参考: KXP84への書込 1)開始信号 2)デバイス・アドレス+書込フラグを送信 3)デバイスの応答を確認する 4)レジスタ・アドレスを送信 5)デバイスの応答を確認する 6)データを送信 7)デバイスの応答を確認する 8)終了信号 KXP84からの読込 1)開始信号 2)デバイス・アドレス+読込フラグを送信 3)デバイスの応答を確認する 4)レジスタ・アドレスを送信 5)デバイスの応答を確認する 6)データを受信 7)デバイスに応答を返す 8)終了信号
お礼
uruz様: ご回答ありがとうございます。 仰る通り、IC2通信についてまずは勉強いたします。教えて頂いた資料のP10に書いてありました。 SCLとSDAですね。 また、フローチャートも示して頂き、ありがとうございます。 私のたった3行のフローチャートを見直し恥ずかしい限りです。 よろしければ、uruz様の推薦する書籍やサイトを教えて頂く事は可能でしょうか。 PICFUNのサイトにもI2Cの解説がありましたので、目下勉強中です。
お礼
kaoaru様: ご回答ありがとうございます。 お礼を述べるのが遅くなり、大変失礼しました。 共用体は使ったことがありませんが、一応知っています。 構造体のよりフレキシブルに変数の型式を決めれる くらいの知識ですが。 仰る通り、bit演算のプログラムはした事がなく、もっと勉強します。 上位のマイコンというのはPIC18シリーズなどのことですか? ARMマイコン等の方が今後の発展も考えるといいということでしょうか? 質問ばかりで申し訳ございません。 kaoaru様のサイトも拝見させて頂き、勉強します。今日にCQ出版の「マイコンの1線2線3線インターフェース活用入門」なる本も届きましたので、勉強いたします。 次回質問するときは、もっと具体的な質問ができるように、勉強いたします。