計測制御技術ラウンジ >> GPIB技術ラウンジ 全部 1- 最新50

1バイトおきに受信してしまう

1 名前: TERA 投稿日:2005/03/16(水) 16:04 ID:FXtuhd6U
いつも参考にさせて貰っています。お世話になります。

さて、自作基板(GPIBコントローラはNI社のNAT7210使用)と
NI社のGPIBカード(PCMCIA-GPIB)を使用して通信テストを行っています。
ノートPCにPCMCIA-GPIBを挿入しています。
今、ノートPC→自作基板に"ABCDEFG"の文字を送信したところ、自作基板では
"ACEG"と一文字おきに受信してしまう現象が起きています。
自作基板→ノートPCへ"123456789"を返信しても、ノートPC側ではちゃんと
9文字受信できています。
皆さんはこのような経験は無いでしょうか?
考えたんですが、PCのスペックが高い(CPU速度高)と、メッセージ送信が
早く、デバイス側で追従できないのではないのか・・・と思うのですが、
違いますかねぇ...。(ちなみにノートPCのCPUはCeleron2.4Gです)
原因等分かる方いらっしゃいましたらご教授願います。

2 名前: tam 投稿日:2005/03/17(木) 10:36 ID:5PyLjZT6
GP-IBはハンドシェイクという手法で1バイトずつ送受信を行なう
のでCPUスペックにより取りこぼしを起こすようなことはないです。
 NIのサイトにはいろいろ資料があるようなので、それらを
精読されたほうが良いかと思います。
 あとは、どのように7210を制御しているのがわからないので、
設定と受信のルーチンを見ないことにはフォローしようが
ありません。

3 名前: TERA 投稿日:2005/03/22(火) 17:36 ID:QRRQ2gdE
tam様 返事有難うございました。
連絡遅くなり申し訳ありません。
ハンドシェイクの手法で通信していることを忘れていました。
恥ずかしいです。
ロジックアナライザを接続して、信号を見たところ、正常にABCDを
PCから送信して、7210側では1文字ごとにNDACラインがON(OFF?)していました。
・・・ということは、ソフト側の問題ではないのかと疑ってみます。
設定と受信のルーチンですが、設定および送受信のコードは、
トランジスタ技術の1995年の10月号のプログラムを参考にしました。
コードをここへ記述すればよいのですが、別のPCにプログラムがありますので、
必要ならばコードをコピーしてきます。
あとステート移行禁止時間の設定が良く分かっていないのですが、
7210のCLOCK入力が4.125MHZなので、Nf=5に設定しています。
その他、設定などに注意すべき点は有りますでしょうか?

投稿内容が変かもしれませんがアドバイスよろしくお願いします。

4 名前: tam 投稿日:2005/03/22(火) 20:06 ID:NeaX6r6c
 トラ技のはPC側(コントローラ)としての例ですので、コントロールされる側の
ソフトなら、受信時のUNL、OLA、MTA、gtsの出力は不要です。7210の初期化にも
不適当なところがあるかもしれません。
 以下は実際に私が使用した受信ルーチンです。トラ技では最初の1文字以降EOIを
受け取るまでループになってますが、ここでは1文字ずつ割り込みで受信しています。
intgpia()
{
  gpia = GPIA;            /* 7210のアドレスをセット */
  ints2 = *(gpia + INTS2);      /* 割り込みステータスレジスタ2の読み込み */

  if ((ints2 & BINT) != 0) {     /* GP-IB割り込み有り */
  {
    ints1 = *(gpia + INTS1);    /* 割り込みステータスレジスタ1の読み込み */

    if ((ints1 & BDI) != 0)     /* データ入力有り */
    {                /* 受信する */
      eoi = *(gpia + ADR1) & BEOI;/* EOIをチェック(保存) */
      din = *(gpia + DIN);    /* 1文字読み込み */
      wwout(din);         /* 読み込んだ文字を受信バッファに書き込む */
      if (eoi != 0 && din != LF) /* EOIなら受信バッファにLFを付加する */
        wwout(LF);
    }
  }
}
DI割り込み以外も割り込みで処理するなら、この中に追加してください。
Nfの設定は、私もわかりませんがfc4.608MHzで私も5に設定しています。
 7210を扱う上での注意としては、
・割り込みはエッジでなくレベルで受ける(複数の割り込み要因があるため)
・1回の処理では、1回しかレジスタを読み込まない(割り込みステータスレジスタは読むことでクリアされてしまう。
データ入力レジスタを読むと次のハンドシェイクが始まってしまう、等。コンパイラのオプティマイズにも注意)。
 それとハード的な要因として私がCPU:SH1+GPIA:9914で経験した例ですが、CPUのアドレスバスの変化過程で、
一瞬レジスタをリードしてクリアしてしまい、レジスタをリードしてもフラグが立っていないということがありました。

5 名前: TERA 投稿日:2005/03/23(水) 20:25 ID:bK53/dYY
tam様 返信有難うございました。
サンプルコードも記述していただき有難うございます。
tamさんのように割り込みで処理しようとしましたが、やはり上手くいきませんでした。
INTビットの1のセット条件として、1RのDI、DO、ENDのビットを
マスクしています。従って1Wには01H+02H+10Hを書き込んでいます。
ロジックアナライザで確認すると、確かにINT端子がアクティブにはなっているのですが、
2文字目のINTのアクティブ時間が10数nsecと超短いのです。
場合によっては、2文字目のINTがアクティブにならない場合も有ります。
CPU ⇔ 7210間での問題なのでしょうか・・・。
あと、よく分からなかったのですが、『割り込みはエッジでなくレベルで受ける』
というのはどういう意味なのでしょうか?

6 名前: tam 投稿日:2005/03/25(金) 12:00 ID:yJzMwyJg
 ロジアナでそこまで確認されているのでしたら、/CS、/RD、/WR、
/RS2〜0も一緒に見れば、CPUががどの動作(アセンブラレベルで)を
したときに割り込みをクリアしてしまっているかがわかると思います。

7 名前: TERA 投稿日:2005/04/13(水) 17:46 ID:.ioV1obE
返事が遅くなり有難うございました。
ロジアナで確認してみると、1回のレジスタの読み取りにつき
CPUから/RD信号が4回出ていました。
多分(というか間違いなく)それが原因で、文字が飛び飛びになっていたと思われます。
CPUはALTERAのNiosというものを使用していますが、Niosは32ビットで、
uPD7210は8ビットアクセスの設定をしているので、勝手に4回出力していたみたいです。
ハード屋さんに外部ロジックで/RD信号を1回にまとめる回路を付けてもらい確認すると
期待通りの結果(1バイト毎に受信できる)が得られました。
これでまた前に進めそうです。
貴重なアドバイス有難うございました。これからもよろしくお願いします。

8 名前: tam 投稿日:2005/04/14(木) 23:02 ID:o32/z1Y2
解決できて良かったですね。この手は不具合はハードなのかソフト
なのか切り分けるのが難しいのですが、原因がわかって何よりです。

新着レスの表示

名前 : E-mail(省略可) :

文責:計測制御技術ラウンジ, Powered by ©タカヒロ@みちのく掲示板 [12ch BBS 2.03]