秋月で買える廉価版LCDです
I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)¥550-
I2Cで色々動かして居るとどうしても読み込んだデータを表示
したく成ります、だからと言ってPIC の出力ポートにLED を接続して
モニタするにも自ずと限度があります、その時にはLCD表示が役立ちます
写真の様に基板無しでもそのまま動きます
↓
ですが、コネクターの逆接続など間違うと私の経験では一瞬で壊れます
なので矢張り基板に実装してプロテクタなども実装して置けば
安心です
↓
動画です
キャラクタを +1 づつインクリメントして行き表示しているだけです
↓
I2C-BUS の様子です
S → 0x7C → A → 0x40 → A → data → A → P
これを data +1 し乍ら繰り返しているだけです
↓
動いて仕舞えばただの、と言うか随分画面の狭いLCDです
何かの道具として使うには限定的で大したものでは無いです
然し乍ら、動くまでに丸二日無駄に過ごしました
ネット上の色々な製作記事を参考にし乍らプログラムした
のです、特に理解しにくかったのは初期化の仕方でした
普通ならばコントロール・レジスタ成る箱があって
それを指定してパラメータを書き込むものだという概念が
あるのですがこのLCDには全く別の概念が有って
Function Set するしないを先ず宣言してから
複数のパラメータを連続して書き込みして結果的に設定する
というやりかたなんです、資料をダウンロードして
そのままパラメータを設定したのですが ウン とも
スン とも反応しません、普通 LCD ってのは電源が
入れば画面がすこーーーしぐらい暗く成るものなのですが
全く、全く反応しないのです、二日目には「これ絶対壊れてる」
と秋月に追加注文してしまいました。
資料の 初期化の例 とは下記の様な方法でした
↓
特記すべきは Contrast set です、これが電源電圧 5V と 3.3V では
異なって居てどうやら画面が全く出て来ないそうです
それでは、という事でデータを変化させて確認して行ったのです
それでも全く画面が変化しません、全然無反応なのです
次ぎに疑ったのはI2Cのプルアップ抵抗です、Arduinoを使われる方の
記事を読むとプルアップ抵抗が1.8KΩとかで重すぎてLowレベルの
スレッショルドが確定しない、従ってI2C BUS BUFFER 成る回路
を経由してやっとこさ動くように成った、という記事です
それを読んで私はプルアップ抵抗を20KΩ~5.1KΩと試してみました
ですが全く無関係と言うか正に嘲うが如く全然反応無しでした
もう諦めてふてくされていたのです、その時、JA0QON HomePageさんの
記事が目に留まり、あれ?、と思ったら 初期化の例 がちょっと
違うんです、この部分です
↓
この順番が逆ではないですか!!
Clear Display と Display ON/OFF control
こんなのが、正に コンナノガ ですよ逆で一体何が違うのか!!
と疑うのですが 逆 だった為に LCD は全く無反応だったのです
0x01 -> 0x0C の順だとダメ 全く変化無し
0x0C -> 0x01 の順だとOK
メーカーと言うか秋月のホームページからダウンロードする資料が
どれだけ正しいのか本当に疑問です、秋月を責める積もりは
毛頭無いです、が、資料という責任の重さは決して無視出来ない
性質を帯びていて私共が作成するマニュアルにしても一字一句に
責任を帯びて居ます、下手すると事故に繋がるからです
まぁそういう事で逆順番にしたらアッサリと LCD がキャラクタを
出してきました。
序でに書いて置きます
この順番を逆にしてやっとこサ動い
たのですが嫌らしいのは
たのですが嫌らしいのは
それだけではありませんでした、一旦、LCDが動き出すと
順番逆を元に戻してもちゃんと LCD は動くのです、なんで?
これには時系列的な偶然性が潜んでいました、詰まりこういう事です
一旦動いた、プログラムを書き替えて順番逆を元に戻した
普通に考えて、また LCD は動かなく成る、そう考えるのが当然ですが
PICKIT3 でプログラムを書き替えているという理由から 5V はそのまま
投入し続けて居ます、その状態で再起動しても LCD 内の各レジスタには
データが残って居るからでしょう、ちゃんと動くのですと言うか動いて仕舞う
だから順番が逆だという証拠には無理が在る、さぁて困った、真実はなに?
判りました、LCD の電源が一旦 OFF すると内部レジスタは全て初期化
されますよね、その状態で順番逆のプログラムを書き込めばまたまた
LCD はウンともスンとも言わなくなるのです、この嫌らしさ・・・
従って順番はマニュアルのヤリかたではダメ、逆だという結論を
導きました。
*****************************************************************
次ぎの写真は LCD イニシャライズの波形です、連続した長い波形
と成りますがマニュアルに依れば Follower control の後は最低でも
200ms 置いて呉れとの事です、話しが前後しますがこのLCD には
読み出し機能が皆無なんです、従って 行きっぱなし な訳です
その為に 終了したであろう と思われるインターバルを置か
なければならないのです、もっと言えばそれぞれの設定項目の間にも
最低26.3us のインターバル を入れなければなりません
波形のデータは下記の通りです
0x7C ← スレーブアドレス
0x80 ← 0x80 の意味、次の1byteの後も続くからね、って意味 Co=1、以下同様
0x38 ← 設定パラメータ、以下同様
26.3us ← 待ち時間、以下同様
0x80
0x39
26.3us
0x80
0x14
26.3us
0x80
0x78
26.3us
0x80
0x53
26.3us
0x80
0x6A
200ms ←ここだけ矢鱈に長い
0x80
0x38
26.3us
0x80
0x0C
26.3us
0x00 ← 0x00 の意味、次の1byteの後はもう無いからね最後だよ、って意味 Co=0
0x01
26.3us
I2Cプロトコルは下記の様に成って居ます、複数バイトの送信が可能です、鍵を握る
のは Co です Co=1 で送信すれば「あ、次の1バイト以降も続くのね」と LCD は理解
する、ってことです
↓
**********************************************************
0x7C 0x80
↓
0x38 0x80
↓
0x39 0x80
↓
0x14 0x80
↓
0x78 0x80
↓
0x53 0x80
↓
0x6A 200ms
↓
0x80 0x38
↓
0x80 0x0C
↓
0x00 0x01
↓
このイニシャライズですがネットを読んでいると違う方法も在ります
それは下記の様に 3byte づつの書き込みです 参考、ツール・ラボさん
0x7C
0x00
0x38
0x7C
0x00
0x39
・
・
・
といった具合にブロック毎に送信するやりかたです
0x7C ←スレーブアドレス
0x00 ←連続しないで送信するよ、という意味で連続して送信では 0x80です
0x38 ←設定パラメータ
これをイニシャライズに必要なブロックを複数送信するのですが
私は連続する方法を採用しました
ここまでのソースファイルはこちらからダウンロードして下さい、プログラム
は素人製作ですので動かないや間違い勘違い無理無駄が多く潜んでいます
発生する一切の責任を放棄します。
to be continued
2018/12/29(土)
LCDにキャラクタが出ただけでは何の意味も無く限られた
二行の範囲で有効に利用するには何所にどんな文字を出し
どれを変化させどれをそのまま固定するか、という要求が
必然的に出て来ます、なのでそれをやっていてとても理解
出来ないことがあります、幾ら場所を指定してもそこに
キャラクタが出て来ず、必ず一行目の左端に出てくるのです。
下記はLCDの表示位置のアドレスです
↓
然し乍らこのままではアセンブラでは通用しませんDDRAM
の物理的なアドレスは下記の様に成って居るのです
一行目
0x80 0x81 0x82 ・・・0xA8 までの40バイト
二行目
0xC0 0xC1 0xC2 ・・・0xE8 までの40バイト
但し表示して居るのは最初の16バイトで残りはスクロールして
初めて現れてくる表示です
例えば一行目の右端にキャラクタ表示したければ
0x8Fを指定して書き込めば良いです、また
例えば二行目の左端から三番目にキャラクタ表示したければ
0xC2を指定して書き込めば良いです
二行目の左端から三番目にキャラクタ表示させたい場合
アセンブラでは下記の様な指定をします
0x7C スレーブアドレス
0X00 コントロールバイト
0XC2 DDRAMアドレス(二行目の左端から三番目)
キャラクタ
上記をI2Cプロトコルに従ってLCDに送信すれば出るはずなのに
幾らやっても必ず一行目の左端に出てくるのです
但し、これは最初の一回目の書き込みだけで、書いて消して
又書くと今度は正しい位置にキャラクタが出てくるのです
仕方無いので最初の一回目はプログラムのバージョンを表示
させ直ちに消して目的の表示指定をして正しい位置に出る様に
成りました、下の動画は最初の v003 が一回目の書き込みです
v003
消す
Hollo
World(^_^)
LCD
最初の一発目の位置指定、何所を指定しても必ず一行目の左端
に成って仕舞うのはLCDの仕様だと推測しています、それはそれで
構わないので下記の様にすれば一発目から位置指定が可能だと
判明しました、HOME を実行すれば良いのです
マニュアルの「Return Home」このコマンドを書くことでカーソル
(見えませんが)が原点を確定してくれます
0x7C
0x00
0x02 ←Return Home
LCD イニシャライズで書いて置けば良いってことですね
表示がタラタラと表示が遅いのは目視確認出来るようにわざと
タイマーを入れて遅くしているからです。
↓
このプログラムのダウンロードはこちらから。
説明がくどいかもしれませんが念のため
例えばDDRAMアドレス 0xC0 にABCDE と書き込みしたとします
そうするとLCDは自動的に下記の様にキャラクタで埋めていきます
A 0xC0
B 0xC1
C 0xC2
D 0xC3
E 0xC4
詰まり自分でDDRAMをインクリメントして呉れます。
=======================================================
2018/12/30(日)
LCDには何種類か機能が有りますので下記をやってみました
・スクロール、左右
実際に視える範囲はDDRAM(Display Data RAM)の一部分です実際には
一行あたり40個のキャラクタが書き込めますが視えないだけ、これ等
はスクロールする事で見える様に成ります
・カーソル( _ ) ON / OFF
・ブリンク( ■/□ ) ON / OFF
・コントラストのレベル
3.3V と 5V では設定値が異なります、基本的には LCD イニシャライズ
の時に一度設定すれば電源電圧の変更や気温が大きく異なるとき以外は
設定不要です、設定は下記の様なデータシートの説明があります
↓
3.3V電源の場合は Bon (Booster ) のビットをON (Bon = 1)と成ります
下の動画で画面が真っ黒に成る状況がありますがこれは 0x56 設定
の時です、この時 Bon = 1 です
動画のソースコード
この記事はこれでお仕舞いです、温度計の記事は別にしました。