人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 で I2C 液晶(6) - コマンド発行 (4) (9/2)

8/30以降の5つの記事で致命的な間違いがあった。
G_i2cwriteサブルーチン内のコントロールバイトを0としていたが、次のサイト様でCo=1,RS=0として単独コマンドモードとすべきだった事が分かった。
null: 秋月 小型I2C液晶 AQM0802A-RN-GBW 駆動方法

かつI2C液晶の取扱説明書も間違っている事を指摘されている。また図は連続モードではなく、単独モード(Co=1)でコントロールバイト+データバイトの2バイトの組で送るパターンの後に、連続モード(Co=0)に切り替えて以降1バイトずつ送っている様子を示している。図として載せるなら連続モードのケースを載せて欲しいな。最初にCo=0のコントロールバイトを付けて送り、Stopコンディションを送るまでコントロールバイトをCo=1に切り替えることはできない事を教えてほしい。
今まで間違って0にして連続モードにしてしまっていたが、連続モードでもStopコンディションを送るまではうまく動くのでOKだったらしい。
逆に初期化で連続コマンドモードで送る事を試してみたらうまくいった。Clear Display だけまた退避だが。そしてGosubにしたらさらに容量削減。

修正したソースは以下の通り。
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Contrast Control
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 24
$swstack = 4
$framesize = 8
Config Scl = Portb. 1
Config Sda = Portb. 0
Config I2cdelay = 5
Config Clockdiv = 1
Dim A As String * 10 , I As Integer , W As Byte
'--- Instruction Description Command ---
Const Ins_cleardsp = &H01
Const Ins_returnhm = &H02
Const Ins_entrymd = &H04
Const Ins_dsponoff = &H08
Const Ins_curdspsft = &H10
Const Ins_funcset = &H20
Const Ins_setcgram = &H40
Const Ins_setddradr = &H80
'--- Instruction table 1 Command (IS=1) ---
Const Ins_intoscfreq = &H10
Const Ins_seticonadr = &H40
Const Ins_powericonctrst = &H50
Const Ins_flwctrl = &H60
Const Ins_contrstset = &H70
'--- I2C Init ---
I2cinit
'--- LCD Init ---
Waitms 40
I2cstart
I2cwbyte &H7C
I2cwbyte 0
I2cwbyte &H38
I2cwbyte &H39
I2cwbyte &H14
I2cwbyte &H70
I2cwbyte &H52 '56->52
I2cwbyte &H6C
Waitms 201
I2cwbyte &H38
I2cwbyte &H0C
I2cstop
W = 1
Gosub G_i2cwrite
Waitms 2
'--- Output Data (String) ---
A = "@Hello"
I2csend &H7C , A , 6
'--- Output DDRAM Address ---
W = Ins_setddradr Or &H42
Gosub G_i2cwrite
'--- Output Data (String) ---
A = "@World"
I2csend &H7C , A , 6
'--- Contrast Command ---
I = 8 '32(C5=1):3V -> 8(C3=1):5V
Do
Waitms 300
'--- Function Set ( 8-bit, 2-line, IS=1 ) ---
W = Ins_funcset Or &B11001
Gosub G_i2cwrite
'--- Contrast Set ( C3, C2, C1, C0 ) ---
W = I And &B1111
W = Ins_contrstset Or W
Gosub G_i2cwrite
'--- Power/Icon Control/Contrast Set ( C5, C4 ) ---
W = I And &B110000
Shift W , Right , 4
W = W Or &B000 '100=3V, 000=5V
W = Ins_powericonctrst Or W
Gosub G_i2cwrite
'--- Function Set ( 8-bit, 2-line, IS=0 ) ---
W = Ins_funcset Or &B11000
Gosub G_i2cwrite
Decr I
If I < 0 Then I = 8
Loop
End
'--- Sub routine : Output Command ---
G_i2cwrite:
I2cstart
I2cwbyte &H7C
I2cwbyte &H80
I2cwbyte W
I2cstop
Return
' History
' [2016/09/02]
' Sub -> Gosub
' LCD Init : Call Sub -> I2cwbyte
' Waitus 27 delete 'BASIC Statement Call delay
' Sub G_i2cwrite() : I2cwbyte 0 -> &H80 'Single(Co=1),Cmd(RS=0)
' I2csend : @=&H40(Co=0,RS=1)x(Follow,Data) <=> &H80(Co=1,RS=0)
' [2016/09/01]
' Real waiting time of LCD Init Command
' ->Not Use Read EEPROM
' ->Not Use $eeprom
初期化のWaitus 27はBASIC文呼び出しの遅延分で相殺されたと考えている。これでサイズは600バイトに減った。初期化が342バイト。またI2csendの先頭文字が@だったのは、ASCIIコードで&H40であり、連続データモードである事を1バイト目で示している。これは1文字しか送らない時も@で大丈夫な事は確認済み。これを応用するとたぶんByte配列で先頭に連続コマンドモードである&H00を格納してコマンドを送れば3つぐらいのコマンド(ここのコントラスト制御)などに使えるのかもしれない。ただWaitを考慮してくれないので初期化には使えないだろう。700バイト近く空くのでATtiny13でも結構色々出来るかな?

by k1segawa | 2016-09-01 23:47 | arduino, AVR | Comments(0)