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