● 実験テーマ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へ →