next up previous contents index
Next: メモリ管理 Up: プログラムの動作 Previous: センサとアクチュエータのインターフェース関数

入出力カード(D/A,カウンタ)のインターフェース関数

カウンタカードやD/A変換カードのインターフェース関数の例を次に示す。 RTMATXにはパソコンのI/Oポートをアクセスする関数,16進数表記, 整数のビット操作関数が準備されているので,それらを用いれば, I/Oカードのインターフェース関数をRTMATXの関数として記述できる。 もちろん,C言語で関数を記述しリンクすることも簡単にできる。

カウンタ(CONTEC, CNT24-4(PC))のモード設定関数,初期値設定関数, 初期化関数の例を次に示す。


// カウンタのモード設定
Func void count_mode(port)
  Integer port;
{
  Outportb(CNT_COM, port + 1);
  Outportb(CNT_DAT, MODE_CNT);
}




// カウンタの初期値設定
Func void count_set(port, data)
  Integer port;
  Integer data;
{
  Outportb(CNT_COM, port);

  Outportb(CNT_DAT, rem(data, 0x100));
  data = data / 0x100;

  Outportb(CNT_DAT, rem(data, 0x100));
  data = data / 0x100;

  Outportb(CNT_DAT, rem(data, 0x1000));
}




// カウンタの初期化
Func void count_init()
{
  Integer i, ch_port;

  void count_mode(), count_set();
    
  for (i = 1; i <= CNT_CH; i++) {
    ch_port = 5 * (i - 1);
    count_mode(ch_port);
    count_set(ch_port, 0);
  }
}


カウンタの値を読み出す関数の例を次に示す。


Func Integer count_get(ch)
  Integer ch;
{
  Integer ch_port;
  Integer d1, d2, d3, data;

  ch_port = 5 * (ch - 1);

  Outportb(CNT_COM, 0x14);
  Outportb(CNT_DAT, 0x7);
  Outportb(CNT_COM, ch_port);

  d1 = Inportb(CNT_DAT);
  d2 = Inportb(CNT_DAT);
  d3 = Inportb(CNT_DAT);
    
  data = d3*0x10000 + d2*0x100 + d1;
    
  if (data > 0x800000) {
    data = data - 0xffffff - 1;
  }

  return data;
}


D/A変換(CONTEC)の出力関数の例を次に示す。


Func void da_conv(da_port, da_data)
  Index da_port;
  Matrix da_data;
{
  Integer i, data_i;
  Real data;

  for (i = 1; i <= length(da_port); i++) {
    data = da_data(i);
    if (data >= 10.0) {
      data = 9.9951;
    } else if (data <= -10.0) {
      data = -10.0;
    }

    data_i = Integer(4096.0 * (data + 10.0) / 20.0);
    if (rtIsTesting() == 0) {
      Outport(PORTNO_da, data_i*0x10 + da_port(i)-1);
    }
  }
}


D/A変換器へ0[v]に設定する関数の例を次に示す。


Func void da_zero()
{
  Integer i;
  Index da_port;
  Matrix da_data;

  void da_conv();

  da_port = Z(DA_CH, 1);
  da_data = Z(DA_CH, 1);
  for (i = 1; i <= DA_CH; i++) {
    da_port(i) = i;
    da_data(i) = 0.0;
  }
  da_conv(da_port, da_data);
}




Masanobu KOGA 平成10年8月19日