AQM1602 LCD I2C PIC16F886 アセンブラ

秋月で買える廉価版LCDです
I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)¥550-
I2Cで色々動かして居るとどうしても読み込んだデータを表示
したく成ります、だからと言ってPIC の出力ポートにLED を接続して
モニタするにも自ずと限度があります、その時にはLCD表示が役立ちます

写真の様に基板無しでもそのまま動きます
DSCN0113

DSCN0114

ですが、コネクターの逆接続など間違うと私の経験では一瞬で壊れます
なので矢張り基板に実装してプロテクタなども実装して置けば
安心です
DSCN0111

DSCN0112

動画です
キャラクタを +1 づつインクリメントして行き表示しているだけです

I2C-BUS の様子です
S → 0x7C → A → 0x40 → A → data → A → P
これを data +1 し乍ら繰り返しているだけです

動いて仕舞えばただの、と言うか随分画面の狭いLCDです
何かの道具として使うには限定的で大したものでは無いです
然し乍ら、動くまでに丸二日無駄に過ごしました

ネット上の色々な製作記事を参考にし乍らプログラムした
のです、特に理解しにくかったのは初期化の仕方でした
普通ならばコントロール・レジスタ成る箱があって
それを指定してパラメータを書き込むものだという概念が

あるのですがこのLCDには全く別の概念が有って
Function Set  するしないを先ず宣言してから
複数のパラメータを連続して書き込みして結果的に設定する

というやりかたなんです、資料をダウンロードして
そのままパラメータを設定したのですが ウン とも
スン とも反応しません、普通 LCD ってのは電源が
入れば画面がすこーーーしぐらい暗く成るものなのですが

全く、全く反応しないのです、二日目には「これ絶対壊れてる」
と秋月に追加注文してしまいました。
資料の 初期化の例 とは下記の様な方法でした
bandicam 2018-12-27 18-57-38-730

特記すべきは Contrast set です、これが電源電圧 5V と 3.3V では
異なって居てどうやら画面が全く出て来ないそうです
それでは、という事でデータを変化させて確認して行ったのです

それでも全く画面が変化しません、全然無反応なのです
次ぎに疑ったのはI2Cのプルアップ抵抗です、Arduinoを使われる方の
記事を読むとプルアップ抵抗が1.8KΩとかで重すぎてLowレベルの
スレッショルドが確定しない、従ってI2C BUS BUFFER 成る回路

を経由してやっとこさ動くように成った、という記事です
それを読んで私はプルアップ抵抗を20KΩ~5.1KΩと試してみました
ですが全く無関係と言うか正に嘲うが如く全然反応無しでした

もう諦めてふてくされていたのです、その時、JA0QON HomePageさん
記事が目に留まり、あれ?、と思ったら 初期化の例 がちょっと
違うんです、この部分です
bandicam 2018-12-27 18-58-02-278

この順番が逆ではないですか!!
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 は理解
する、ってことです
bandicam 2018-12-28 10-43-04-968

**********************************************************

0x7C  0x80
DSCN0115

0x38  0x80
DSCN0116

0x39  0x80
DSCN0117

0x14  0x80
DSCN0118

0x78  0x80
DSCN0119

0x53  0x80
DSCN0120

0x6A   200ms
DSCN0121

0x80  0x38
DSCN0122

0x80  0x0C
DSCN0123

0x00  0x01
DSCN0124
このイニシャライズですがネットを読んでいると違う方法も在ります
それは下記の様に 3byte づつの書き込みです 参考、ツール・ラボさん

0x7C
0x00
0x38

0x7C
0x00
0x39

といった具合にブロック毎に送信するやりかたです

0x7C   ←スレーブアドレス
0x00   ←連続しないで送信するよ、という意味で連続して送信では 0x80です
0x38   ←設定パラメータ

これをイニシャライズに必要なブロックを複数送信するのですが
私は連続する方法を採用しました

ここまでのソースファイルはこちらからダウンロードして下さい、プログラム
は素人製作ですので動かないや間違い勘違い無理無駄が多く潜んでいます
発生する一切の責任を放棄します。

to be continued

“AQM1602 LCD I2C PIC16F886 アセンブラ” の続きを読む

2018年の御礼

今年も一年間、ブログをご高覧下さり誠に有り難う御座いました

当たり前ですが一週間後は既に 2019/01/02 三が日の中日なのですね
ダウンカウントに入ってきました、クリスマスが終わりいつもの様に
全国の売り場で喧しく正月商戦が繰り広げられています

年の瀬は何か追い立てられるような気持ちに成るのです、何でも年内に
と云う気持ちからでしょうか、大掃除もしなければ・・・いやだぁ・・・
今年を振り返ってみますと色々と在りすぎた年でした、自宅、事務所の
引越から始まり義母実母の葬儀、姪御甥御の婚儀、避けては通れない様々な

営みは人が生まれて滅するまでの何所にでも在る出来事と判って居ても
特に永久のお別れはイザ自分の番に成ると・・・然し乍ら順番であれば
別な意味で幸福なことです、そもそも、そんな事をボヤいて居ては度重なる

自然災害にも関わらず全てを失い悲壮絶望のどん底で全てを受け入れて
忍耐と共に希望を抱いて生き抜いておられる多くの方々に対してとても
恥ずかしい、という気持ちに成ってきます

皆様はどの様にお過ごしか知るよしもありませんが、兎に角風邪など
召されませんようにお過ごし下さい、インフルエンザがまた流行って
来て居ますのでこっちが問題ですね、でも最近は「タミフル」「イナビル」
「リレンザ」から更に進化した「ゾフルーザ」と云う飲み薬で回復する
と聞いています、でも罹りたくないです

引き続き、ブログ、宜しくお願い申し上げます。

Dscn0076

PIC16F886–I2C– S-5851A アセンブラ

SII社 S-5851A 温度センサーです
I2C で制御し温度センサーを読み出します
-40℃ ~ +125℃ の範囲の仕様です
DSCN0098

緑色の小さな基板がセンサーです秋月電子でたったの110円
DSCN0096

DSCN0097

先ずは動画です
センサーを指で触れてデータが変化している様子が確認出来ます
但しこれでは使い物に成りません、バイナリを10進変換し表示
しなければ全く意味を持ちません、単なる実験です

I2C-BUS 波形です
マニュアルが日本語なのでとても助かりました

回路図、センサー基板
本当にシンプル、殆ど外付け部品は有りません
ですが特筆すべきはスレーブアドレス設定端子のAD0 / AD1 です
これは Low / Hi  設定だけでは無くて Open  でも状態認識します
詰まり一つの端子で Low / Open / Hi の状態が在るので
スレーブアドレスはその分多く合計8個を同じBUS上に並べられるのです
bandicam 2018-12-25 20-43-36-864
回路図、PIC16F886ホスト(マスター)側の基板です
bandicam 2018-12-25 20-43-13-986

I2C BUS 波形の拡大です、波形の詳細説明は写真に写っています
信号の方向はマスターから見て RX=受信 TX=送信 です、特に
ACKは双方向なので要注意です
S=スタート・コンフィギュレーション、送信
P=ストップ・コンフィギュレーション、送信
SR=リスタート、送信
DATA=測温データ、受信
A=ACK、送信又は受信
NA=NACK、送信

最初はコンフィギュレーションレジスタのイニシャライズ
写真の波形の詳細説明、間違ってます、正しくは
 S →  0x90 →  A →  0x01 →  A →  0x00 →  A →  P   全送信(TX)
DSCN0101

DSCN0102

次は測温データレジスタの読み出し
DSCN0103

DSCN0104

DSCN0105

お仕舞いは カレントリード です
これは連続して読み出す場合 0x91  を書くだけでデータが読み出せます
簡易的にして効率化を図っているのですね
DSCN0106

DSCN0107

波形を観測していて気が付いた点があります、それは測温データの

読み出し一回目は必ず 0x00 0x00 が返って来るという事です
言い換えれば測温データは前回のデータを記憶していてデータが

読み出されるとリフレッシュされる、と言い換えられます、詰まり
電源オンで一回目の読み出しはゼロクリアされた測温データが残って居て
それを読み出して初めて新鮮な測温データが書かれるという事です

温度レジスタ構成です、マイナス側に注目ですね
bandicam 2018-12-25 23-45-16-115

ソースコード等のファイルですがこのブログにアップロードすると
矢鱈に画面が縦長に成ってしまうのでダウンロード出来るように
アップロードしました、こちらからダウンロードして下さい。

素人プログラムなので笑われるのは覚悟です、が、これに依るトラブル
等は一切関知致しません、遊びの範囲でご利用下さい。