● 実験テーマ23

「PIC32MX_カラー・グラフィック液晶の、表示実験」
(液晶に搭載されている、コントローラチップが明確でなく、動くまでかなり悩みました)

■ 2012.11.14
  ・最初は、出費を抑えるために、手持ちの128*64_GLCDを、活用しようとも考えたが、後閑氏のHP
   に載っている漢字表示の例は、ライブラリのみの紹介で、そのテストプログラムは公開されてない。
   また、128*64_GLCDを使った、MP3プレーヤも載っているがソフトは公開されてない。
  → 128*64_GLCDを使うのは、やめた。
  → ノキア製の、カラー液晶のテストをやってみるか・・・
     これなら、後閑氏のHPにも、本にも載っているのでやり易い。

  ・結局、ノキア製の携帯に使用されていたカラー液晶が実装された
   SparkFun製の、「LCD-11062 ColorLCD-BreakoutBoard」を、ストロベリー・リナックス社に、
   注文することにした。(1セット 4780円)


■ 2012.11.16
  ・SparkFun製の、「LCD-11062 ColorLCD-BreakoutBoard」届く。

  ・4個のスタッド付だが、ネジが小径で特殊なのと、このままでは他に流用できないのでユニット
   として使えるように、10pinストレートヘッダを片側に実装し、もう片側はには、M3スタッドを、
   L=11mmに加工したものを取付けることにした。


■ 2012.11.17
  ・カラー液晶⇔ トレーニング基板間のケーブルを製作した。

  ・テスト・プロジェクト名: ColorLCD2

  → まずは、後閑氏の、プログラムのまま動かして確認
  → これだけだと、面白くないのでイメージデータを追加して、それを表示してみることにする。

  ・ハード・チェック(まずは、電源チェック)
   LCDモジュール:JP1-12pin→ 5.03V(LCD負荷時)
   LCDモジュール:JP1-11pin→ 3.31V(LCD負荷時)

  ・プロジェクト作成して、コンパイル〜 HEX書込みOK
  → 電源ONで、バックライトは点灯するが、表示しない。
     SWを押しても変化なし。
     ちなみに、バックライト電圧(D/D出力)は、実測:6.91V

  ・後閑氏が用意しているHEXをそのまま焼いてみようと思ったが、このプロジェクトに限っては、用意されて
   なかった。


■ 2012.11.18
  ・カラーLCD⇔ トレーニング基板間の配線チェックを行う。
  → OKであった。
  ・LCDの初期化に問題があると思われるので初期化関数:lcd_Init()実行後の、
   LCD全体を黒背景表示:lcd_Clear(BLACK) 
   で、ブレークしてみて黒背景になるか確認してみようと思った。
   また、ブレークポイントまで走っているかの確認としてLEDモジュールの、Aセグメントを点灯さ
   せるようにしてみた。

   <結果>
    @ LED_ONしているので、ブレークポイントまではRUNしている。
    A しかし、黒背景にはならない。
       バックライトがオンしているだけにしか見えない。

     → もしかしたら、コントラストが明るすぎるだけか?
        後閑本に、輝度調整は個々に調整が必要とある。
      → 0x23→ 0x00 or 0xFFに変更しても変わらず?

  ・初期化最初の、LCD_RESETパルスが入っているか確認
  → 約1mSの、負パルスが、LCDモジュールの、JP1-6pinに入力されていることを確認


■ 2012.11.19
  ・LCD全体を黒背景表示:lcd_Clear(BLACK)で、ブレークした時点での、SPI信号(CS/, SI, SCK)が
   動いているかの簡易チェックをソフト・オシロ2でのシングル・トリガにて確認
  → 各信号とも、ざっと見、動いているようである。
  ・そもそも、LCDへのソフトリセットが、うまく掛って無いことが考えられる。
   1mS負パルスを、200mSと極端に広げてみても変わらず。


■ 2012.11.20
  ・一つの不安点として購入した、LCD-11062(Nokia LCD6100)のコントローラ・チップは、
   EPSON社の、S1D15G10と思っているのだが、確かな証拠はない・・・・
   ちなみに、この旧バージョンは、S1D15G00で、後閑氏が記事で使用しているのは、こちらのタイプ
   と思われる。
   但し、記事には、コントローラは、S1D15G00互換という書き方をしている。
   どうも、このカラー液晶に関しては、コントローラチップが、互換という表現のもと、いろいろ存在している
   ような感触である。
  → この時点では、調査不足で、はっきりしないが・・・

  ・LCD-11062(Nokia LCD6100)のコントローラは、EPSONの、S1D15G00なのか、S1D15G10なのかは
   調べたが、明確な答えは出ていない。
   もし、S1D15G10(ダウンロードしたマニュアル)だとすれば、後閑氏初期化ソースの
   コマンド:DISCTLのパラメータが、1つ少ないことになる。
   つまり、4つ目のパラメータ
   ディスパージョン(Dispersion: '0'/ Non Dispersion: '1')である。
   今一このパラメータの意味が不明だが、マニュアルの直訳をすると
   「液晶ドライブ方法」の選択らしく、'0': 分散/ '1': 分散しない
   ということになると思うが、何を具体的に分散するかは不明
  → このパラメータを、0にセットしてみたが、変わらず。


■ 2012.11.21
  ・調査した事柄
   @ Vddの立上り(電源ON)の、シングル・トリガで、RESET/, SI, SCK, CS/の、
      電源ON直後の各信号レベル/タイミング確認
      (ソフト・オシロ2は、交流結合のため、直流のレベルが長く続くような所は、正しいレベルで確認できないので
      自作オシロとの併用で確認した)

   → 各信号、電源ON直後の、≒4mSの間、レベルが不定になっている現象を確認。
      それ以降の、≒10mS間も、同様に不定


   → 後閑氏のプログラムでは、RESET含む、SPI信号のレベル初期化が、MPUのシステム最適化設定+ポート設定等
      の後で行われているのが、気になるのだが・・
      まあ、不定部分はあるものの、RESETパルスは出力されているので
      単純に、そこから話が始まると考えれば、良いのかもしれないが・・・
      しかし、このイニシャル動作は、どうも気になる。


■ 2012.11.22
  ・RESET含めた、SPI信号のイニシャル動作の改善を試みる。
  <改善案>
   @ 現LCD初期化関数の、頭にある、RESET含めた、SPI信号レベルのイニシャルを、メインループ・トップの、
      ポート入出力設定の前で、いち早く実行
   A LCD初期化関数の頭は、10mS遅延後、RESET解除のみとする。

   → このようにソースを修正しても、未だLCD表示せず。
   → ソフト・オシロ2で、ソフト修正後の波形を見ると、電源ONから最初の約4mSほどの間は、ポートレベル
      不定になるらしく、ここは、相変わらず各信号バタツク
      しかし、その後は修正通りにレベル確定している。
   → 不定区間は、MPUのクロック設定等、コンフィグ設定している時間でポートセットしてない時間なので、
      それが原因と思われる。

   → RESET/ラインだけでも、プルダウン抵抗:100k位を入れておいた方がベターかもしれないので入れてみた。
     (しかし、このバタツキで、LCD設定がおかしくなったとしても、4mS後に再RESETが入るので
      問題ないとは思うのだが・・・・・・)
   → これをやったところで、バタツキの波形に殆ど変化なしなので外した。


■ 2012.11.23
  ・RESET問題は、一時保留にした。
   今日は、ソフト・オシロ2で、SPIタイミングの確認をしてみた。
   まず、ソフト・オシロ2の測定限界から、SCKを落とす必要がある。
  → ソフトでポートをバタバタやっているところに、500uほどのソフト遅延を入れて対応した。
     コマンド送信(lcd_cmd())/データ送信関数(lcd_data())の、両方で確認した。

     @ LCD初期化最初のコマンド送信: lcd_cmd(DISCTL); // 表示範囲設定(0xCA)
        をループさせタイミングを確認
     → タイミングは良さそう。レベルも問題なし。
     A データ送信: lcd_data(0x0D); // DISCTLコマンドのP4:反転強調ライン数
        をループさせタイミングを確認
     → タイミングは良さそう。 レベルも問題なし。

   ※ どうもタイミングではなさそうである。
     (高速オシロを持ち合わせてないので実際のスピードでの確認は、未確認ですが・・・)


■ 2012.11.25
  ・未だ表示せず??
   自分の購入した、LCD-11062に搭載されているコントローラ・チップが何であるかが、やはり気になる。
   コントロール・チップが普通に実装されていれば、目視で確認できるだろうが、このモジュールは、
   どうもフレキシブル基板にチップが実装された形で、しかもその部分が、樹脂板でマスクされている
   ようなので目視確認は、分解しない限り不可能である。

  → そこで、購入先の、ストロベリー・リナックス社にその旨、メールで問合せしてみたが
     販売店でも、明確な答えは得られず、EPSON互換の一言で結局は、解らずじまいでした。

  ・ここで、1度デバッグ途中の汚くなったソースをバックアップし、次の通り表示動作を単純化した
   新しいソースに置き換えてデバッグを進めることにした。

  ※ 従来のSWによる、ケース分岐はそのまま残して
     その前に、電源ONで、lcd_Clear(背景色)を実行し
     背景色を、黒、白、赤、緑と、繰返すだけの動作をさせてみることにした。
     また各ステート(背景色)に来ているかの確認としてLEDを点灯させることにした。

  → RUNはしているが、相変わらず表示せず。


■ 2012.11.26
  ・ここで、電源ON直後の、≒4mSの間、RESETレベルが不定になっていた件で、新たな発見をした。
  → このノイズ?らしきパルスが入るのを、10k〜100kのプルダウンを入れて取除こうと思ったが、
     取除けなかった。
     しかし、
0.1uのコンデンサを、RESET-GND間に入れたら完全に取除けたのである。

→ これで、理想的な、IRS(イニシャル・リセット)になった。
   実測リセット幅は、約18mSあるので十分である。
   RESETに関しては、これでFIXすることにした。
→ しかしこれでも未だ表示せず。


■ 2012.11.29
  ・ここ数日は、EPSON社のチップ両者(S1D15G00とS1D15G10)の、差分表を作成し、
   色々とパラメータの値を変更して試してきたが、何をやっても表示しないのである。
   そこで、確実に、EPSON社の、S1D15G10が実装されたLCDモジュールが購入できないか、
   今度はストロベリーリナックス社でなく、スイッチ・サイエンス社に、問合せメールを出してみました。

   よもや、EPSON互換と言いながら、フィリップス社のPCF8833が搭載されているのか?
   と思ったからです。


■ 2012.11.30
  ・問合せメールの回答あり。
   以下の通りだった。

   「SFE-LCD-11062 ノキアカラー液晶ピッチ変換モジュールは、 SFE-LCD-00569 を使っております。 
    こちらの販売元サイト https://www.sparkfun.com/products/569 によりますと、 
    
Epson S1D15G10 と Philips PCF8833 2種類のコントローラが使われておりまして、
    どちらのバージョンをお届けできるか保証できない。
」との事です。 

    Note: This shield uses the Epson S1D15G10 or Philips PCF8833 controller
    (we cannot guarantee which one you will receive.)

   当社ではどちらかを指定することはできませんので、メーカー次第になるか と思います。
   以上、宜しくお願い致します。」

  → この回答により、私の購入したボードに搭載されているコントローラ・チップは、
     フィリップス社の、PCF8833の可能性が非常に高くなった。


■ 2012.12.01
  ・幸い、このコントローラのデータシートを ネットからダウンロードできましたので、それを元に
   
フィリップス社の、PCF8833用の初期化関数に書き直したら、表示できるようになりました。

   まだ、背景色(LCD_CLEAR)しか試してないので これから、漢字表示、イメージ表示等
   試していきたいと思っています。

  ・ちなみに、EPSONと、PHILIPSでは、コマンド体系が大きく異なり
   (インストラクション・コードも違うし、パラメータの意味、数も異なる。)
   EPSON互換という表現の範囲を超えている感があります。

   私は、この表現に今迄間負わされていたことになります。

  ・背景色を表示できるようになったのだが
   よく見ると、カラーデータの送り方の設定が違っているのか、
   黒、白、緑は、OKだが、赤が、青になってしまう。

  ・ここで、カラーデータを確認(12bit)
   WHITE: 0xFFF
   BLACK: 0x000
   RED: 0xF00
   GREEN: 0x0F0

  → RED指定で、青(BLUE): 0x00Fになっているので、0x00Fを送ってどうなるか試してみた。
  → やはり、これで赤になる。
  → これは、LCD初期化で
    メモリ・データ・アクセス制御コマンド: MADCTL のパラメータの設定に誤りがあることが原因していた。
    0xC8→ 0xC0に修正したら、うまく行った。

  ・SW分岐による、後閑氏のテスト項目を全て試すが、スクロール以外は、うまく行っているようです。
   (この時点では、フィリップスの場合の、スクロール設定の方法が不明だったので、
    プログラムから一時外したので・・)
   以下に表示例の、一部を示しました。


■ 2012.12.02
  ・
表示はしてるのだが、なんだか表示方向が逆のような気がする。
   現在は、上写真の通り、LCDモジュールのコネクタを上にし文字が素直に読める方向に表示されるが
   これを反転した、コネクタを下にして文字が素直に読める方向に表示されるのが本来だと思う。
   よくよく考えると、後閑氏(EPSONコントローラ使用)は、わざわざ、元々の座標を変換して指定している。

  ・これに関しては、EPSONコントローラを使った場合だけのことかもしれない?
  → lcd_Pixel関数内の、最初の、軸方向を反転している2行をコメントアウトしてみた。
  → これで、PHILIPSコントローラの場合も、正しい向きで表示されるようになった。


■ 2012.12.03
  ・最後に残った、PHILIPSコントローラの場合の、スクロールコマンド設定をマニュアルで調べ
   下リストのようにしたら、スクロール(一括スクロール)も動くようになった。

/********************************************
* スクロール関数
* 全体を一括上側にスクロール
*********************************************/
 /// Pilipsコントローラの場合 121203
void lcd_Scroll(unsigned short delay)
{
   short i;

   lcd_cmd(VSCRDEF); // 垂直スクロール指定
   lcd_data(0); // 開始ブロック(デフォルト=0)
   lcd_data(130); // スクロール領域(デフォルト=130)
   lcd_data(0); // 終了ブロック(デフォルト=0)

   for(i=0; i<=130; i++){
       lcd_cmd(SEP); // スクロール・エントリー・ポイント指定
       lcd_data(130-i);
       delay_ms(delay); // スクロール速さ
   }
}


■ 2012.12.04
  ・後閑氏のイメージ表示の、イメージデータを半画面分、自作のオシロイメージに置換え表示してみた。
   GLCD(128*64モノクロ)の時、作ったイメージデータを、そのまま使えたので楽でした。
   やっとこれで全て表示できたので、本件はクローズすることにした。

  ※ 以下に、各表示ケースの、最終表示結果を示しました。


<最終ソース及び、ヘッダーファイル>
 ・こちらから、どうぞ→ ColorLCD_TEST_PCF8833.c
               ColorLCD_Lib_PCF8833.c
               ColorLCD_Lib_PCF8833.h

               font.h (フォントデータ: 後閑氏が作成された、ANK文字データ)
               
imagedata.h (イメージ・データ: 後閑氏が作成されたオリジナルに、WIN標準のお絵かきソフトで書いたオシロのイメージを追加しました。)
                  KanjiFont12b.h
 (漢字フォントデータ 12x12ドット: フリーの「M+フォント」を基に、後閑氏が作成したものを使用しました。)


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ24へ →