キャラクタLCD処方箋

SC1602などのキャラクタLCDモジュールを使っていて、ソフトウエア的には動いてくれていいはずの場面なのに、1行目に黒い四角が並ぶところを目の当たりにしたことがある人は少なく無いのではないでしょうか。

こういった原因はいろいろあると思うのですが、対処療法的に効果があるかもしれない内容をまとめてみました。


キャラクタLCDは実は難しい


マイコンを利用した趣味の電子工作では、表示機としてSC1602やSC2004といった、日立のHD44780互換ICを利用したキャラクタ液晶表示機が非常に良く使われます。

HD44780 のGoogle画像検索

これらの液晶表示機は、秋月電子通商などでも安価に購入でき、また、マイコンのプログラミングという観点から見るととても簡単に制御ができるため、マイコン初心者から上級者まで広く使われています。

しかしながら、回路図どおり接続し、ソフトウエアも間違っていないはずなのに、何故か動作しないということがしばしば起こり、初心者泣かせだったりします。
キャラクタLCDの1行目に黒い四角が並んでいる初期化失敗の場面を見たことがある人は少なくないと思います。
それよりは頻度が低いですが、意味不明な文字列のようなものが表示される「文字化け」や意図した位置からずれた場所に文字が表示されるといった症状も稀に見られます。

特にキャラクタLCDをマイコン基板本体から少し離れたところに設置したいと考えたときなどに、信号線を引き伸ばすと不都合が生じることが多いようです。

こういった現象の起こる根本的な原因は、私にはよく分かりませんが、経験的に効果があるチェックポイントをまとめました。

  • 結線のチェック
  • コントラストのチェック
  • パスコンの追加
  • 信号パルスの延長とダミーウエイトの追加
  • バッファの挿入
  • 未使用端子とE(STB)信号線の処理
  • マイコン側の問題?

ただし、経験則ゆえに間違っていることもあるかもしれません。また、いかにもな対処療法は、仮にそれで動作が安定したとしても、それだけで満足せずに原因となっている問題点を探す努力が必要です。

結線ミス(特に電源)


なんだかんだ言って、結局一番多いのは配線の間違いや接触不良です。
導通チェッカの機能の付いたテスタを使って、落ち着いて確認するところからはじめましょう。
特に2行表示のLCDと4行表示のLCDでは、ピン配置がそっくりでありながら電源とGNDのピン配置だけが逆になっているものがあります。

コントラスト


これも単なるケアレスミスなのですが、コントラストの調整がマズイせいで一見表示されていないように見えることがあります。

パスコン


回路製作の際にすべてのICの電源とGND端子のできるだけ近くに0.1μF程度の積層セラミックコンデンサを接続し、IC数個おきに100μF程度のアルミ電解コンデンサを接続する。


こういった話は、電子工作の参考書(例えば、CPUの創りかたOPアンプによる実用回路設計)にはよく書かれていることですが、忘れてしまう人をしばしば見かけます。

キャラクタ液晶モジュールそのものの電源-GND端子間に数十μF程度の電解コンデンサをつけると文字化けやちらつきの頻度が改善されるケースがしばしばあります。
特に信号線を引き伸ばす場合に効果があるようです。

信号パルス(特にE(STB))の長さ


キャラクタディスプレイの制御信号には最小パルス幅が定義されています。例えばキャラクタLCDへの書き込み時にはEnable信号を220ns以上Highに維持する必要があります。

このEnable信号の保持時間をかなり長めに取ってやることによって、動作が安定することがあります。
私はPIC16F873を20MHzで動作させた際、NOPを2つはさみ、少なくとも400ns以上Highを維持していたはずなのに、LCDが正常動作しなかったことがあります。
このときはNOPを10個はさむ、すなわち2μs以上Highを維持するようにしたところ正常に動作するようになりました。

とはいえ、こういった対処療法はあまり好まれません。

バッファの挿入


キャラクタLCDをメイン基板とは離れたところで動作させたい場合は、メイン基板上のマイコンに送信バッファを、液晶表示機に受信バッファをそれぞれ挿入するという選択肢もあります。

ただし、ICが増えることを厭わないならば、メイン基板上のマイコンと液晶制御用のマイコンを分離し、別基板間の通信を考慮したシリアル通信でデータのやり取りをするという案のほうが現実的かもしれません。


001_20101124001952.png
fig.1: 本当に延長したいならシリアル通信で


液晶表示モジュールを4ビットモードで使ったときの空きピン処理


液晶表示機を4ビットモードで使用する際の未使用端子をどのように処理するかという問題は、長らく議論されてきたようです。

この問題は居酒屋ガレージ日記の居酒屋ガレージ店主(JH3DBO)さんが液晶表示モジュールを4ビットモードで使ったときの空きピン処理にまとめています。E(STB)信号線の処理など8ビットモードでも参考になる話が書いてあるので、読んだことの無い方はぜひ一読をオススメします。

マイコン側の問題?


最後に、私の昔の経験をひとつ。
いまだに原因もよく分かっていない話ですが。

およそfig.2のような回路を作ったところ、マイコンとしてPIC16F84Aを使ったときはLCDモジュールが正常に動作する一方で、PIC16F88を使ったときは動作しないという現象に出くわしました。


002_20101124001952.png
fig.2: 84Aでは動作するが88では動作しない回路?


PIC16F88は84Aと比べて高機能なため、単純なプログラムを組むだけでも、余計な設定項目が多いのが難点といえば難点です。
ただ、このときはアナログ関係の設定もシリアル通信関連の設定もディスエーブルとしたので、84Aから88への移植の問題ではないと思います。PIC16F88が壊れた可能性も考慮して複数の個体で試しましたが、どれも同じ結果でした。(ただし、同時期に購入した個体しかなかったため、ロットは同じだと思います。)

そもそも、この回路の設計思想はA/Dコンバータが乗っているPORTAをできるだけ使わず、PORTBだけでキャラクタ液晶を動作させるというものでした。これをあきらめて、三本の制御信号線(E,RS,RW)をPORTAに移したところ、PIC16F88でも動作するようになりました。

このエピソードで言いたかったことは、キャラクタLCDは初心者も良く利用する基本的なモジュールでありながら、実は結構気難しくてうまく動いてくれないこともあるということです。

参考URL




参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。


tag: PIC 失敗談 

comment

Secret

SC1602の初期設定は、

お久しぶりでございます。

SC1602で、一度だけ初期設定に失敗する事例に出会ったことがありました。パワーオンリセット直後に文字列を表示をする単純なプログラムでしたが、デバッガをつなぐと動くのに、単体では動かないという妙なものでした。
結論からいうと、SC1602側の初期化が終わる前にマイコンがデータを書き込みにいったというのが問題の原因のようでした。
SC1602の初期化シーケンスには、電源電圧が4.5Vを超えてXXミリ秒待ってから(SC1602の初期化が終わってから)初期化コマンドを送信しろと書いてあります。ところが、最近のマイコンは、3.0Vぐらいでパワーオンリセットが終了してしまいます。そのため、電源電圧の立ち上がりが遅い場合には、電源電圧が4.5Vに達しないうちにマイコンのプログラムが走り始めて、SC1602が初期化されないうちに初期設定プログラムが動き始めます。
デバッガをつないだ場合には、リセット直後の状態でいったんプログラムが停止するので、十分に初期化の時間があったというわけです。

と、ここまで解明したのですが、最近のsc1602で実験しても、不具合が再現してくれません。もしかしたら、もっと低い電源電圧でも動作するように変更されたのかもしれません。こうして、この現象は、闇に葬られたのでした。

Re: SC1602の初期設定は、

のりたんさん、お久しぶりです。

なるほど、マイコンのリセットのタイミングによってキャラクタLCDの初期化に失敗する可能性があるのですね。

PIC16F84AとPIC16F88の問題も、比較的設計の古い84Aの方が新しい88よりもリセットのしきい値が高かったのかもしれませんね。
とすれば、マイコンのリセット端子にしきい値の高い外部リセットICを接続すれば、その手の問題は解決する可能性があるということになりますね。

私の84Aと88の問題は、キャラクタLCD接続のピン配置を変更するために新しく回路を作り直すことで不具合がなくなったのですが、そう考えると、新しく回路を作り直した回路の電源の方が立ち上がりがシャープだったのかもしれません。
FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoCCPAOPアンプPIC強磁性常微分方程式モンテカルロ解析トランジスタode状態密度DOSインターフェースecaljスイッチング回路定電流PDS5022半導体シェルスクリプト乱数レベルシフトHP6632A温度解析可変抵抗I2Cブレッドボード分散関係トランジスタ技術R6452A数値積分反強磁性バンドギャップ確率論セミナー絶縁偏微分方程式非線形方程式ソルババンド構造熱設計カオスA/DコンバータISO-I2Cフォトカプラ三端子レギュレータシュミットトリガLEDGW近似LM358アナログスイッチ数値微分TL43174HC4053マフィンティン半径発振回路サーボ直流動作点解析カレントミラーPC817CUSB単振り子bzqlty開発環境BSch2ちゃんねる電子負荷イジング模型LDAチョッパアンプ量子力学補間アセンブラFFTブラべ格子標準ロジックパラメトリック解析基本並進ベクトルewidthキュリー温度QSGWGGA失敗談MaximaSMPTLP621スイッチト・キャパシタ熱伝導コバルト相対論スピン軌道相互作用六方最密充填構造繰り返しFETランダムウォークcygwingfortran不規則合金状態方程式ラプラス方程式抵抗スレーターポーリング曲線位相図格子比熱マントルデータロガー自動計測ダイヤモンドガイガー管QNAPUPS固有値問題条件分岐井戸型ポテンシャルシュレディンガー方程式詰め回路MCU第一原理計算起電力熱力学スーパーセルVCALM555仮想結晶近似awkTLP521NE555ubuntufsolveブラウン運動OpenMPVESTA最大値テスタ差し込みグラフFXA-7020ZRWriter509三角波TLP552平均場近似最適化最小値過渡解析LMC662トランスPIC16F785CapSenseMBEナイキスト線図CK1026フィルタP-10負帰還安定性EAGLEAACircuit2SC1815OPA2277PGAノコギリ波縮退非線型方程式ソルバL10構造fcc面心立方構造結晶磁気異方性TeX全エネルギー固定スピンモーメントFSMウィグナーザイツ胞interp1ヒストグラム確率論マテリアルデザインspecx.fジバニャン方程式等高線初期値フェルミ面正規分布c/agnuplotBaO岩塩構造ルチル構造ウルツ鉱構造ZnO重積分SIC二相共存スワップ領域リジッドバンド模型半金属合金multiplotハーフメタルデバイ模型edeltquantumESPRESSOフォノンifortUbuntuマンデルブロ集合キーボードRealforce関数フィッティングフラクタルクーロン散乱CIF化学反応三次元最小二乗法日本語直流解析PCトラックボールExcelTS-110パラメータ・モデル等価回路モデルTS-112疎行列文字列HiLAPW両対数グラフ片対数グラフ熱拡散方程式陰解法境界条件連立一次方程式Crank-Nicolson法グラフの分割軸ラベルヒストグラム不規則局所モーメント入出力円周率Gimp凡例線種シンボルMAS830L

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ