キャラクタ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カウンター
カテゴリ
ユーザータグ

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

最新コメント
リンク

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