昨日Arduino NANOで動作確認(「Arduino NanoでGM009605の動作テストをする」)したSSD1306がPIC24FJ64GB002で駆動できるようになったので覚書き。
昨日も書いた通り、基板裏にはGM009605とあるものの、SSD1306の方が通りがいいので以後SSD1306と呼ぶ。
参考にしたのはMicrochipのForumで見つけたPIC18用に書かれた縦32ピクセルのOLED用のコードと、Arduino用のAdafruit製のライブラリだ。
上のForumには、ここで参考にしたものより新しいdsPIC用のコードもあがっていたが、PIC18の方が慣れているのでそちらを参考にさせていただいた。
この投稿が2014年のものなので、探せばもっとピッタリの物が見つかるかもしれないが、コンバートするのも楽しそうなのでやってみることにした。
開発環境
MPLAB X(v3.45)
MPLAB Code Configurator(v3.36)
XC16(v1.26)
まずはMCCでコードを準備する。
System関連は特に書くことも無い。
動作確認のLチカとI2Cの初期化時の待ち用のDelayのためにTimer1を追加する。
これも同様に特に書くことは無い。
主役のI2CとしてI2C1を追加する。
MCCで使うのは初めてだ。
最近はSPIの方が良く使う。
まあ、いずれにしても、たったこんだけ。
この段階でピンを確認してブレッド・ボード上で配線を済ませてしまう。
3ピンはLチカ用だ。
Generateする。
これを土台にして、参考にしたコードをPIC18からPIC24、32ピクセル用から64ピクセル用へと変更していく。
基本的に、I2Cの初期化関連はMCCの吐いたコードに任せ、OLEDとのやり取りは参考にするコードの方をなるべく生かす。
まず、I2CInit();とかの、明らかにI2C関連の初期化をしている部分をコメント・アウトする。
このあたりの処理はMCCの吐いてくれたコードが代わりにやってくれるからだ。
次に、通信関連のレジスタ名をPICの違いに合わせて変更する。
それもMCCの吐いたi2c1.cに説明付きで書かれているのを見て確認してからコピペすれば済む。
何の関連も無いでたらめな名前を付ける人はいないので、ほとんどがちょっと眺めればこれだなと分かる。
ここまで、データ・シートを見て調べたのはI2C1STATbits.TBF(Transmit Buffer Full Status bit)とI2C1STATbits.TRSTAT(Transmit Status bit)だけだ。
というより、データ・シートを見たのがこのときが初だ。
MCC様様。
参考にしたコードは128×32ピクセル用のコードになっていたので、この部分はArduino用のライブラリを参考に変更している。
Arduinono用のライブラリのコードは#if defined SSD1306_128_32とか書いてあって条件分岐が分かり易い。
ざっと眺めてその部分を拾ってSSD1306_128_64対応のコードに書き変えればいい。
初期化コードを送る部分。
バッファに用意したデータをSSD1306のメモリーへ転送する部分。
他にも細かなところがあったかもしれないが、32を64に変更するとかの分かりやすいものだけだったと思う。
最終的にこんなものを表示させて全体のずれが無いことを確認した。
視認性の良さという点では抜群だし、コンパクトなので、いろいろ使えると思う。
追記
その後、最速の設定で試してみたが特に問題も無く動作した。
もともとSPIにも対応しているICのようなので、I2Cでは楽勝なのだろう。
なお、参考にしたコード、というかそのまた大元のAdafruitのコードは、1度マイコン内部のバッファにデータを整えた後でまとめてOLEDに転送している。
何となく速度的には無駄をしているようには思う。
参考
「Arduino NanoでGM009605の動作テストをする」
「PIC32MX470F512H + SSD1306(GM009605)」
「ESP8266 + SSD1306(GM009605)」
numeru55 on 2019年10月29日 at 8:21 PM said:
「基本的に、I2Cの初期化関連はMCCの吐いたコードに任せ、OLEDとのやり取りは参考にするコードの方をなるべく生かす。」
一晩かかって動かなかったLCDが,この手法で動き始めました! ありがとうございました!
sahara on 2019年10月30日 at 3:16 AM said:
コメントありがとうございます。
お役に立てたのなら幸いです。