イサギダプロダクツから購入した600mmのデジタルスケールの解析をしました。
オシロでクロックとおぼしき信号をポーリングしてみると
上のデータの右の13の部分、ここは
mm/inchの切り替えは、デジタルスケールのボタンがON/in/mmで共用なので、ON/OFFの タイミングをさぐってみたところ、電源をOFFして800msec待ってONするとmm/inchの 切り替えになります。
このデジタルスケールもデータ線とクロック線をプルアップしてやるとモードが変更できる。
このテストをするにあたって、簡単なシェルを組みこみました。ews4800mipsの ブートローダからひっぱってきたやつ。実はこれ、Emacs風のコマンドラインエ ディットができて、ヒストリもあるのだ。
今回はユーザプログラム側からコマンドを登録する形式になってます。
H 19296 L 57 H 7 L 5 H 6 L 5 H 7 L 5 H 7 L 61 H 6 L 5 H 7 L 5 H 7 L 4 H 7 L 62 H 6 L 5 H 7 L 5 H 7 L 4 H 7 L 61 H 7 L 5 H 7 L 4 H 7 L 5 H 7 L 61 H 7 L 5 H 6 L 5 H 7 L 5 H 7 L 61 H 7 L 5 H 7 L 4 H 7 L 5 H 6 L 62 H 7 L 4 H 7 L 5 H 7 L 4 H 7 L 60 H 19296これは7桁のBCDっぽいので
#pragma interrupt
void
irq3 ()
{
uint8_t bcd[7];
int i, j, k;
for (i = 0; i < 7; i++)
{
bcd[i] = 0;
for (j = 0; j < 4; j++)
{
while (!(*P8_DR & 0x8)) // LOW
;
if (!(*P7_DR & 0x8))
bcd[i] |= (1 << j);
//HIGH
for (k = 0; (*P8_DR & 0x8) && k < 100; k++) // HIGH
;
if (k == 100)
{
iprintf ("error\n");
goto next_phase;
}
}
}
next_phase:
for (k = 0; k < i; k++)
iprintf ("%d ", bcd[k]);
iprintf ("\n");
// Drain unneeded interrupt.
*INTC_ISR &= ~0x8;
}
こんな感じでデータをとってみたところ、
4 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13 3 2 2 7 0 0 13これは-72.23mmです。 データはLOWでActive。立ちあがりでサンプルするのがいい。
上のデータの右の13の部分、ここは
+/-が0x1 (0x1で-)
mm/inchが0x4
インチで最後の5がつくと0x2
0x8は常にたってる。
------------------------------
インチで最後の5がつくと 10 -で11
つかないと8 -で 9
mmで+は12
-は13
です。
mm/inchの切り替えは、デジタルスケールのボタンがON/in/mmで共用なので、ON/OFFの タイミングをさぐってみたところ、電源をOFFして800msec待ってONするとmm/inchの 切り替えになります。
このデジタルスケールもデータ線とクロック線をプルアップしてやるとモードが変更できる。
pullup 6 200 zero reset 100だとたりない。
pullup 7 200 ホールド
->pullup 7 200 MIN F.T.
->pullup 7 200 MAX F.T.
->pullup 7 200 元にもどる。
pullup 7 200 ホールド
->pullup 6 200 F.T.
->pullup 6 200 ホールド
->pullup 6 200 F.T.
->pullup 7 200 元に戻る
pullup 7 200 ホールド
->pullup 6 200 F.T.
->pullup 7 200 元に戻る
pullup 7 200 ホールド
->pullup 7 200 MIN F.T.
->pullup 6 200 MIN H
->pullup 6 200 MIN F.T.
->pullup 7 200 元に戻る
pullup 7 200 ホールド
->pullup 7 200 MIN F.T.
->pullup 7 200 MAX F.T.
->pullup 6 200 MAX H
->pullup 6 200 MAX F.T.
->pullup 6 200 MAX H
->pullup 7 200 元に戻る
200msecだと微妙な時があって300msecが確実。同時プルアップも試してみたけど、
これはゼロリセットが効くだけでなにもなかった。
このテストをするにあたって、簡単なシェルを組みこみました。ews4800mipsの ブートローダからひっぱってきたやつ。実はこれ、Emacs風のコマンドラインエ ディットができて、ヒストリもあるのだ。
今回はユーザプログラム側からコマンドを登録する形式になってます。
SHELL_COMMAND_DECL (power);
{
shell_command_register (&power_cmd);
}
uint32_t
power (int32_t argc, int8_t *argv[])
{
int msec;
if (argc < 2)
return -1;
msec = __atoi (argv[1]);
*PA_DR |= 0x8; // Caliper POWER off
mdelay (msec);
*PA_DR &= ~0x8; // Caliper POWER on
printf ("%d msec.\n", msec);
return 0;
}
こんな感じで、気ままにテストコマンドを登録できる形式にしておきました。
これ以上やるとキリがないので、コマンドランチャーまでで押さえておきます。
