201352

課題:PICで2wire(I2C)センサを制御し方位計を作る 分解能0.1°
入力装置:デジタル方位センサー HMC6352100Khz) ストロベリーより購入
出力装置:超小型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

http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Missiles-Munitions/HMC6352.pdf

①マスター・トランスミッタからスレーブ・レシーバへのデータ送信。(図11参照)でスレーブアドレス+書き込み指定ビット(0)と0x41 ('A')を送る

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

STARTSTOP  I2c仕様書p7より

STARTSDASCLHの状態からSDALに変化させる
STOPSDALSCLHの状態からSDAHに変化させる 

AcknowlegeNot Acknowlege I2c仕様書p9より

AcknowlegeNot Acknowlegeは送信側から8bitの送信が終了後、9bit目に送信側がSDAを入力に切替、受信側がSDAラインをHまたはLに切替える。
AcknowlegeSDAL
Not AcknowlegeSDAH

⑤タイミングの定義 I2c仕様書p31より

SDAおよびSCLバス・ラインの特性I2c仕様書p30より(100khzは標準モード)

3.方位測定の流れ

  ①スタートコンデション     関数w2restert();とでもしよう 
  ②アドレスと書き込みのリクエスト送信   関数w2sendbyte();とでもしよう
         アドレス+書き込み:   0b0100001+0=0b010000100x42
     送信バイトの入れ物:   commandとでもしよう command0x42;
  ③センサーからのackの受信   関数w2readack();とでもしよう
  ④方位2バイトの送信指示   関数w2sendbyte();
        送信指示:0x41(アスキーのA)
        送信バイトの入れ物:command0x41;
  ⑤センサーからのackの受信   関数w2readack();
  ⑥変換時間待ち   センサー仕様書p8 表3 6ms以上
  ⑦ストップコンデション   関数w2stop();とでもしよう
                    //以上i2c仕様p1110完全なデータ転送
  ⑧時間待ち     10ms
           //以下i2c仕様p1212マスターが1バイト目の直後スレーブのデータむ
  ⑨リスタート    関数w2restert();
  ⑩アドレスと読み込みのリクエスト   関数w2sendbyte();
     アドレス+読込み:    0b0100001+1=0b010000110x43
     送信バイトの入れ物:    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

以上