2023.7.5
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第48回]



●まさかLCDコントローラのバグ?

こういう作業をやっておりますと悪霊の仕業としか思えない現象に出くわして思いっきり悩んでしまうことがあります。
そんなことはないのでありまして気を取り直して原因を追求していきますと大抵は回路のミスだったりプログラムのバグだったりということで一件落着となります。
今回もまずはハードの誤動作を疑いました。

仮に何らかのハードトラブルだとすれば現象はかなり乱れたふうに現れるはずです。
しかし今回は規則性がはっきりしています。
考えられる限りのことを考えてあれこれ試した結果どういう場合に異常な現象が出現するかというところまでは突き止めることができました。
ええ。
100%の再現性があります。
そうするとどうもこれは回路の問題ではなさそうということになります。

それにしても余りに異常な現象なので次にはLCD表示器そのものを疑いました。
ひょっとしてLCD表示器が破損しているのではないか?
それもおかしいのですけれど。
LCDコントローラが破損していたならばもともとLCDのコントロールなどできませんし、CPUとの通信もできないはずです。
ところがCGRAMにビットパターンを書き込むときだけなんだかよくわからない異常が発生しますがそれ以外のところでは特に異常はありません。
さらに的を絞って追求した結果、突き止めた異常はCGRAMの特定アドレスで必ず発生するというものでした。
異常はただ一点そこだけです。

もっと具体的に説明しましょう。
CGRAMのアドレスの先頭000000〜000111は正常にアクセスできます。
これはキャラクタコード00に対応するキャラクタパターンのアドレスです。
ここには’¥’を書きました。
次の001000〜001111も正常にアクセスできます。
これはキャラクタコード01に対応するキャラクタパターンのアドレスです。
ここには’日’を書きました。
問題はその次です。
その次はキャラクタコード02に対応するキャラクタパターンのアドレスです。
アドレスは010000〜010111です。
ここには’月’を書いています。
ところが上から4ライン(アドレス010000〜010011)までは正しく書き込まれているのですがその次のアドレス010100で「プッツン」してしまっているようです(前回のLCDの写真参照)。
うむむむ。
ひょっとしてLCDコントローラの内部CGRAMが破損していたりして。

そのように考えてLCD表示器を交換してみたのですが。
なんと。
全く同じ現象になりました。
ということになるとこれはハードウェアの問題ではなくてソフトウェアの問題ではないか、と考えざるをえません。
プログラムのバグを疑うのが常道でありましょう。
当然のことながらそれはそのように考えてBASICコンパイラもPICのマシン語サブルーチンも確認してみたのですけれど。
プログラム自体それほど複雑なことはやっていません。
最初にCGRAMアドレスをOUTして、それからはビットパターンを連続して送出しているだけです。
連続して?

そこに何かがあるのかもと思ってCGRAMのデータコードごとにアドレスをOUTしてみました。
すると。
なんと
火、水、木、金、土
は書き込むことができました。
しかしそのようにしても’月’だけは下半分のパターンは書き込むことはできません。
なんとも奇妙な現象です。

実はそこに至る前に「これはひょっとしてLCDコントローラICのバグなのではないか?」という疑いが頭に浮かびました。
まさかねえ。
あちこち捜してみましたら奇跡的に大昔の20字×2行のLCDが出てきました。
まさかねえ、と思いながらそいつを接続して20字×4行LCDと同じことをしてみましたら。
なんと。

おいおいおい。
それはないでしょうよ。
これは東芝のTLC−501です。
基板の裏には東芝のLSIチップが貼り付けられています。
今回の20字×4行LCDはこれもかなり以前ですが秋月から購入したものです。
基板裏のICチップは品番が読めないようになっていますが秋月のサイトで確認するとSitronix Technology Co.,Ltd.の製品らしいようです。
もっともCGパターンにカナ文字があることからするとおそらくオリジナルは日本の製品でありましょう。
ひょっとすると東芝のセカンドソースかも。
そんな想像などをしつつ。
これはどうやらLCDコントローラに潜むバグの疑いが濃厚になってきましたよ(元は東芝か?)。
なんとも意外な展開です。
そういうことならば。
さらに追求していきましたところ。
ついにクリアできました!

これこの通り!


TLC−501もこの通り!


こちらが解決したプログラムです。


カギは55行の
LCC $54
です。
どうやらCGRAMアドレスの010011にビットパターンを書き込んだあとでそれがインクリメントされたときになにかよくないことが起きるようです。
ソフトウェア的に考えるとそれもちょっと変で、アドレス010011にデータを書き込んだらそこでアドレスインクリメントしてしまうはずで、それなら010011に書き込んだ時点でアウトになってしまうはずです。
実際には010011にデータを書き込んでもアウトにはなりません。
それに続いて次のデータを送るとそこで何かよくないことが起きてしまうようです。
異常が発生するのはそこだけです。
ほかは上のプログラムのように連続してデータを送っても問題は発生しません。
それならCGRAMアドレスの010100にビットパターンを書くと異常が発生するのかというとそういうことでもありません。
先にアドレス010100を指定してそれからビットパターンを書くと正しく書き込まれます。
どうなっているのかよくわかりませんがとにかくアドレス010011にビットパターンを書き込んだ後それに続けて次の(アドレス010100の)ビットパターンを書き込んだときだけ異常が発生します。
そこで。
010011にデータを書いたあとそこで一旦終って、あらためて次のCGRAMアドレス010100を設定してからデータを送るようにしたところ異常の発生が回避できました。

断言はできませんがこれはおそらくはLCDコントローラのバグでありましょう。
(まだ信じられませんけれど)
天下の東芝さまがねえ。
もっともサンヨー、シャープに続いて東芝もいまや解体の危機でありますが。
技術産業立国日本、半導体王国日本はどこに行ってしまったんじゃあ。

プログラムの補足説明です。
LCD表示器に送る命令コードがビット7=0、ビット6=1のときビット5〜0がCGRAMアドレスになり、それ以後LCD表示器に送るデータはCGRAMに書き込まれます。
LCD表示器に送る命令コードがビット7=1のときビット6〜0がLCD表示バッファアドレスになり、それ以後LCD表示器に送るデータはLCDに表示する文字のコードとして表示バッファに書き込まれます。
120行の
LCC $80
がCGRAMアドレスから表示バッファアドレスに切り換えるための命令です。

これにて一件落着です。

PICBASICコンパイラ[第48回]
2023.7.5upload

前へ
次へ
ホームページトップへ戻る