090105

|


イサギダプロダクツから購入した600mmのデジタルスケールの解析をしました。
オシロでクロックとおぼしき信号をポーリングしてみると
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;
}
こんな感じで、気ままにテストコマンドを登録できる形式にしておきました。 これ以上やるとキリがないので、コマンドランチャーまでで押さえておきます。