● 実験テーマ13
「自作オシロのバージョン・アップ:第1章」(PICの選択〜GLCDテストまで) ※ 131126 一部修正更新
■ 2012.01.18
<自作オシロのバージョン・アップ計画案>
・現在のオシロは、PIC24HJ12を使用した、PICの大御所「後閑氏」の製作例を参考にさせて頂き、自分なりに
手を加えて作り上げたものです。(GLCDのライブラリは後閑氏作成のものを使わせて頂きました。)
外観は「電子工作の部屋」の表紙に写真掲載していますが、これは本体だけで、これとは別にアッテネータ
基板を追加して、ある程度のレンジ化を行い使っております。
しかしこれには、以下に示す問題点があり、これらの問題点を改善したバージョンのオシロを製作しようと
思い立ちました。
<現在の自作オシロの問題点>
@ 電圧が直読できない。
→ いちいちOFFSET及び、GAINトリマによって目盛り合せしないと使えない。
A 直流電圧が正しく測定できない。
<改善案>
@ 現在は、時間軸のみの表示だが、電圧レンジと、AC/DCモード表示を追加する。
表示例を下に示す。(以前のバージョンの画面を加工しました。)
A AC/DC切替と、レンジ切替(GAIN切替)をアナログSWに置き換えPICポートから制御する。
B ZERO調のみポテンショで行い、GAINの定数切替はソフトで行う。
C AUTO/SINGLEのトリガモード切替SWを増設し、SINGLEモード時は、READYボタンが押されたら、信号待ちに
し、入力された時点で 1回だけ256サンプルして波形表示→ 再びREADY待ちにするという動作を繰り返す。
このようなシングルトリガ機能を追加しようと思うが、とりあえずハードのみ用意しておいて、ソフトはこの機能
抜きで作成し次のステップで検討しようと思う。
(画面にモードを表示する場合レイアウトを考えないといけなかったりする。)
D DCモードに関しては、これから検討が必要だが、回路変更を考えている。
<これらを実現するための問題点>
@ 現PIC(PIC24HJ12GP202)では、ポートが不足しているため、他のPICを 探す必要あり。
→ 秋月で安価に入手できる44PIN_QFPの「PIC24HJ32GP202」をこの時点では考えていたが・・・
■ 2012.01.22
・改善案を盛り込んだ回路図作成終了したは良いがここで迷いが・・・
■ 2012.02.04
・この時点では、MPUには、秋月で安価に入手可能な、PIC24HJ32GP202にしようと思っていた。
44PINのQFPで、ピン間ピッチが0.8mmなので、ポート数は十分だし自力でハンダ付けもギリギリ可能であったので、
これに決めて回路図を書き始めたがひとつ迷いがあった。
現在使用しているバージョン7.52のC30コンパイラでは、当該PICのヘッダーファイルがなくコンパイルができない。
かといって最新バージョンのコンパイラをXPパソコンにインストールするのは、自分の方針(開発ツール関係のソフトは、
別パソコンにインストールして使う方針にしてる)にそぐあない。
また、別パソコンというのが悪いことに、OSがMEなので、旧バージョンのものは、かろうじて動いているが、最新バー
ジョンは動かない可能性が非常に高い。
そこで、最新版のインストールは断念して、現バージョンのC30をそのまま使うことに進路変更した。
・V7.52_C30でサポートしている、PIC24HシリーズのMPUでポート数の多いものというと、プロダクトファミリに分類される
ものには無く、汎用ファミリから選ぶしかなくなる。
→ 結局、「PIC24HJ64GP206」に決めた。
・ここでまた、1つ問題が・・・
このパッケージ:TQFP64は、ピン間ピッチがさらに狭く、0.5mmなので自力でハンダ付けは無理。
(ダイセン電子の変換基板に実装)
迷った挙句、マルツ・パーツ館の実装サービスを初めて利用することにした。(それ相当の出費になってしまいますが・・・・)
■ 2012.02.06
・MPUを、PIC24HJ64GP206に変更するに際し、ポート数が多数余っているので、以下のI/Oを追加することにした。
@ HOLD/RUNスイッチ
A READYスイッチ+トリガモード切替スイッチ(シングルトリガ機能)
・最初のソフトは、この2つの機能は省いて作成予定(第2段で予定)
■ 2012.02.07
・1度作成した、PIC24HJ32GPの初期設定を、PIC24HJ64GP206用に変更する検討をした。
■ 2012.02.08
・水魚堂での回路図修正(MPU変更に伴う修正)を開始した。
■ 2012.02.09
・ハード上で1つ心配なことがある。(何故か心配なことばかり・・・)
それは、レンジ切替用にアナログSW:TC4052を使用しているのだが、この素子のコントロール入力(A, B)と、
PIC出力ポートのレベル間の相性に問題は無いのか?ということだ。
調べたら、直結できないことが判明。(Vih=2.75Vに対し、PICのVoh=2.4Vmin)
上手いことに、PIC側のレジスタ設定で出力をオープン・ドレインに設定できるので、この制御ポートだけは、
O.D設定にし外部にプルアップを追加して対処することにした。
■ 2012.02.11
・回路図修正終了
■ 2012.02.13
・「Scope_V2」のデバッグの前に、初めて使うMPU:PIC24HJ64GP206の評価のため、GLCDテストプログラムを作成
して感触をつかむことにした。
・GLCDテストプログラムは、後閑氏作成の、PIC24HJ12版があるので、それをPIC24HJ64と、本ハードにカスタマイズ
する形で作成しようと思う。
■ 2012.02.14
・最初のコンパイルでエラー発生
メインモジュールのConfigワードの設定のところがSyntax Errorになっている。
→ _FOSC, _FPORの記述が、PIC24HJ12と、PIC24HJ64では異なることが原因していた。
修正してコンパイルOKになる。
■ 2012.02.15
・初期設定記述まで済んでいる、「Scope_V2.C」の作成を続行。
その前に部品リストを作成して、部品手配することにした。部品到着の間に、ソフト作成すればよい。
■ 2012.02.16
・部品リストを作成し、部品手配済
■ 2012.02.17
・秋月手配分の部品到着。
マルツ手配分の部品到着まで、「Scope_V2.C」のレンジ切替SWの読込みルーチンを検討後、全体をまとめ、
「Scope_V2.C」のプログラム作成が終了した。
→ コンパイル結果
@ ADC1BUF* 未宣言エラーが発生
→ PIC24HL64には、ADC1BUF0の宣言しかない無いことが判明。・・・・もしかしたら・・・
・マルツ手配分の部品も夕刻到着した。
<重要な事項発覚>
・PIC24HJ32も、HJ64もADC構成は、PIC24HJシリーズなので同じだと思い込んでいたが、違っていた。!!
※ PIC24HJ64のソースをコンパイルしたら、ADC1BUF0以外のADC1BUF1〜Fの未宣言エラーが出て、そこで
初めてMPUデバイスのヘッダーファイルを確認した。
→ PIC24HJ64には、ADC1BUF0しか宣言されてないことが判明。
またハード的にも、HJ64には1つのADCバッファ(ADC1BUF0)しか無いことが判明。
さてどうするか??
→ よく判らないが、HJ64に新設された、DMA機能を使えば何とかなるのでは?
(なんて言った物の、DMA自体未経験だし・・)
■ 2012.02.18
・HJ64GPのADCをDMAと連携して動かす設定を検討し始める。
残念なことに、PICでDMAを使った製作例が、WEB上に見当たらない。
PIC24HJのDMAだけのマニュアルにADCのサンプルコードが載ってるのでそれを参考に暫くは考えてみることにする。
・このソフト上でのDMA処理が確立するまでは、部品は揃っているがユニバーサル基板製作には入れない。
■ 2012.02.20〜2012.02.21
・DMAソフト設定検討続行
■ 2012.02.22
・何とか、DMA部のソフト設定が確定しコーディング終了
早速コンパイルしたがワーニング発生
→ DMA割込み関数のパラメータオプションで、auto_psvを追加しないとワーニングになるので追加しOKになる。
■ 2012.02.23〜2012.02.29
・ようやく基板製作開始
今回は、基板サイズも大きく、部品点数も多いためユニバーサル基板製作完了まで、6日間かかってしまった。
最終日、愛用のANTEXの半田コテがついに壊れてしまった。(原因不明、ヒーター切れか??)
■ 2012.02.29
・ユニバーサル基板製作完了後のチェックを行う。
@ ショート・チェック
VCC-GND, AVCC-GND, -AVCC-GND, +5V-GND, -5V-GNDの各間、ショートしてないことを確認。
A 無負荷時電源電圧チェック(GLCD実装、IC未実装)
VCC=+3.29V, AVCC=+3.25V, -AVCC=-3.29V
+5V=+5.10V, -5V=-4.61V
→ -5Vがやや低目なので、次の修正を行う
-5V(アナログSWの負電源)は、GLCD内蔵の負電圧出力≒-6Vを利用し簡易的に5Vのツェナーで、-5Vに定電圧化
しているが、ツェナー電流を決める抵抗の値が10kと高目に設定してあったので、これを1kまで下げ対処した。
これにより、-4.97Vまで上がったので問題なし。
B ICピン等、供給点での電源電圧チェック(IC未実装)
MPU: VCC=3.30V(計4PIN), AVCC=3.35V(19PIN)
GLCD: VCC=3.30V
PICkit2コネクタ: VCC=3.30V
IC1(OPアンプ): AVCC=3.25V, -AVCC=-3.29V
IC2(OPアンプ): AVCC=3.25V
IC5,6,7(アナログSW): +5V=+5.10V, -5V=-4.96V
■ 2012.03.01
・アナログアンプ系のチェックを行った。
アンプ部のICを実装して、アナログアンプ系の単体動作チェックを行う。
※ PIC未実装の状態では、全てのアナログSWの制御ピン(A, B)が共に、"Hi"になっているので、アナログ・コンディションは
ACモード/ATT=1/100/2ndアンプGAIN=10倍(トータルGAIN=100倍)
→ 入力3Vp-pで、3rdアンプ出力(AN0入力)が、3Vp-pになるはずである。
・まずアナログSWのみ実装して、±5V系の電源電圧を確認
+5V=+5.10V, -5V=-4.95Vで、OK
・次に、OPアンプ2個実装して、AVCC、-AVCCを確認→ OK
IC1: AVCC=3.17V, -AVCC=-3.19V
IC2: AVCC=3.17V
(この状態でも、+5V=+5.10V, -5V=-4.95V)
・ソフト・オシロ2の音源から、3Vp-pのサイン波を入力しオシロ入力 対 IC1-7pin(AN0入力)を観測してみた、出力に、
3Vp-pのサイン波が出力されているのを確認した。また、OFFSETポテンショも効いている。
■ 2012.03.02
・ここまで、PICを実装しない状態での各電源電圧及び、ポテンショ・SW類の配線、簡易動作確認済みでOKになっている。
・またGLCDテスト用のプログラム及び、HEXファイルも用意できた。
・お膳立ては出来たので、次の確認項目を実施した。
@ PICを実装し、HEXを書込まない状態での各電源電圧をチェック
→ 次の結果通リOK
PIC: Vcc=3.29V(Vddピン:10pinにて確認)
AVCC=3.14V
OP AMP: AVCC=3.14V
-AVCC=-3.18V
アナログSW: +5V=5.10V
-5V=-4.95V
A 上記OKなので、GLCDテストHEXファイルを書込んでみた。
→ PICファミリーをPIC24に設定し、HEXファイルをインポート
無事、HEXファイルの書込みに成功
・ようやくGLCDテストのデバッグ開始
@ まず、画面半分しか表示されない。(CS1側の右半分が表示されない。)
A 一応それぞれのテストCASEは実行されているようだが、CS2で制御される左側半分しか表示されない。
<調査>
@ ハード的にGLCDピンとPICピン間の、CS1、CS2信号は繋がっていることをテスターにて確認
A 当該信号のPICポート割付もOK
B CS1,2のポートdefineもOK
C ソフト・オシロ2にて、TEST_CASE_5(長方形のサイズが次第に小さく描画されていくパターン)を実行中の、CS1、CS2
を観測した。
→ オシロの簡易プローブ容量の影響でノイズの影響を受けやすい状態になっているが、以下のような波形が取得できた。
これを見る限りは、ソフトオシロ2の帯域不足で十分追従できてない部分もあるが、レベルも大方のタイミング(互いに
オルタネートの関係になっている)も問題なさそうなので、半分しか表示されない原因は別に有る模様??
■ 2012.03.03
・表示されないCS1側のみアクセスするようにして、ソフトオシロ2でタイミングを見てみることにした(lcd_Write関数の検証を行う)
<結果>
ソフトオシロ2で見るため、E幅を1u→ 250uに広げ、関数処理後の遅延定数を5u→ 500uに変更して、data=0(白:dot無し)
をフィルしている最初の関数処理をループさせてタイミングを見た。
→ R/W→E→CS1のタイミングはプログラム通りになっていることを確認。(大方、よさそう)
・また比較のためCS2側も見たが同じであった。
■ 2012.03.04
・GLCD制御信号は良さそうなので、データバスを観測してみた。
動きがオシロで判り易いように、デバッグ用に、TEST CASE7を増設して行うようにした。
その内容は、CS1側のPAGE0、Colume Address=0x40位置から、data=0x0Fと、0xF0を交互に出力するようにして
反転パターンを確認する内容である。
<TEST CASE7の試験用ループ記述>
// timming debug
lcd_Clear(0);
lcd_Write(1, 0xB8, 1); // Set CS1 Side, Page0
lcd_Write(1, 0x40, 1); // Colum reset
while(1) {
lcd_Write(1, 0x0F, 0); // Set Data 4dot Black + 4dot White
lcd_Write(1, 0xF0, 0); // Set Data 4dot White + 4dot Black
}
・24HJ12_OK版のタイミングを見ることにした。
R/Wの立下りに同期したデータタイミングを見たかったが、プローブ容量の影響かPICのR/Wポートピンにプローブを接続
するとソフトが止まってしまうので、しょうがなく、CS1対DB0のタイミングを観測することにした。
→ 下図の通り、反転パターンが確認できた。
・ここで、本題の、PIC24HJ64_NG版で、CASE7を実行しても当然、何も表示されない。
・ここで新たなことに気が付く。
TEST CASEを切替えている、TSWが読込めなくなることがあるようだ。
例えばTSWを、0→1→2→1と途中でTESTケースを切替えるとおかしくなる。
この時、TSW(10進ロータリーDIPSW)の各出力をチェックすると、TSW-1はOKだが、TSW-2及び4は出力レベルの関係が
途中でおかしくなる。
■ 2012.03.05
・昨日の問題、一つはプルアップ設定があやしいが、ここで1つ判明した。
※ TSW-1,2,4ビットのプルアップ設定(CNPU)には問題ないことが判った。
→ CNPUレジスタの初期設定+GLCDの初期設定の後でブレークをかけTSWのプルアップ状況を確認し問題ないこと
を確認した。
・TSWが読込めなくなる原因が判った。
→ lcd_Read関数中で、DB0〜7のバス方向を切替えているところが2箇所あり、ここもTSWのポート・ビット位置を変更した
のに伴い、変更する必要があった。
※DBを入力にする場合: TRISB = 0xFF0F→ 0xFFFFに修正
DBを出力にする場合: TRISB = 0x000F→ 0x00FFに修正
→ これをしないと、TEST CASE1(斜線描画)、5(長方形描画)、6(カーブ描画)の時に、PORTBのTSW入力が一時的に出力
になり、TSWが読込めなくなっていた。
・これを直しても、半分しか表示されない問題は別であった。
・昨日やった、CS1 対 DB0、 CS1 対 Eの観測を、24HJ64_NG版でもやってみたが、24HJ12_OK版と同じタイミングにしか
見えない。要は基本的には、DBポートの制御方法には問題無いと言えると思う。
■ 2012.03.06
・画面半分が表示されない件、調査続行。
想定原因として、次が考えられる。
→ 今までの調査で、GLCD初期化後の、制御に問題は無い模様。単に、GLCDの初期化が上手く行ってなくて、ディスプレイ
ONになっていないだけかも??
→ そこで、次を試行してみた。
lcd_Initルーチンに於いてやっていることは、ディスプレイONと、画面の'0'フィルだけなので、CS1側のディスプレイONと、
CS2側のディスプレイONの順番を逆にした時、症状も逆(CS1側:OK/CS2側:NG)になれば、最初の遅延時間の設定
の問題があるのかもしれない??
<lcd_Initルーチン>
void lcd_Init(void){
Delay1m(10);
/*
lcd_Write(1, 0x3F, 1); // Display on
lcd_Write(2, 0x3F, 1); // Display on
lcd_Clear(0);
*/
lcd_Write(2, 0x3F, 1); // Display on
lcd_Write(1, 0x3F, 1); // Display on
lcd_Clear(0xFF);
}
'0'フィルだと画面クリアなので、DISP_ON状態の判断ができない。
そこで、lcd_Clear(0xFF);として、黒ベタにして判断。
→ 想定通り、症状は逆になり、CS1側が初めて表示した。
・ここで頭の遅延を、10m→1000mとしても症状変わらず。頭の遅延は関係ないことが判明
・暫くリストを眺めていたら次の事に気が付く。
それは、GLCD制御ビットの内、LCD_Eのみしか、Lowに初期化してないことだ。
後閑氏のリストでは、R/W, DI, CS2もHiに初期化している。
→ 他の制御ビットも初期化する修正を施し、これでめでたく、両サイドの画面がONになり、正常に表示されるようになった。
・ここで1つバグを発見
<症状>
TEST CASE6(2Dグラフでカーブを描画)設定にしておいて、電源を立ち上げるとCASE6の描画がおかしくなる。
<原因>
CASE6で使っている変数「i」は、初期化=0が必要なのに初期化されてなかった。
またこの「i」はグローバル変数にする必要があるに、メインループ(while(1))の頭で宣言されていたので、プログラムの頭
で宣言するように修正した。
→ これでOKになる。
■ 2012.03.07
・これで一通り動いたので、本題である「Scope_V2」のデバッグに移ることにする。
<最終回路図>
・こちらから、どうぞ→ 「PIC_オシロスコープ_V2
回路図」
・131126
修正更新→ 「PIC_オシロスコープ_V2_回路図」の一部を修正し、置換えました。
その背景・理由については、実験テーマ36の、冒頭(2013.7.30)の朱書きコメント
を、参照してください。
<GLCDテストのみの、最終ソース及び、ヘッダーファイル>
・こちらから、どうぞ→ GLCD2_PIC24HJ64.c
glcd_lib1_pic24hj64.c
font.h (フォントデータ: 後閑氏が作成されたオリジナルに、トランプ絵柄などの自作データを追加しました。)
imagedata.h (イメージ・データ: 後閑氏が作成されたオリジナルに、WIN標準のお絵かきソフトで書いたオシロのイメージを追加しました。)
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ14へ →