2018年11月17日土曜日

I2C通信でLCD表示器に文字表示ができましたが...

LCD表示器に文字表示ができましたが、標準の書き方ではなく...


使用したのはスイッチサイエンスで購入した8文字2行表示のAQM0802A(5V版)です。
5V版なので、10月27日に公開したRTCの回路にそのまま追加しました。

接続図


コマンド・データの書き込み手順


コントロールICはST7032iで、そのマニュアルによると、コマンドやデータはいずれもコントロールバイトとデータバイトの2バイトのセットで書き込むようになっています。

コマンドの場合 複数連続して書き込む場合 :$80+1byte(コマンドコード)
        単独又は最後に書き込む場合:$00+1byte(コマンドコード)
データの場合 複数連続して書き込む場合 :$C0+1byte(データコード)
       単独又は最後に書き込む場合:$40+1byte(データコード)

$00+1byteや$40+1byteの後には必ずI2Cのストップコンディションが続いて終了することになっています。


連続書き込みでは$80や$C0を毎回書くのですが...


実際にプログラムを作って試してみると、
S+ADR+($80+CmdCode)+($80+CmdCode)+...+($00+CmdCode)+P

S+ADR+($C0+Data)+($C0+Data)+($C0+Data)+...+($40+Data)+P
 (S:スタートコンディション、ADR:スレーブアドレス、P:ストップコンディション)
という書式で確かに書き込みができました。

しかし、ネット検索をしてみますと、$80や$C0を用いて連続書き込みをするのではなく、$00や$40を用いて1byteずつ書き込む例も結構見られます。例えばArduinoのC言語であれば、Wireライブラリを用いて、

コマンド書き込みの場合は
Wire.beginTransmission()とWire.endTransmission()で挟んで
Wire.write()で$00と1byteのコマンドを書く。

データ書き込みの場合は
Wire.beginTransmission()とWire.endTransmission()で挟んで
Wire.write()で$40と1byteのデータを書く。

というような形式です。(この例のbeginTransmission()とendTransmission()はそれぞれS+ADRとPだと思われます。)


もう少し効率的に連続書き込みをする方法がありました


確かに、1文字の書き込みなら$00や$40を用いるのがマニュアル通りの書き方なので良いのですが、複数バイトのコマンドやデータを書き込みたい場合には、スタートコンディション、スレーブアドレス、ストップコンディションを1byte毎に書くことになり、いかにも非効率です。
かといって、連続書き込み用の$80や$C0を1byte毎に書くのもあまり効率が良いとは言えません。スタートコンディション、スレーブアドレス、ストップコンディションは1回で済むという利点はありますが。(これしか方法がないのなら仕方がないのですが)

他の書き込み方はないのかと色々と試行錯誤した結果、下記のような書式で書き込めることを確認しました。

コマンド書き込みの場合
S+ADR+$00+(複数のコマンドコードを順に)+P

データ書き込みの場合
S+ADR+$40+(複数のデータを順に)+P


この書き方は、明らかにマニュアルで説明されている書式とは異なっているのですが、画像のようにちゃんと書き込めています。

AQM0802A表示例


最後に

なぜST7032iのマニュアルに載っていない書式で連続書き込みができるのかは分かりませんし、マニュアルを熟読すればどこかに記載されているのかもしれませんが、あくまでもAQM0802Aの一使用例として見ていただければと思います。
何か勘違いや間違い等ありましたらご指摘いただけるとありがたいです。

6809のアセンブラでLCDWR.TXT,LCDWR1.TXT,LCDWR2.TXTの3つのプログラムを作成し、いずれも正常に書き込みできることを確認しました。

LCDWR.TXTの書式(最も短い)
  command : S+ADR+$00+cmd1+cmd2+...+lastcmd+P
  data         : S+ADR+$40+dat1+dat2+...+lastdat+P
LCDWR1.TXTの書式(初期化コマンドのみ短い)
  command : S+ADR+$00+cmd1+cmd2+...+lastcmd+P
  data         : S+ADR+($C0+dat1)+($C0+dat2)+...+($40+lastdat)+P
LCDWR2.TXTの書式(標準の書式)
  command : S+ADR+($80+cmd1)+($80+cmd2)+...+($00+lastcmd)+P
  data         : S+ADR+($C0+dat1)+($C0+dat2)+...+($40+lastdat)+P

参考になるかどうかわかりませんが、作成した3つのプログラムのソースをMicrosoftのOneDriveに上げておきます。


0 件のコメント:

コメントを投稿