2010/12/01(水)aitendoのOLEDモジュールと戦う その2

前回の日記の続き、結局「がんばる」という結論になったOLEDのバグ対策だが、後日色々考えて実験した結果、完全回避ができた。まさに解決と言えよう。
まず、Rect描画命令、Line描画命令だが、これはどちらも右肩下がり以外はバグが発生していた。ちあきさんに相談した時点ではLineのみと言っていたが、解析の結果どうやらアドレスインクリメントに逆らう描画の時にバグることがわかった。Line描画に関しては、つまりこうしてしまえば良い、
  • 画面左上を(0,0)とした場合
  • 右肩下がりの描画はそのまま命令転送
  • 右肩上がりの描画は、画面のアドレスを反転させ右肩下がりとして命令転送
この反転についてだが、SSD1332には、画面座標の(見た目的に)上下左右反転の設定ができるSet Re-map & Data Formatという設定項目がある。その設定を巧みに利用して、以下のパターンを実験した。(下図)

SSD1332_BUG01.png
SSD1332_BUG02.png
SSD1332_BUG03.png


結果、Line描画に関しては通常描画・反転処理して描画・垂直は始点座標を上から下へ値のスワップ、の3つに分類することによって回避できた。

次にRect描画命令のバグだが、これも基本はLineバグと同様の症状だ。四角形の座標指定方法としては、
  1. 始点を左上、終点を右下
  2. 始点を右上、終点を左下
  3. 始点を左下、終点を右上
  4. 始点を右下、終点を左上
があるがこの1番以外全てバグる。ただしこちらの回避は非常に簡単で、始点を常に描画する四角形の左上に持っていけばよいだけだ。四角形は直線の座標指定と違って、始点座標と終点座標のXとYを個別に入れ替えても描画する四角形の形は変わらない。そのため、IF文で始点Xと終点X、始点Yと終点Yを調べて入れ替えるだけで良い。

そんなわけで、漸くこのOLEDを使用するスタートラインに立つことができた。実はすでに半角フォント描画も入れてあるので後は何かを作るだけなのだ。