2013年12月31日火曜日

でむさんのHMC5883Lセルフテストを追試TJ3B

C-Style Ver.20130611でビルドしています。
オリジナルよりLCD関係を削除しました。コメントも一部変更させていたたきました。
合格なら緑のLEDが、不合格だと赤1のLEDが点灯するはずです。
またテスト中は赤2が、終了すると赤3が点灯するはずです。
まだ、HMC5883Lの製品を購入していません。どなたかお試しくださいませんか?
オプション Setupボタンの表示 AdvancedModeチェック Dir.Sensorチェック
適当にプログラムをビルドしてください。動かなかったらごめんなさい。ここまでしか
力がありません。
書き換えるのは、D_I2C.cだけてす。バックアップを忘れずに自己責任でどうぞ。
でむさん、ありがとうごさいます。

D_I2C.cの中の

// dno:0(dir), 1(pitch), 2(roll)
UINT get_dir(BYTE dno)
{
U_UINT d;
BYTE adrs = DIR_ADRS;
BYTE n = 0;

d.W = 999;
gI2C_Buf[n++] = 0x20 + dno * 2;
if (i2c_send(adrs, n) == false) return(d.W);
if (i2c_recv(adrs, 2) == false) return(d.W);
n = 0;
d.H = gI2C_Buf[n++];
d.L = gI2C_Buf[n++];
if (0 < dno){
d.W += 90;
}
return(d.W);
}

を次のプログラムに書き換えて上書きして保存してください。

// HMC5883L用のセルフテスト  by でむ
// 地磁気センサx, y軸の値が243以上、575以下なら合格
// 制作者:でむ
UINT get_dir(BYTE dno) // セルフテスト 
{
int init_dir, diff; // 初期角度, 差
int dir, i, data_no;
int x_min = 1000, x_max = -1000, y_min = 1000, y_max = -1000;
U_UINT dx,dy,dz;
BYTE adrs_write  = 0x3C; // I2C address 8bit write
BYTE adrs_read = 0x3D;   // I2C address 8bit read
float ave_x, ave_y;
static float counter = 0;

if ((dno == 1) || (dno == 2)) return 999;

// 初期化
if (counter++ < 5) {
gI2C_Buf[0] = 0x00; // Write CRA(00)
gI2C_Buf[1] = 0x71; // Positive Self test measurement
if (i2c_send(adrs_write, 2) == false) return 999;

gI2C_Buf[0] = 0x01; // Write CRB(01)
gI2C_Buf[1] = 0xA0; // Gain 5
if (i2c_send(adrs_write, 2) == false) return 999;

gI2C_Buf[0] = 0x02; // Write Mode (02)
gI2C_Buf[1] = 0x00; // Continuous
if (i2c_send(adrs_write, 2) == false) return 999;

Delay1KTCYx(536);
return 999;
}

dx.W = 999; dy.W = 999;
set_Led(2, LED_ON); //SELF TEST BEGIN

    for (i = 0; i < 100; i++)
{
if (i2c_recv(adrs_read, 6) == false) return 999;

dx.H = gI2C_Buf[0]; // BYTE型、実はunsigned char. D_main.hで定義
dx.L = gI2C_Buf[1];
dz.H = gI2C_Buf[2];
dz.L = gI2C_Buf[3];
dy.H = gI2C_Buf[4];
dy.L = gI2C_Buf[5];

if (dx.W == 999) continue;
if (dy.W == 999) continue;
if ((int) dx.W < x_min) x_min = (int) dx.W;
if ((int) dx.W > x_max) x_max = (int) dx.W;
if ((int) dy.W < y_min) y_min = (int) dy.W;
if ((int) dy.W > y_max) y_max = (int) dy.W;

gI2C_Buf[0] = 0x03; // 最初のデータが格納されているデータレジスタ03へ指す
if (i2c_send(adrs_write, 1) == false) return 999; // 999はエラー

//Delay1KTCYx(536); // 67ms待つ。HMC5883Lは標準で毎秒15回データ取得
wait_ms(100); // 100ms待つ
}

set_Led(2, LED_OFF); //SELF TEST END
if (((243 < x_min) && (x_max < 575)) && ((243 < y_min) && (y_max < 575)))
set_Led(0, LED_ON); //SUCCEEDED
  else          
set_Led(1, LED_ON); //FAILED

wait_ms(10000);
set_Led(3, LED_ON); //POWER OFF
wait_ms(30000); // 30秒待つ

return (UINT) dir;
}

0 件のコメント: