前回までの状況はこちら。
最新ソースをgitHubにアップしました。
https://github.com/takishita2nd/GLCD
画面に四角を書きます。
これもこちらのAudiunoのサンプルコードをPython用に書き換えた物です。
def GLCDBox(Xp0, Yp0, Xp1, Yp1):
for i in range(Xp0, Xp1 + 1):
GLCDPutPixel(i, Yp0)
GLCDPutPixel(i, Yp1)
for i in range(Yp0 + 1, Yp1):
GLCDPutPixel(Xp0, i)
GLCDPutPixel(Xp1, i)
def GLCDPutPixel(Xp, Yp):
#ラインの選択処理
L = 1 << (Yp % 8)
#LCDに表示するアドレスの位置をセットする
SetLocation(Xp, Yp)
#LCD画面の現在表示内容に指定位置のビット(L)をON(XOR)させ、そのデータをLCDに送る
L = ReadData() | L
SetAddress(SetCol)
WriteData(L)
def ReadData():
#データピンを入力に設定
for i in range(8):
GPIO.setup(DATA_p[i], GPIO.IN)
#読み込みモードにする
GPIO.output(RW_p, GPIO.HIGH)
GPIO.output(RS_p, GPIO.HIGH)
#データを読み込む
GPIO.output(E_p, GPIO.HIGH)
GPIO.output(E_p, GPIO.LOW)
ans = 0
GPIO.output(E_p, GPIO.HIGH)
for i in range(8):
ans = ans | (GPIO.input(DATA_p[i]) << i)
GPIO.output(E_p, GPIO.LOW)
#書き込みモードにする
GPIO.output(RW_p, GPIO.LOW)
#データピンを出力に設定
for i in range(8):
GPIO.setup(DATA_p[i], GPIO.OUT)
return ans
ピクセルを置く際には、一度表示させているデータを取得し、そのデータのORをとって表示させます。
※サンプルではここがXORになっていたけど、どっちが正しいんだろ?
READする時は、ピンのモードを出力から入力に切り替える必要があります。
実行結果はこうなりました。
んんー?なんかおかしいぞ?
もしかして、信号の読み取りでおかしなデータを読み込んでいるんじゃ無いか?
タイミングチャートを確認する。
ここを確認すると、E信号のHIGHにしてからLOWにするまでの時間(tWH、tWL)が最低450nsと書かれています。
なので、この間に0.5ms(500ns)をsleepを入れてみます。※追記あり
EWAIT = 0.0005
def ReadData():
#データピンを入力に設定
for i in range(8):
GPIO.setup(DATA_p[i], GPIO.IN)
#読み込みモードにする
GPIO.output(RW_p, GPIO.HIGH)
GPIO.output(RS_p, GPIO.HIGH)
#データを読み込む
GPIO.output(E_p, GPIO.HIGH)
time.sleep(EWAIT) #★
GPIO.output(E_p, GPIO.LOW)
ans = 0
GPIO.output(E_p, GPIO.HIGH)
time.sleep(EWAIT) #★
for i in range(8):
ans = ans | (GPIO.input(DATA_p[i]) << i)
GPIO.output(E_p, GPIO.LOW)
#書き込みモードにする
GPIO.output(RW_p, GPIO.LOW)
#データピンを出力に設定
for i in range(8):
GPIO.setup(DATA_p[i], GPIO.OUT)
return ans
def command(value, mode):
GPIO.output(RS_p, mode)
for i in range(8):
GPIO.output(DATA_p[i], (value >> i) & 0x01)
GPIO.output(E_p, GPIO.HIGH)
time.sleep(EWAIT) #★
GPIO.output(E_p, GPIO.LOW)
モッサリしてる。
もう一度タイミングチャートを確認。
tNはEをHIGHにしてからデータ端子0-7が出力されるまでの時間です。
この表を見れば最大25nsと書いてあります。
なので、E信号のsleep時間を0.03ms(30ns)まで縮めてみましょう。※追記あり
EWAIT = 0.00003
だいぶマシになったのではないでしょうか
動作も安定してオールOKです。
いやーすごい濃いことやってるなー
※追記
ああああ!
単位間違えてるじゃん!
これじゃあμsじゃん!
正しくnsに修正。
EWAIT = 0.0000005