
2013年5月2日
課題:PICで2wire(I2C)センサを制御し方位計を作る 分解能0.1°
入力装置:デジタル方位センサー HMC6352(100Khz) ストロベリーより購入
出力装置:超小型LCD SD1602VBWB-XA-G
演算装置:PIC16F88
ハード設計:PIC16F88の電源への配線を忘れずに!
【デジタル方位センサー HMC6352】

【超小型LCDキャラクタディスプレイモジュール】
【PIC16F88】上記以外に電源とACK確認用LEDを接続

【完成例】
ソフト設計:ビルド済みデータはこちら
メインフローを考える
1.HMC6352の使い方からhttp://strawberry-linux.com/pub/hmc6352-manual.pdf
このデバイスには内部レジスタのアドレスがありませんので、スレーブアドレス(0b0100001)の後にコマンドを送ります。ASCIIのアルファベット1文字がコマンドになっており、0x41
('A')を送ると2バイトの方位を返す設計になっています。方位は上位バイトが先に帰ってきます。この数値は0~3599の範囲でそれを1/10すれば0度~359.9度とそのまま角度になります。
2.I2c仕様書p11からhttp://www.nxp.com/documents/other/39340011_jp.pdf
①マスター・トランスミッタからスレーブ・レシーバへのデータ送信。(図11参照)でスレーブアドレス+書き込み指定ビット(0)と0x41 ('A')を送る

②マスターが1バイト目すなわちスレーブアドレス+読込み指定ビット(1)の直後から、スレーブのデータを読み込む(図12参照)で方位データの2バイトを読込む。

③STARTとSTOP I2c仕様書p7より

START:SDAとSCLがHの状態からSDAをLに変化させる
STOP:SDAがL、SCLがHの状態からSDAをHに変化させる
④AcknowlegeとNot Acknowlege I2c仕様書p9より

AcknowlegeとNot Acknowlegeは送信側から8bitの送信が終了後、9bit目に送信側がSDAを入力に切替、受信側がSDAラインをHまたはLに切替える。
Acknowlege:SDAをLに
Not Acknowlege:SDAをHに
⑤タイミングの定義 I2c仕様書p31より

⑥SDAおよびSCLバス・ラインの特性I2c仕様書p30より(100khzは標準モード)
3.方位測定の流れ
| ①スタートコンデション | 関数w2restert();とでもしよう | |||
| ②アドレスと書き込みのリクエスト送信 | 関数w2sendbyte();とでもしよう | |||
| アドレス+書き込み: | 0b0100001+0=0b01000010→0x42 | |||
| 送信バイトの入れ物: | commandとでもしよう command=0x42; | |||
| ③センサーからのackの受信 | 関数w2readack();とでもしよう | |||
| ④方位2バイトの送信指示 | 関数w2sendbyte(); | |||
| 送信指示:0x41(アスキーのA) | ||||
| 送信バイトの入れ物:command=0x41; | ||||
| ⑤センサーからのackの受信 | 関数w2readack(); | |||
| ⑥変換時間待ち | センサー仕様書p8 表3 6ms以上? | |||
| ⑦ストップコンデション | 関数w2stop();とでもしよう | |||
| //以上i2c仕様p11図10完全なデータ転送 | ||||
| ⑧時間待ち | 10ms? | |||
| //以下i2c仕様p12図12マスターが1バイト目の直後スレーブのデータむ | ||||
| ⑨リスタート | 関数w2restert(); | |||
| ⑩アドレスと読み込みのリクエスト | 関数w2sendbyte(); | |||
| アドレス+読込み: | 0b0100001+1=0b01000011→0x43 | |||
| 送信バイトの入れ物: | command=0x43; | |||
| ⑪センサーからのackの受信 | 関数w2readack(); | |||
| ⑫上位1バイトの受信 | 関数w2readbyte();とでもしよう | |||
| hoi= hoid; | 16bitの入れ物hoiに上位データ8bitを代入 | |||
| ⑬センサーへackの送信 | 関数w2sendack();とでもしよう | |||
| ⑭下位1バイトの受信 | 関数w2readbyte(); | |||
| hoi=hoi<<8|hoid | 16bitの中身を8bit左へ移動し下位上位デーbitを代入 | |||
| ⑮センサーへNackの送信 | 関数w2sendnack(); | |||
| ⑯ストップコンデションの送信 | 関数w2stop();とでもしよう | |||
4.作成したファイル:詳細はビルド済みデータこちらを参照
| main.c | ||
| i2c.c | 2線制御部の分割cファイル | |
| lcd_rb_h.c | LCD用分割cファイル | |
| 88_i2c.h | 2線制御部ヘッダーファイル | |
| lcd.h | LCD用ヘッダーファイル |
5.使用統合開発環境
MPLAB IDE 8.73a HI-TECH ANSI C Compiler
以上