LSI Jiu-Jitsu

電子工作とブラジリアン柔術

OLED 0.96インチで遊ぶ (7) - PICから表示

Amazonで1.3インチのOLEDを見かけたので買ってみました。

https://www.amazon.co.jp/dp/B01M9CIFU5/www.amazon.co.jp

レビューを見るとインターフェース(SPI or I2C)と色(白 or 青)は届くまでわからないとのこと。
確かに注文時に選択する箇所が無いので、I2Cが届くことを願いながら注文しました。

結果・・

届いたのは7ピンのSPIでした(笑)

0.96インチと並べると大きさは一目瞭然です。

調べてみると裏の抵抗の位置を変えればI2Cで動かすことができるらしいのですが、せっかくなのでSPIのまま動かしてみることにしました。
また、コントローラーもSSD1306では無く、SH1106と言う型番のようでレジスタ形態が若干違うようです。
データシートは検索したら直ぐに入手できました。

ベースとなる回路とプログラムは前回作った馬のアニメーションgifです。
PICのSSP1はそのままI2CでEEPROMを接続し、SSP2をSPIにしてOLEDと接続しました。

f:id:mohran:20180704001102p:plain

OLEDのピンは左から
  GND
  VCC
  SCK(SPIクロック)
  SDI(SPI入力データ)
  RES(リセット)
  DC(データ/コマンド)
  CS(チップセレクト)
の並び順になっています。

DCとCSが存在しているので、4線式のSPIであることが伺えます。
SH1106のデータシートにタイミングチャートが載っていました。

f:id:mohran:20180704001108j:plain

A0がDCに相当しており、Lowでコマンド、Highでデータとなっています。

PICとの接続は下記のようにしました。
  RC4 : SCK
  RC5 : SDI(SDO)
  RA2 : RES
  RC2 : DC
SPIデバイスはOLEDのみなので、CSはLow固定にしています。

SPIクロックは最速の1Mにしました。
SPI通信はI2C通信と同様にPICのレジスタを操作することでPICが自動で行いますが、DCはRC2を直接操作して設定しています。

コマンドはほぼSSD1306と同じでしたが、アドレッシングモードはPageモードのみのようで、カラムには2のオフセットを付けて指定する必要があるようです。
(値2で位置0になる)
また、チャージポンプの設定は不要でした。

その他、表示On(0xaf)もSSD1306と同じなのでさほど苦労せずに動かせました。
しかし、せっかく1MHzのSPIクロックで送信しているのに表示はそれほど速くなった感じがしません。
おそらく400KHzのI2CクロックでEEPROMから表示データをリードしているのがボトルネックになっていると予想されます。
そこで、EEPROMも高速版(最大1MHz)の24FC512を使用してSPI、I2C共に1MHzで動かしてみることにしました。
24FC512は秋月電子で140円でした。

8MHzのメインクロックから、I2Cクロック1MHzを作るにはデータシートの式からSSP1ADDには値1を設定しなければいけません。

f:id:mohran:20180705001230j:plain

しかし、注釈のようにSSP1ADDはI2C使用時は3以上では無いといけないようなので、逆算するとメインクロックは最低でも16MHzが必要になります。
また、SSP1STATのビット7 のSMPにも1をセットしないと1MHzで通信できないようでした。

f:id:mohran:20180705233947j:plain

これに気がつかず3時間ほどハマってしまいました(笑)
(ステータスレジスタなのに設定項目があったとは・・)

このように色々と変更を加えたプログラムはこちらになります。

前回のI2C 400KHzよりもかなり高速に表示できました。
そして、1.3インチも見やすくていい感じです。


[参考記事]