ArduinoでaitendoのFSTN液晶を動かす、続編
前の記事でArduinoでaitendoのFSTN液晶(128x64)を動かす方法について解説しました。
その記事を書いた時に気になっていたのがu8glibのライブラリの定義をどうするかです。この液晶のコントローラーチップはUC1701なのでそれに合わせた設定が必要です。
▼u8glibのdevicesのUC1701の部分 (クリックで別窓に拡大)
ソフトウエアSPI(SW SPI)の場合は下記(赤枠内の上段)で定義することになっています。
U8GLIB_MINI12864(sck, mosi, cs, a0 [, reset])
そこで、sck=13, mosi=11, cs=10, a=9と設定。リセットを8に割り当ててもいいのですが、配線が面倒なので電源(3.3V)に接続。ということで、前の記事では次のようにプログラムしました。
U8GLIB_MINI12864 u8g(13, 11, 10, 9); // UC1701用のライブラリを使用
ところで、「PIC AVR 工作室 ブログ」の「6502 Laptop」という記事の最後に貼られていた、 [Cheap][Hack] a 2.50$ Chinese MP3 Player for its 128×64 mini LCDに書かれているプログラムを見るとUC1701をハードウエアSPIで使っているようです。
ハードウエアSPIで使う場合は下記(赤枠内の下段)の定義を使うことになっています。
U8GLIB_MINI12864(cs, a0 [, reset])
実は以前はこの意味が理解できなかったのでソウトウエアSPIを使いました。しかし今回、この上のリンクの記事読んで判りました。ハードウエアSPIで使うピンは物理的に決まっているのでソフトで定義は不要(というか定義は不可能)。そこで残る cs, a0, [reset]だけ定義すればいい、ということになります。ソフト/ハードSPIのどちらであるかは引数の数で判るので名前はMINI12864だけで大丈夫ということのようです。
つまり、U8GLIBの定義(前の記事のプログラムの11行目)を以下のように書き換えればいいはずです。
U8GLIB_MINI12864 u8g(10, 9); // HW SPIで動かす
これ、やってみるとちゃんと動きました。
となるとハ-ドウエアSPIでどれくらい高速化されるのか知りたくなります。ということでオシロで波形を見てみました。
▼ソフトウエアSPIの場合
上の波形がSPIのクロック(sck)、下の波形がデーター(mosi)、横軸は500ns/div.、オシロのトリガはデーターの立ち上がりで掛けています。
この波形のクロック周期は1500nsなので転送速度は約660kbpsということになります。クロック波形にジッタがあるのは内部処理の周期が見えているのだと思います。
話は飛びますが、この波形はアナログオシロで見ているのでジッタはすぐに判ります。でもデジタルオシロだとすぐに気付かない気がします。とは言ってもデジタルオシロは持ってないのでこの話はあまり自信無いです。
話を戻して、ハードウエアSPIの場合の波形を見てみます。
▼ハードウエアSPIの場合
横軸は100ns/div.です。
クロック周期は250nsになっていて、転送速度は約4Mbpsに上がっています。流石はハードウエアSPIです。
◆まとめ
ということで、u8glibでのデバイスの定義の方法(コンストラクタの書き方)の理解が深まりました。
ArduninoのハードウエアSPIを使うとビットレート4Mbpsでデーターが転送されることが確認できました。但しこんな速度でCPU(ATmega328)から連続的にデーターを送り込むのは難しいと思うので、この値はたぶん瞬間最大値なんでしょう。でも他に事情が無ければハードウエアSPIを使わない手は無いでしょう。
その記事を書いた時に気になっていたのがu8glibのライブラリの定義をどうするかです。この液晶のコントローラーチップはUC1701なのでそれに合わせた設定が必要です。
▼u8glibのdevicesのUC1701の部分 (クリックで別窓に拡大)
ソフトウエアSPI(SW SPI)の場合は下記(赤枠内の上段)で定義することになっています。
U8GLIB_MINI12864(sck, mosi, cs, a0 [, reset])
そこで、sck=13, mosi=11, cs=10, a=9と設定。リセットを8に割り当ててもいいのですが、配線が面倒なので電源(3.3V)に接続。ということで、前の記事では次のようにプログラムしました。
U8GLIB_MINI12864 u8g(13, 11, 10, 9); // UC1701用のライブラリを使用
ところで、「PIC AVR 工作室 ブログ」の「6502 Laptop」という記事の最後に貼られていた、 [Cheap][Hack] a 2.50$ Chinese MP3 Player for its 128×64 mini LCDに書かれているプログラムを見るとUC1701をハードウエアSPIで使っているようです。
ハードウエアSPIで使う場合は下記(赤枠内の下段)の定義を使うことになっています。
U8GLIB_MINI12864(cs, a0 [, reset])
実は以前はこの意味が理解できなかったのでソウトウエアSPIを使いました。しかし今回、この上のリンクの記事読んで判りました。ハードウエアSPIで使うピンは物理的に決まっているのでソフトで定義は不要(というか定義は不可能)。そこで残る cs, a0, [reset]だけ定義すればいい、ということになります。ソフト/ハードSPIのどちらであるかは引数の数で判るので名前はMINI12864だけで大丈夫ということのようです。
つまり、U8GLIBの定義(前の記事のプログラムの11行目)を以下のように書き換えればいいはずです。
U8GLIB_MINI12864 u8g(10, 9); // HW SPIで動かす
これ、やってみるとちゃんと動きました。
となるとハ-ドウエアSPIでどれくらい高速化されるのか知りたくなります。ということでオシロで波形を見てみました。
▼ソフトウエアSPIの場合
上の波形がSPIのクロック(sck)、下の波形がデーター(mosi)、横軸は500ns/div.、オシロのトリガはデーターの立ち上がりで掛けています。
この波形のクロック周期は1500nsなので転送速度は約660kbpsということになります。クロック波形にジッタがあるのは内部処理の周期が見えているのだと思います。
話は飛びますが、この波形はアナログオシロで見ているのでジッタはすぐに判ります。でもデジタルオシロだとすぐに気付かない気がします。とは言ってもデジタルオシロは持ってないのでこの話はあまり自信無いです。
話を戻して、ハードウエアSPIの場合の波形を見てみます。
▼ハードウエアSPIの場合
横軸は100ns/div.です。
クロック周期は250nsになっていて、転送速度は約4Mbpsに上がっています。流石はハードウエアSPIです。
◆まとめ
ということで、u8glibでのデバイスの定義の方法(コンストラクタの書き方)の理解が深まりました。
ArduninoのハードウエアSPIを使うとビットレート4Mbpsでデーターが転送されることが確認できました。但しこんな速度でCPU(ATmega328)から連続的にデーターを送り込むのは難しいと思うので、この値はたぶん瞬間最大値なんでしょう。でも他に事情が無ければハードウエアSPIを使わない手は無いでしょう。