【ラズパイ】【GLCD】画面に四角の線を引く※追記あり

前回までの状況はこちら。

最新ソースを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