● 実験テーマ53
「PIC32MX_簡易4CHロジアナの実験」
(前からやってみたかったロジアナの実験を、PIC32MXトレーニング基板でやってみました。)
■ 2014.7.3
・オシロ_V6も、HP公開まで済んだ。
次期テーマ53を何にするか? 候補を列記すると次のようなものが考えられるが・・・
<候補>
@ 簡易ロジアナ
A WAVプレーヤ
B 高速ADCを使った、オシロ_V7
C パワエレ関係(D級アンプ他)
D MP3プレーヤのソフトVUP(連続曲送りの追加)
・簡易ロジアナをやるとして、ロジアナとオシロでは何が違う?
@ まず、ADCは不要
A デジタルのみでハードはよいはず。(2値のみ扱う)
B つまり入力の、Hi, Lowレベルの判別は、'0'か、'1'かの1bitで事足りる。
1バイトのメモリを用意すれば、8CH分の、レベル判別ができる。
・どういうのを作るの?
@ 実際、実験機として作る時は、4CH入力でよいと思う。
A PCを利用する方法は却下。スタンドアロンにする。(カラーQVGA液晶表示)
B WEBには、外付RAMを使った例が多いが・・・(要検討)
■ 2014.7.4
・しかし、ロジアナをやるのは初めてだし、敷居が高い気もする。
・もう一つの案は、「3CHオシロの実験」が考えられる。
既に、TRIG CH含めて、4CH同時サンプルの確認が出来ているので進めやすい。
ただ、あと1CH、同じアナログアンプが必要なので面倒なのがネックになっている。
・迷っててもしょうがないので、一応、「簡易ロジアナ実験」の方向で進めることにした。
ざっと構成案を考えてみた。
<構成案>
@ CH数: 4〜 8CH
A サンプリング周期: 数100u〜 1uSまでの間で、数点DSWで選択可
B 表示: 2.8インチ・カラーQVGA液晶(320x 240dot)横置き表示
C PIC: PIC24Hか、PIC32MX
(実験をトレーニング基板でやるのは、PIC32MXの方が使い易い。)
D 他ハード構成:トリガ+アドレスカウンタ+SRAM
WEBでは、これらを全てハードロジック(標準ロジックICとか、CPLD,
FPGA)
で構成している例も多数見られるが、ここは簡単な構成を目指したいので、
PIC内のハードを使い、全ては、ソフトでコントロールできたらと思っている。
■ 2014.7.7
・今日は、ざっとではあるが、実験プログラムの1辺を考えてみた。
極シンプルな条件で実験してみる。
T1割込み(サンプル周期)関数の中で以下を実行。
@ トリガ・ソースは、CH1のみとする。
まず入力パルスのエッジ・センスを行う。(最初は、立上りのみでよいだろう。)
A 入力データ(4CH分)をメモリ(SRAM)に書込む。
B SRAMアドレスを、1つ進める。
C アドレス= FULLになったか判断し、FULLでなければ、Aに戻って繰返す。
D FULLであれば、書込みを終了させる。
E データ収集が終了したら、EndFlagをセットする。(割込み処理は基本ここまで)
F メインで、EndFlagを確認し、セットされていたらQVGAにメモリの内容から
判断したロジック状態(Hi or Lo or 立上り or
立下り)を液晶に、
1画面分表示する。
G 測定・表示更新サイクルは、1秒とする。
※ こう見てくると、この流れの基本は、今までやってきた自作オシロの流れと
一緒であることがわかる。
・ハード構成他も整理してみた。
@ 外部メモリ・外部カウンタは使わない。
A PICは、3.3V系のPIC32MX340F256H(Fcy=
80MHz, DATAメモリ:32kバイト(256kビット)
を使う。
B 入力CH数は、4CHとし、PICの+5Vトレラント仕様のピンに割り当てる。
C 2.8インチ・カラーQVGA液晶(320x 240dot)横置き表示とする。
D 確認が容易に出来るように、HOLD SWと、TRIG MODE SW(トリガ・スロープ切替)を用意する。
E サンプリング周期: 数100u〜 1uSまでの間で、数点DSWで選択可にする。
F プログラムは、全てC言語で記述。
・液晶画面デザインも考えてみた。
通常、ロジアナでは、オシロのような、時間軸目盛(座標ライン)は引いてなく、画面の上の方に
時間経過の目盛が引かれていて、必要なタイミング時間を見るには、時間カーソルを移動させて
時間を読取って表示するようになっている。
今回は、簡単な実験なので、オシロ方式の座標目盛を用意し、SMPLE周期と、1目盛当たりの
時間(*S/D)及び、トリガエッジ極性を液晶右下に表示させるようにした。
尚、最初のプログラムは、トリガ極性はポジティブのみで、SMPLE周期のみの表示にした。
今回のは、ロジアナというより、ロジックスコープといった方がよいかも・・・
■ 2014.7.8
・今現在考えているテストプログラムは、リピート・トレース・モードで、オシロで言う
ノーマル・トリガ・モードに相当する。
とりあえずこれでソフトの感触を見て、基本的な考えに間違いがないか確認してみようと思う。
・今回、独自に考えなければならないのは、
メモリの内容から判断したロジック状態(Hi
or Lo or 立上り or 立下り)を液晶に、
1画面分表示する関数である。(その他にも割込み関数等あるが・・)
以前作った自作オシロの、Oscillo関数に相当する部分である。
この部分の関数名を、「LogAna」とした。
<LogAna関数を考える>
・ロジック状態を判断するために、前回のデータと今回のデータを比較して
@ Loレベルで変化がなかった場合→ Loレベル描画(Lo側へドット表示)
A Hiレベルで変化がなかった場合→ Hiレベル描画(Hi側へドット表示)
B 前回が、Loで今回が、Hiだった場合→ 立上りとして描画(ライン表示)
C 前回が、Hiで今回が、Loだった場合→ 立下りとして描画(ライン表示)
のような判断・描画をしなければならない。
・ポイントは、判断と描画のタイミングである。
最初のサンプルのエッジ検知は、検知と、バッファメモリへの格納は行うが、描画は、
トリガを検知してから2回目のサンプルの時から行うという点である。
ロジック状態の変化を判断するためには、前回と今回の2つのサンプルが必要になる
ので当然と言えば当然だが・・・
つまり、バッファポインタ:index= 0;からでなく、index=
1;から描画することになる。
・この他、比較方法のロジックなど検討して、テストプログラムを書き終えた。
■ 2014.7.9
・HEX焼きまでOK。
<動作確認>
@ まず、STARTメッセージ表示の後、動かない。
→ T1割込みに入ってこない。
これは、イージーミスで、T1割込み許可の、Config記述が抜けていた。
この修正で、割込みルーチンに入ってくるようなった。
CH1入力のエッジセンスは動いていて、メインループは回っているようだが、表示が全く
駄目。
今、CH1のみに、1kHz 3Vレベルの矩形波を入れているのだが、表示はHiレベルのままに見える。
A また、サンプリング周期を切替ても、200uS表示のままになってる。
・気ずいた点あり。
今回、ADCは使わないので、これと連動しているT3以外を使おうと思って、T1を使っているのだが
T1には、内蔵プリスケーラの分周設定の中に、1/2(マクロ記述で、T1_PS_1_2)がないことに気が
ついた。
そこで、いつものT3を使うことにした。
どうも、ADCに連動で使うT3(ADC割込み)の設定(マクロを使わないレジスタ直接アクセス記述)
では上手く行かないようだ。
T3を単純タイマ割込みで使う場合は、マクロ記述(OpenTimer3()での記述)にしないと駄目だった。
・Aについては、DSW-1出力を読込めなく、サンプル周期表示:SMP=
**が変化してないようだ。
この原因は直ぐわかった。
最初はハードを疑ったが、ハードには異常なく、結局は、ポートのイニシャライズの最初に
やるべき、アナログ・ピンにするか、デジタル・ピンにするかの設定を、今回は、全てデジタル・ピン
として使うので、デフォルトのままでOKだろうと省略したのがいけなく、
AD1PCFG= 0xFFFF;を追加してOKになる。
・これでようやく動き出した。(深夜0:30頃)
SMP表示OK
ロジック表示は、まともでないが、CH1の時間軸が、サンプル周期設定と合っていることを確認した。
SMP= 10uSにて、1目盛500uS、CH1のみに1kHz入力時、2目盛で、1周期になっている。
しかし、表示ポジションが上にずれているようである。
Hiレベルのラインしか表示してないように見える。
<対処した事>
・プログラムミス
バッファの内容から、ロジック状態(Hi or Lo or
立上り or 立下り)を判断するルーチン
を、引数によって、各CHで共通に呼べる関数にしたが、その関数の中で、CH毎に
右ビット・シフト数を変えなければいけないところ、そうしなかった。
・それを直したら、2CHに同じ周期の矩形波入力時、大方動くところまで来た。
まだまだ表示がおかしいが・・・
Hi, Loレベル表示は、OKなのだが、立上り・立下りのエッジ表示が、とんでもなく下に
ずれて表示されている。
ただ時間関係は合っている。
また、座標ラインと、Loレベル描画が少し上にずれている。
・この時の画面写真は撮ってませんでした。
文章だけだと、ちょっと解りにくいかもしれませんが・・・
■ 2014.7.10
・さらに調査を進めた。
1つ発見!!
channel引数の値に記述ミスあり。
CH1指定の時は、channel= 1, CH2指定の時は、channel= 2
これはOK
CH3指定の時は、channel= 4, CH4指定の時は、channel=
8としなければいけないところ
CH3指定の時、channel= 3, CH4指定の時は、channel= 4としてしまった。
ここは、ビット・シフト数と連動するところなので、ビット位置とCHが対応してないとまずい。
ここは、マクロで記述した方が解り易いので、そう記述することにした。
この修正で、CH3と、CH4も、エッジ表示位置はずれるが、レベル表示は正常に出る
ようになった。
下の写真を参照してください。(4CHともに、1kHzの矩形波を入力して確認)
・結局、この問題は、座標位置の考え方が、ドット描画関数(Glcd_Pixcel)と、ライン描画関数(Glcd_Line)
で異なっていたことが原因だった。
※ 両方の関数ともに、左上角が、原点(0,0)と思っていたのだが、ライン描画関数(Glcd_Line)は、
左下角が、原点(0,0)であった。
これを、実証した時のメモを下にアップします。
・この問題を修正したら、今度は、まともな表示になった!!
CH1の、Loレベル座標線が表示されてませんが、その部位分のプログラム記述が抜けていた
だけなので、あしからず。
■ 2014.7.11
・昨日の、座標指定修正で、描画が変になる問題は解決した。
これで、今回最初に考えていたことは大方クリアできたが、あと何点か追加、確認したいことがある。
<追加機能等>
@ 見栄えの問題だが、
現在の各CH表示は、ちょっと上に寄りぎみなので、下に下げて見栄えを調整してみる。
A SMP= *uSの表示の他、デビジョン表示(*uS/D)も追加する。
まあ、通常のロジアナでは、この表示は無いのが普通だと思うが、今回は簡易実験ということで
固定目盛にしたため、これを追加する。(オシロと同等)
B TRIG MODE SW機能のソフトを追加する。
立上り他、立下りをセレクトできるようにする。(レベルトリガは省略)
オシロと同じように、時間軸レンジ表示の前に、そのキャラクタを表示させる。
C サンプル周期の細かい(サンプル周波数の高い)方がどこまが上限か確認する。
1uSはOKなので、0.4uS, 0.2uS(これは無理かもしれないが・・)
の2つを追加すれば様子が判ると思う。
・@〜Bの修正〜確認はOK!!
Cについては、サンプル周期は、1uSが上限であった。
(0.4uS, 0.2uSは、正しく矩形波周期が変化しなかった。)
■ 2014.7.12
・これで、追加機能もOKになったので、今日はタイミング波形のサンプル取りを行ってみた。
何をターゲットにしようか迷ったが、結局バイナリカウンタの4bit出力を見るのが一番
解り易いと思い、ターゲットのロジックICを、ジャンク箱より探し始めた。
目当ては、74HC393であったが、393は無く、それ以前の、74LS293が2個ジャンク箱に
あった。
相当昔のもので、ICピンも黒く錆びついているように見える。
これで動くのかと思いながらも、早速4bitバイナリ16新カウンタとしての配線を始めた。
その時の実験の様子と、タイミング波形のサンプルは本ページのトップの写真を参照してください。
今回の実験はここまでです。
今後の課題ですが、これと同じバージョンの、6CH入力化を考えています。
8CH入力といきたいところですが、今の横置き表示では、描画が、きつきつになりそうです。
縦置き表示ということも考えられますが、ライブラリをいじる必要があります。
また出来れば、収録メモリエリアを増やし、横スクロールでメモリ全体を見れるようにも
したいと思っています。
(今のところ、出来るかどうか自信がありませんが・・・あくまで課題です。)
<最終回路図>
・こちらから、どうぞ→ 「PIC32MX_簡易4CHロジアナ実験 回路図」
<最終ソース及び、ヘッダーファイル>
・こちらから、どうぞ→ Easy_4CH_LogAna_TEST.c
colorlcd_libdsPICVH.c
colorlcd_libdsPICVH.h
ASCII12dot.h (12*12_フォントデータ: 後閑氏が作成された、アスキー文字データに、オシロ用特殊キャラクタを追加)