● 実験テーマ90

「PIC32MX_QVGAカラー液晶ゲーム基板の、製作と実験」
「ケンケンのホームページ」記載の、GAME基板を、P板化したJA1WBYさんの基板を使用して、色々と試してみました。)

※ 170426:
   Aitendo の、S95417AAAですが、2017/3/8より、現行版の取り扱いが終了となり、
   仕様は同じはずですが、外観が多少変わりました。
   そこで、代替えP板への実装がてら、液晶IDの読出しチェックをしてみました。




※ 上写真の液晶は、Aitendoの、「S95417AAA」JA1WBY作 代替え基板に実装したものです。

以下、この実験の顛末記です。

■ 2017.4.18
  ・このテーマにしようと思ったきっかけは、JA1WBYさんの、No,11 「MX32・・・BASIC-Ver1 プリント基板の製作」
の記事
   
を拝見したことから始まりました。
   自作の、GAME P板+液晶:S95417AAA(自作代替えP板に実装)の組合せの場合、表示が上下左右逆になって
   しまうとのこと。

   基板の配布も行っていたので、昨日、注文して、本日到着済です。
   これに部品実装し、この不具合の件を調査してみようと思い立ちました。

   私自身あまりGAMEはやりませんが、PIC32MX+カラー液晶にて、メニュー選択方式で、往年のゲームの名作
   が楽しめるのも、おもしろそうということで始めてみようと思います。

  ・早速部品実装を行った。(回路等、詳細な説明は、「ケンケンのホームページ」の記事を御覧ください。)

  ・最初は、手持ちの液晶モジュール 2種の内、TP付きの、「UL024TF」(現在在庫切れ中)で動作確認した。
   その前に、PICに、ブートローダを書込まないといけない。
   まずは、何も考えないで、bootloaderLCD.hex を書込んだら、上下左右逆の表示になってしまった。

   よくよく、ケンケンさんの記事を読むと、ブートローダには、3種類あることが判った。
   さっき書込んだのは、コントローラ:R61505のものだった。
   ターゲットのコントローラは、ILI9325であり、これに対応するブートローダは、bootloaderLCD_AT020QVS.hexである。
   これでやったら、正常な向きで表示するようになった。(写真にはないが、アプリ画面の表示向きも正常)
   また、SDカード・スロットも、排他利用(UL024TFのスロット or P板のスロット)で正常動作を確認した。
   尚、稼働中の消費電流は、約50mAほどであった。(以外と少ない。)

   やはり、IA1WBY作の互換P板に実装した、S95417AAA でやると、ブートローダ画面までは、OKだが、
   アプリ画面になると、上下左右逆の表示になる。
   同じ、ILI9325のはずだが?

   ・早速、調査してみることに。
     @ 互換P板の、LCD:CN1-6(RD/)と、PIC-24pin(RB13)は正常に接続されている。
        液晶モジュールの、角パッド:10pin(RD/)までの接続もOK。
     A オシロで、RD/信号を確認しようと思ったが、自作及び、中華オシロ(キット)では、速すぎて(たぶん数100nS単位)
        追従できなく観測を断念した。(既成の高速オシロが欲しいところだが・・・まだ先になりそう。)
     B ソフトを追跡することに。
        アプリの中にある、LCDドライバ・ソフト(C記述)を見ると、この中に
        unsigned short LCD_ReadData(void) という関数があり、どうもこれを使って、LCDの、IDをリードしているようだ。
        これをコールしている関数は、unsigned short LCD_ReadReg(unsigned char index)である。
        さらにこ メインループにある、void LCD_Init(void)の中で、id= LCD_ReadReg(0);として、
        0番地のレジスタ(レジスタ名:Driver Code Raad→ これが液晶IDと思われる。)を読込んでいる。
        そして読込んだIDが、0x9325だったら、コントローラは、ILI9325と判断し、そのケースのイニシャライズを実行
        という手順になっている。(ブートローダは機種固定だが、アプリは自動判別にしている。)


■ 2017.4.19
  ・ILI9325なのに、液晶IDの読込が上手く行かない?
   UL024TFでは、OK
   → RD/ライン(他のラインにも)74ACT245DWのバッファICが挿入されている。
   一方、NGの、
S95417AAAは、バッファは入ってない。
   この辺でのリード・タイミングへの影響がちょっと気になるが・・・

  ・自分でプロジェクトを組んで、いじってみたいが・・・
   自分のPCには、XC32コンパイラはインストールされてなく、C32 v2.02がインストールされている。
   ケンケンさんの記事の内容から、環境は、MPLAB  X, C32 v2.02でもよさそうなので、最初はこれで行うことにした。
   最初記事の内容を良く読まず、文字コードは、いつもの、Sift JIS にした。
   MPLAB  X IDEでのプロジェクト作成は何度か経験があるので、割と簡単に済んだ。
   ただ、最初、アプリのローダ:App_32MX250F128B.ldの意味が良く解らず、プロジェクトのカテゴリ分けフォルダに入れないで
   プロジェクトフォルダ直下に置いた。
   これで一応、ビルドは成功した。
   これだと、ブート画面には、SDカードにセーブした、アプリHEXファイルが表示されるが、選んで実行するも
   Application Not Found とエラーが出る。
   また、Editorの漢字が、文字化けを起こす。
   文字化け対策は、プロジェクトのプロパティ右クリック→ General選択→ Encoding窓で、UTF-8にセットで上手く行く。

   App_32MX250F128B.ld をどこに置くかだが、調べると、このファイル、MPLAB IDEの時の、*.gldに相当すること
   が解った。つまり、リンカ―・スクリプトである。
   このゲームソフトの場合、特殊なメモリ・ロケートが必要なようで、通常用意されているスクリプトでなく、自前の
   スクリプトを使っているようである。
   なので、プロジェクトの、LinkerFileフォルダに、Addすることにした。
   これでビルドしても未だ、Maikeエラーが、3個ほど出る。


   念のため、ビルド設定で、
コード削減オプション設定(Generate 16bit code・Remove unused sections・Optimization-level:s)
   もしてある。
   原典先の、ケンケンさんの掲示板に、この件に関する質問を投稿してみた。


■ 2017.4.21
  ・ケンケンさんから回答があった。
   それによると、C32では駄目なようだ。
   XC32 v1.32以降・
最適化レベル 1(その他は特に指定不要)のコンパイル環境が必要とのこと。
   早速、
XC32 v1.32(無償版)のインストールを行い、最適化レベルを、1に設定してビルドしたところ、
   今度は、ビルド成功となった。(ケンケンさんには感謝です。)
   とりあえずこれで、ソースをいじれる状態になった。
   早速、気になっていた、リードタイミングの為に入れている、nopの数をいろいろ追加して試してみたが、
   相変わらず、S95417AAAでは、上下左右逆の表示になってしまう。
   どうもタイミングのバラツキによるものではなさそうである。

   もう1つやりたかった、液晶IDレジスタを、リードした内容を、液晶に表示させるのを追加してみた。
   どうしてもメイク・エラーになって駄目。


■ 2017.4.22
  ・今の追加テストプログラでは、HEX・IDを、液晶に表示するのに、アスキー変換が必要だが、
   それをいつもの、後閑さん作の関数
void atohex(unsigned char data, char *buffer)
   を、LCDdriver.cに組み込んで使っている。
   これを、標準関数(stdio.h)の、sprintf文を使う方法に変えてみる。
   (これが駄目なら、idを読んで条件分岐するところで、S95417AAAの場合、今は、たぶんIDが正しく読ず
   defaultの、R61505(TFTIN3204-E)へ分岐して上下左右逆さになっているので、もし正しく読めない
   時は、ILI9325(M024C9320TP)へ分岐するようにすれば、正しく表示するはずである。)

   sprintf文を使ってソースを書直したら、ビルドOKになった。
   そしてこれによるデバッグも上手く行った。
   結局、UL024TFの場合、ID= 9325と読め、 S95417AAAの場合は、ID= 9328であった。

  ・つまり、リードタイミングは問題なく、リード動作もOK。
   S95417AAAの場合は、実際には、ILI9325と互換の、ILI9328が搭載されているようで、ID= 9328と読めた。
   ということになります。
   ソースの方は、case 0x9325 の前に、break;無しの、case 0x9328を追加修正しました。
   これにより、両者共に、ILI9325の初期設定になり、正常動作しました。
   動作の模様は、このページトップの写真を参照ください。


<回路図>
 ・原典のケンケンさんのHPの回路図はここです→ オリジナル回路図 by ケンケンさん」



<修正ソース(私なりの暫定ソースです。ご参考までに)>
 ・こちらから、どうぞ→ 「LCDdriver.c」 (ILI9328追加版→ ※ IE(Edge)で見ると、UTF-8だと文字化けするので、Shift-JISでセーブしました。)


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