自動測定

パソコンとマイコンとの通信

マイコン側のプログラムは、これまでにもいろいろ作成してきましたが、 今回は、パソコン側との通信(データのやりとり)を行う必要があります。 この実験では、その通信をUSB(Universal Serial Bus)を用いて行います。 USBでの通信のために初期化などの様々な手続きが必要ですが、 この実験では、それらはすべて「おまじない」と考えることにして、 データの送受信の部分だけを、作成することにします。

マイコン側のプログラム

まずマイコン側プログラムを 適当なフォルダの中にダウンロードし、展開します。 zipファイルをダブルクリックすると、以下の5つのファイルが現れるはずです。 これらを適当なフォルダにコピーします。 この中のmain.cが、データの送受信とそれに伴う処理を記述するべき ソースファイルです。 main関数は次のようになっています。
void main(void)
{
   int i;
   Init();
   while(TRUE){
      USB_Receive();
      SendCount = RecvCount;
      for (i = 0; i < RecvCount; i++)
	SendBuffer[i] = RecvBuffer[i];
      USB_Send();
   }
}
またこのmain関数の前に、次の4つのグローバル変数が宣言されています。
BYTE xdata RecvBuffer[128];
BYTE xdata SendBuffer[128];
WORD RecvCount;
WORD SendCount;
このうち、Init()は初期化をする関数ですので、最初に記述しておきます。 その後、処理の本体に入りますが、 USB_Receive()が、パソコンからUSB経由で送られてきたデータを 受信する関数で、その受信データが配列RecvBuffer[]に、 またその長さ(バイト数)がRecvCountに入ります。

逆にUSB_Send()は、パソコンに対してUSB経由でデータを送る関数で、 配列SendBuffer[]の中のデータを、0番目から順に、 SendCountバイトだけ送信をします。

この場合は、パソコンから受信したデータを、そのままパソコンに 送り返していることになります。

これを参考に、行わせたい処理をmain関数内に記述し、 main.Uv2をダブルクリックしてuVision2を起動後、 build(F7)を行ってプログラムをコンパイルします。

パソコン側のプログラム

次に通信相手となるパソコン側のプログラムを作成します。 まずパソコン側プログラムを 適当なフォルダの中にダウンロードし、展開します。 すると以下の7つのファイルが現れるはずです。 (VisualStudio 2005用もあります。)

 この中にある次のVisualStudioプロジェクトアイコンをダブルクリックすると、 VisualStudioが起動します。



上記のダイアログが表示されますので、「OK」を押します。


左側のウィンドウ「ソリューションエクスプローラ」内の、 Hostの三角マークをクリックすると、 main.cが見つかります。 この中のmain.cが、データの送受信とそれに伴う処理を記述するべき ソースファイルです。

main関数は次のようになっています。(一部のみ抜粋して記載)

#define SIZE 32

int main( int argc, char *argv[] )
{
  if (USB_Open()){
    fprintf(stderr, "Cannot open Ez-USB\n"); exit(1);
  }

  for (i = 0; i < 4; i++) {
    for (j = 0; j < SIZE; j++) {
      s1[j] = i + j * 2;
      s2[j] = 0;
    }
    USB_Send(s1, SIZE);

    l = USB_Receive(s2, SIZE);
    for (j = 0; j < l; j++) {
      if ((j % 16) == 0) fprintf(stderr, "\n%04x", j);
      fprintf(stderr, " %02x", s2[j]);
    }
  }
  USB_Close();
}
最初にあるUSB_Open()は初期化の関数ですので、最初に記述しておきます。 (この例のように、初期化に失敗した場合に、メッセージ表示などの処理を 記述しておくのはよい方法です。)

その後、送信するべきデータを配列s1[]の中に用意し (この例ではs1[j]にi+j*2を代入しています)、 その準備がそろったら、USB_Send()で、マイコンに向けて USB経由でデータを送信しています。 このとき、送信したいバイト数を、第2引数として与えています。

その後、USB_Receive()で、マイコンからUSB経由で送られてきた データを受信しています。 この関数の第2引数では「受信したいバイト数」(この場合はSIZE=32バイト)を 与えますが、「実際に受信されたバイト数」が戻り値となりますので、 その値を変数lに代入しておきます。 そして受信したデータを、順に整形して表示しています。

最後にUSB_Close()で、USB通信の終了処理を行います。

プログラムの記述が完了したら、 「ビルド」メニューの「ソリューションのビルド」でコンパイルを行います。

パソコン側のプログラムのコンパイルが無事終了したら、 まずEZ-USB ControlPanelでマイコン側のプログラムを転送して実行し、 その後、パソコン側のプログラムを実行させます。 パソコン側のプログラムは、 「デバッグ」メニューの「デバッグなしで開始」で実行します。 ビルドするかどうかを確認してきた場合は「はい(Y)」とします。 cmd.exeが起動してプログラムを実行します。

演習

適当なデータの送受信を行うプログラムを、パソコン側・マイコン側 双方で記述し、実行させて動作を確認してみましょう。 例えばマイコン側では、パソコンから送ったデータを2倍にしたり 反転させて返す、といった処理をさせるとよいでしょう。

自動計測

上記の方法で、パソコン側とマイコン側でUSB経由で 通信を行うことができました。 そこで、先に行ったインバータSN7404の入出力特性の測定を、 パソコン側で自動的に行ってみましょう。 具体的には、次のような処理を行えばよいはずです。

演習

インバータSN7404の入出力特性を自動的に計測してその結果をファイルに保存し、 Excelなどを用いてグラフにしてみましょう。

ヒント:


Index Prev: D/A変換器・A/D変換器