LCD (SC1620BS*) の使用メモ
秋月電子で購入できる16文字x2桁の液晶は、PICで広く使われているし、研究室内での装置などでも良く使っている。ただし、うまく動かないことがある。竹中君の場合も、同じ原因なのかも知れない。
症状は
- 動作するときがあるが、その後、プログラムを多少いじったすると液晶の初期化に失敗したように、液晶の表示が、”豆腐”になったり、全く表示されないことになる。
- この場合のPICと液晶の接続は、4ビットモードで、
データをB4~B7
RS:B2、 E(STB):B3
R/W:強制的にGND - 新たに、
RS:A7、 E(STB):A6
R/W:強制的にGND
とすると、何事も無く動作する。何回再起動しても問題なし。
(ただし、2と3では液晶を変えているので、それが理由かもしれない)
原因の考察
- LCDのデータ4ビットとSTB,RSの制御線を同じPICのポート(上の場合はPORT-B)で動作させると、データ4ビットの信号は、制御ピンを変化させるとき変化してしまうのではないか。
- ただし、Web上には、全て同じポートで動作させている例も数件ある。ただし、同じlcd_lib.cを利用しているかは不明。
例えば、http://www.picfun.com/p87703.html - 2.のpicfunのライブラリィでは、
port = (asci & 0xF0) | (port & 0x0F)
と、LCDのデータに無関係なピンのデータを保存するように操作しているが、利用しているlcd_lib.c では そうはなっていない。 - よって、不具合の可能性として、
- LCDの故障
- 同じポートにデータと制御データあり
- FAST_IOなどの微調整が不足
今後の予定
新品のLCDが無くなったので、新たにLCDを購入し、これだけを確認するボードを作成し、それぞれ調べる。
2010.08.26
LCDの輝度調整端子V0 をこれまでは、
接続1: VDD (open) V0---R(200ohm)----Gnd
としていた。これで、過去動いていたので。
しかし、今日試してみると、
接続2: VDD---v^v^v^v^v^v^v^v^v^v----Gnd
| 10kohmB
V0
として可変抵抗を通して繋いでいるうちは問題なかったが、接続1のようにVDDとV0の間をopen にすると、LCDがついたり、消えたりし、しまいには全く点灯しなくなった。その後、接続2に変更すると、正常動作する。
以上から、VDD-V0間も何がしかの抵抗を接続しないと、初期化等で失敗するように思える。
液晶についてくるマニュアルには、VDD-V0間の電圧が標準で3Vと書いてあるだけ。
実際、接続1で、LCDが点灯する場合と、点灯しない場合でVDD-V0の電圧を測定すると、
- 点灯する:3~4V
- だめ: 0V
以前、学生実験用に複数台LCDを利用した実験装置を作成した際、初めは問題が無かったが、その後購入したLCDでは、動作しないことがあった。これは、接続1を利用していた。多分、LCDの回路の設計が若干変化し、接続1では、電源が立ち上がる際の微妙なタイミングの違いで、VDD-V0に電圧が印加されなくなったためであったのかもしれない。
以上より、
正しい接続: VDD----R1-----V0----R2------Gnd
R1: 10kΩ
R2: 400 ~ 600 Ω
R2 を小さくすると、コントラストが強くなる。
2010.09.01
別途 新規に基板を作成し、LCDの動作のみの確認を行った。
以前、点灯しなかったLCDも、STB,RSをポートAにしたところ動作した。その時のプログラムのリスト
void main() { int i=5; lcd_init(); printf(lcd_data, "Ready..."); while(1) { if(i==1) { output_high(PIN_A1); i=0; } else { output_low(PIN_A1); i=1; } lcd_clear(); printf(lcd_data,"LCD_test %d", i); delay_ms(1000); } }
ただし、動作が不安定。電源を入れた後に、無事に表示される場合と、豆腐になってしまうことがある(無事表示されるのが2割)
- [解決]lcd_init() の初期化を行う前に、試験では5秒ほどのdelay を入れたところ、勝率10割に。電源が立ち上がっている間に初期化しているのが原因かと思われる。
LCDのデータラインと制御ライン(これは、認識間違いらしい)
これまで、データライン(4ビット)はポートB、制御ライン(STB:E, RS)はポートAと分けていると、問題なく動作した。LCDが点灯しない原因の1つが輝度調整にあったので、ついでに、制御ラインもポートBに変更して確かめた。
[結果] 動作せず
利用しているLCD制御プログラムリスト
void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(5); //NOP output_high(stb); //strobe out delay_cycles(10); //NOP output_low(stb); //reset strobe }
細かく、端子の電圧波形を確認してみるのも、問題解決に役立ちそうだ。
2010.09.01
新規の基板で、制御ピンを
#define rs PIN_B2 //A2
#define stb PIN_B3 //A3
としてみたところ、何事も無く動作した。
#use fast_io(b) の有り/無し にもよらなかった。
上の動作しなかった理由は、単なる接続のミスなのかもしれない。??
LCDの利用についてのメモ
以上より、
- Vo(Contrast adj.) 端子は、プルアップ+プルダウン抵抗を必ずつける(プルアップ10kΩ、プルダウン400-600Ω)
- 制御ピンR/Wは、制御せず、Gndに半田付けしても動作する。(当然、LCDからデータの入力はできない。)
- データピンと制御ピンは、同一ポート、異なるポート、どちらでも動作する(念のため、同一ピンで動作しないとき、異なるポートに制御ピンを移動させることも想定しておくのも案)
- さらに、制御ピンを10kΩ程度でプルダウンする(以下の説明参照)
また、回路の設計として、データピンは連続した4ビットが必要なので、
- A0-A3
- B0-B3
- B4-B7
が可能である。(A4-A7は、16F88 など、I./OにA6,A7が利用できるPICで利用できそうであるが、A5がOutput にはできない)
ここで、RS232CをPICの内臓機能として利用しようとすると、1.A0-A3とLCDのデータピンとして利用せざるをえない。
あるいは、RS232Cとして、タイミングが面倒なのは、入力なので、B2をRS232Cの入力ピンとし、RS232Cの出力はソフトウエアで動作させることも考えられる。この場合は、3 B4-B7 をLCDのデータピンに利用できる。
だたし、RS232Cをハードとソフトでプログラミングできるかは、試していない。[課題]
==> CCS-Cでは、PIC内臓のRS232Cの送信と受信の2つの端子が指定されたときに限り、ハードウエアでアセンブルされる。1方だけではソフトウエアでアセンブルされる。残念!
制御線のプルダウン(2010.09.11)
その後、他のLCDを調べていたところ、単純に半田付けのやり直し程度の作業の後、LCDが表示されない(豆腐)になってしまうことがあった。
(下の基盤で、RSと手書きしている端子の10kΩを開放している場合
ただし、STB(E)あるいはRSの端子を指などで触っていると、正常に動作することもある。そこで、STB(E)の端子(RS端子でも同様)を10kΩ程度でプルダウンしたところ、ほぼ100%正常に動作する。(下の図)
(RS端子の抵抗をグランドにプルダウンした場合)
制御線はタイミングが厳しいので、STBかRS端子をプルダウンすると、より正常に動作する可能性があがるようです。
また、制御端子をポートAに接続したときは、プルダウンは不要だが、ポートBだと、プルダウンしないと正常に表示しないこともある。
aitendo の極小キャラクター液晶メモ
右図の小さな液晶も、5V で、上の液晶と全く同様に利用できる。ただし、コネクタが特殊だが、これ自体は100円で販売されている。バックライト付き。なお、液晶輝度調整用のVo は0.1V 程度がちょうど良い。5V を10k + 200ohm で分圧。