Sazanami Online

PICでロジアナ

Index に戻る
やはりロジアナが無いと...
PS/2インターフェイスの送受信内容を見たりするのに、ロジックアナライザの必要性を感じました。せめてデジタルオシロがあればいいんですが、ちょっと手が出ません。
最近ではカメレオンUSBにロジアナのオプションを付けて100MHz対応のものが1万円以内で入手可能で、多くの方はこれを使ってるみたいですね。ゲームボーイに8255でI/F拡張して40MHz対応のロジアナを作っているページも見かけました。

AKI-80で作るプランもあったんですけど、すぐ欲しい。今欲しいなので、おなじみのPICマイコンで作ってみます。


設計
設計は行き当たりばったりです(汗)



ああ、でも、方針立てました、方針!!

 ・そのへんに転がっているもので安く早く作る!
 ・パチンコ液晶からもいだフラットの32K-SRAM 62256、これをPICの外部RAMとして接続
 ・最高で1MHzくらいは対応したい
 ・PICのPORTBの状態変化割り込みを利用して、データ+時間の形式で格納する

SZキーボードで40PINのPICの在庫がまだあったのでこれでいけるかな?
SRAMのアドレスでPortC,D、データでPortB、CS,OE,WE制御にPortE0-2、パソコンとの接続にPortA割り当てると入力ポートが足りないっぽいです。
PortBをデータバスに見立てて、3ステートでパルス入力とRAMアクセスを切り替える方法もありそう。でもサンプリングしてRAMに書き込むまで時間かかりそう。どうせならLV244で3.3Vの対応したけど在庫ないし。
もう1つの考え方は、PortBを4Bitごとに分けて片方を計測入力、もう片方をRAMアクセスにしてしまう方法です。8chが4chになっても大して違いは無いかもしれないし、なによりIC2個で済んでしまうのは魅力です!!まずは簡単そうなこっちでいってみます♪
(その後、時間部分が0〜15しか表現できない事に気が付くわけですが。。)

回路図です。クリックすると拡大します。


↑PageTop

材料
半分はジャンク廃材からもぎとりですが原価的に↓こんな感じ
品名内容数量値段
PICPIC16F74-20/P (877も500円になったけど在庫あるしコレ)1500円
RAMHM62256 32K-SRAM (100円の基板とかに付いてる!)1100円
セラロック20MHz140円
ICソケットDIP40P150円
抵抗1/6W : 10k11円
基板蛇の目基板-S160円
コネクタD-sub25Pメス150円
USBケーブル1/215円
ピンヘッダ10P30円
配線材リード線とか抵抗の切れ端少々-


↑PageTop

製作〜
今回の工作のキモの、外部RAM接続からいきます〜

QFPパッケージは1.27mmなので1pin置きに足を上げると、2.54mmのじゃのめ基板にピッタンコ!


A0-14のアドレス線にPortC,Dを接続していきます。ここはでたらめに繋いでもOKです♪
DATAは4bitしか使いません、ここもPortB0-3に適当に接続、あとはセラロックやISPコネクタ、電源ケーブル、パソコンとの接続ケーブルなんかを付けて完成!

なんかでっち上げた感じです(汗)


PICマイコンをソケットに挿す時は注意です。裏の足上げしたRAMは脆そう。。


↑PageTop

テスト
SRAMのread,writeテストを行うためにいくつかのコマンドを実装しました。

テスト用に規定したコマンドは以下の通りです。
コマンドコードパラメータ内容
00 NOP
01nnSet SRAM Address Low
02nnSet SRAM Address Hi
03 Read SRAM
04nnWrite SRAM
05 Read SRAM and Inc Address
06nnWrite SRAM and Inc Address


Windowsで簡単なテストアプリを書いて実行!
結果も良好♪

↑PageTop

ソフトウエェア編

直接読取りでプローブ試験
ダイレクトにプローブのビット状態を読み取って返すコマンドを実装しました。正常に機能しているようです。


ベタ読みモードで
次に、プローブの状態を読み取って外部SRAMに格納しそれを読み出すコマンドを実装しました。
1.4uS周期で32,768回のサンプリングを行い、ビット状態が同じなら同じデータがただ並んでいるだけで圧縮は行いません。いわゆるベタ読みです。これを RAW READ と呼ぶことにしました。
1.4uS周期なので0.75MHzまでの変化に対応しています。残念ながら目標の1MHzに届いていません。このコマンドは約46mSで完了します。逆に言うと46mSの間の変化しか測定できない事になります。
但し、アドレス上位バイトをカウントする為にページバンダリーが発生し、256回サンプルごとに0.8uSの遅延が発生してしまっています。

性能測定の為にパルス発生装置が必要になったので、急遽作成しました→[パルス発生機の製作記はこちら]
このパルスジェネレータは0.25MHzまでのパルスを発生しますが、Hi-Low状態を確実に捉えています。

PICに2つのコマンドを追加しました。
コマンドコードパラメータ内容
07 Direct One Read
08 RAW Read 32K

↑PageTop

テストプログラムの作成
Windowsのプログラムを作って簡単にテストしてみました。
このプログラムはDelphiで作ってあって[モーターの駆動実験]などでも使ってる、使いまわしプログラムです(汗)
PICとのインターフェイス部分など関数化してあるので、適当にボタン置いて機能実装すれば即使え実験にもってこいです。

RAW READの結果をテキストで簡易表示したところ


まだまだ完成度は低いですが、曲がりなりにも4チャンネル分のパルスをSRAMに記録してビット変化を表示する事ができました。
ロジアナとしてのスタートラインに立てたような気がします♪

↑PageTop

今後の目標
どこまでできるかわかりませんが、今後の目標として以下のような事を考えています。

・専用プログラムの作成
  せめてちゃんとグラフィック表示しないとダメですね(汗)
・開始トリガーの実装
  ビット変化や状態でサンプリング開始のトリガーとする。
・変化サンプリングモードの実装
  状態変化だけを記録するモードを実装する。
・Busy、Breakの実装
  変化のみだと短時間で終了しないので、サンプリング中にBusyフラグを立てホスト側から強制中断できるようにする。
・圧縮サンプリングモードの実装
  状態+時間の形式で記録する。

↑PageTop

PICファームウェアの機能追加
詳細機能が見えてきたのでPICにコマンド実装していきます。

プログラムはまだ400ワードくらいでかなり余裕ですが、テーブルが増えてきたのでそろそろページにも配慮が必要になりそうです。上のほうにまとめちゃえば平気っぽいですけど、それやると見通しが悪くなるので問題が発生したら対処することにします〜

ここまで行き当たりばったりで作ってきましたが、この辺でPICコマンドを整理しちゃいます。

↓こんなんなりました〜
コマンドコードパラメータリザルト名称内容
00 NOP 無操作
01nn Set SRAM Address Low SRAMの下位アドレス指定
02nn Set SRAM Address Hi SRAMの上位アドレス指定
03 nnRead SRAM SRAMからデータ取得
04nn Write SRAM SRAMにデータ保存(テスト用)
05 nnRead SRAM and Inc Address SRAMからデータ取得しアドレスをカウントアップ
06nn Write SRAM and Inc Address SRAMにデータ保存しアドレスをカウントアップ
07nn Set MAX DATA LENGTH Hi アドレス上限(最大データ数)を設定
(256バイト単位)
08nn Set MAX DATA LENGTH Low(Reserve)未実装(予約)
09nn Set Triger Type トリガタイプの指定
コードトリガタイプ
00N/A
01ch.0 Level=Low
02ch.0 Level=Hi
03ch.0 Edge=UP
04ch.0 Edge=Down
05-0F(Reserve)
1nALL Level=n
20-FF(Reserve)
0A-0F (Reserve) (予約)
10 Get SRAM Address Low SRAMの下位アドレス(データ格納数下位)の取得
11 Get SRAM Address Hi SRAMの下位アドレス(データ格納数上位)の取得
12 nnDirect One Read 直接のデータの取得
13 RAW Read ベタ読み
14 Change Read 変化読み
15-FF (Reserve) (予約)

あんまり整理されてない気が...(汗)

↑PageTop

ロジアナアプリの作成
目標にしていた事が次々と実現できるのは嬉しい事です。

・専用プログラムの作成
  Windowsのロジアナアプリを作りました。8倍まで拡大してグラフィック表示します。

・開始トリガーの実装
  7種類のトリガモートを実装しました。0チャンネルのレベルトリガ、エッジトリガ、それに全チャンネルのレベルでトリガできます。

・Busy、Breakの実装
  長いサンプリングやwait状態でもホストから中断できるようにインターフェイスを見直しました。

・変化サンプリングモードの実装
  状態変化だけを記録するモード change Read を実装しました。

PICロジアナとパソコンはパラレルポートを使った3線式のシリアル転送で、自作回路で使いまわしているヤツなのですが、32kByteのサンプリングデータを転送するのに10秒近く掛かってしまいます。9600bpsのシリアル転送だと30秒も掛かるので、PICに負担を掛けないで高速転送ができているのですが、使い勝手が悪いので読み取りバッファのサイズをスライドバーで指定するよう機能追加しました。バッファサイズのデフォルトを2kとすると1秒以内に結果が表示されるようになりました。快適〜♪

UP-EdgeトリガでRAW READしたところ


アナライズはまだ非常に簡単なものです。
サンプリングできたデータ数とそれに要した時間(下の2kのRAW READでは2.87mS掛かっています)、各チャンネルのHi,Lowレベルおよび、UP,DOWNエッジのカウント数しか表示していません。エッジのカウント数はおよそのパルス数となります。例えばCSがLowの間のパルスをカウントなどのように、指定範囲した範囲のカウントができれば、信号解析に役に立つと思います。今後の課題ですね;^_^
データ量が多いと横スクロールでみていくのも大変になるので、状態が変化した所までスクロールジャンプする機能もチャンネルごとにあれば便利そうです。アイデアは色々出てくるのですがムダな機能付けても操作が複雑になるだけです。実際に使用しながら必要な機能だけを追加する方向で行く事にします。

さて、目標はほぼクリアできましたが、状態+時間の形式で記録する圧縮サンプリングモードが残っています。初期の方針では「PICのPORTBの状態変化割り込みを利用」なんて言ってたのですが、割り込みはレジスタ退避やフラグの再設定などのオーバーヘッドがかなり大きい事をパルス発生機の製作で痛感しました。経過時間の測定はタイマー使うのが楽そうなのですが、オーバーフローフラグだけ見てすべてメインループで処理しちゃう方法も試さないと、RAW Read の0.75MHzよりかなり精度が落ちてしまいそうです。難関のような気がします(滝汗)

くらくらしてきました..



つづき。。。

PICに焼いては実行の連続なので、ISPケーブルに切替スイッチとリセットつけました。
TMR0で経過時間を計る作成は大成功でした。プリスケーラを細かく調整すれば00-FFの範囲でも長時間計測が可能になります。データはチャンネルの状態4Bitと計測時間の8bitも4bitに分けてこれにオーバーフローフラグを加えて4ワード1計測のデータ構造にしました。メモリが無駄になりますけど凝った事やると実行速度に影響しますからね;^_^
トリガー待ちの後でTMR0の割り込み許可するとすぐに割り込みが発生してしまうバグに悩まされましたが、要員フラグのリセット部分を修正して解決♪

いつ事故が起きてもおかしくない、緊張感の漂う環境!


Winアプリ側は大きな変化は無いです。
新機能の Comp READ 実行ボタンと、タイマのプリスケーラの設定ボタンが増えてます。0-255で表す時間の単位を0.2-51.2μSで切り替えできます。これをRes(解像度)と呼ぶことにしました。時間計算は 〔 ループ係数+タイマ値×解像度係数 〕をデータ数ぶん累計(1つめのデータは除く) で正確に計算しました。あわせてRAW Readの256データごとに0.8μSの遅延も時間計算に盛り込みました。
最大で100秒以上の計測が可能になったので、pulse width に /2〜-/8 の縮小ボタンを追加しました。
Comp READ ではオシロで見たのに非常に近い波形が見れ、全体のディティールを掴むのに役立ちそうです♪

ALL-Lowトリガで16K-buffでComp READしたところ


というわけで、無事に完成しました♪

プラケースとICクリップ買ってこなくちゃ。。

↑PageTop

さっそく活用!!
ロジアナが完成したので、PS/2キーボードの信号の解析に使用しました。

これに伴なってプログラムも機能を2つ追加しています。

 ・計測結果をキャプチャしてクリップボードに転送する COPY ボタンの追加
  エクセルなど他のWindowsアプリケーションと連携がとりやすくなりました。

 ・分析機能:2進数テキスト化ボタンを追加
  CLKの立ち上がり時のDATをビット化し、長時間経過で改行します。

 活用編へ → 
↑PageTop

E-mail : saza00@mail.goo.ne.jp Index に戻る