2015年5月7日木曜日

PIC12F1822,PIC16F1823のMSSPモジュールで秋月I2C LCDを動かす

7ヶ月ぶりにブログ更新するゾ^~(謝罪) 最近忙しスギィ!自分、オフトゥンいいっすか?GW中に進捗があったから新しい記事をぶちこんでやるぜー! ほんと久しぶりですいません!許して下さい!なんでもしますから!!(なんでもするとは言ってない)


お久しぶりです。前記事から7ヶ月以上経ってしまいましたが、その間いろいろ
(大学受験があったり第一志望に落ちて凹んだり第二志望になんとか受かったり
新年だったり課題研究の発表でいろいろあったり高校卒業したり大学入学したり)
あったので許してくだs(ry




==注意================================================
記事を書く際十分に注意していますが、間違っていることが書いてある場合があります。
もし間違いに気づいたらそっと教えてください。
==以降本文============================================

最近ではどのセンサもどの液晶も猫も杓子もI2Cみたいな感じで、
そろそろI2Cを使えないとマズイかな・・・と思っていました。

そこで思い出したのがけっこう前に秋月で買った¥320(当時)のLCD(AQM0802A-RN-GBW)
http://akizukidenshi.com/catalog/g/gP-06669/
↑こんなの(秋月の商品ページより。)
このLCDはI2Cで制御するのです。
ピンのピッチが1.5mmと特殊ですが、買った当時(高校生)は「学校で変換基板作ればいいか~」とか脳天気なこと考えてました。(実際使うときにはもう大学生)。

ハードウェア
このLCDは説明書にあるように配線が必要なので、ピンの根本からハンダ付しちゃいます。
↑こんな感じに。
残ったピンはVDD,GND,SDA,SCLの4本だけ。めっちゃシンプル。

I2CのSDAとSCLにはプルアップ抵抗が必要ですが、PICの内部プルアップ抵抗で代用できます。

ソフトウェア
SDAとSCLはデジタル入力ピンに設定しておきます。

PIC12F1822,PIC16F1823にはMSSPモジュールというシリアル通信をしてくれるモジュールがあり、SPIとI2Cが使えるようになっています。
今回I2Cを使うために最低限設定するMSSP関連のレジスタは、

・SSPADD(I2Cの通信速度の設定)
・SSP1CON1(その他設定)
の2つです。
  1. SSPADD
  2. I2Cの通信速度は大体100kHzと400kHzの2つがスタンダードなようです。
    (今回のLCDは0~400kHzまでOK)
    今回は特に理由は無いけど100kHzでいきます。
    PICのデータシートによると
    I2Cクロック周波数=FOSC/((SSPADD+1)*4)
    FOSCはPICの動作周波数です。
    今回私は8MHzでPICを動作させるので、
    これに当てはめると
    100*10^3=8*10^6/((SSPADD+1)*4)
    ∴SSPADD=19

  3. SSP1CON1
  4. SSP1CON1レジスタの中身はこのようになっています。
    SSP1EN・・・MSSPモジュールを 1:有効、0:無効
    SSP1M・・・MSSPモジュールのモード。1000でI2Cマスターモード。クロックをOSC/((SSPADD+1)*4)にする。

    他は全部0でいいです(適当)。
I2Cでデータをスレーブに送る流れは
  1. SENを1にしてI2Cスタート
  2. SENが0になるまで待機
  3. SSPBUFレジスタにスレーブのアドレスを入れる
  4. データが順番に送られる
  5. SSP1IF(割り込みフラグ)が1になるまで待機
  6. SSP1IFフラグをクリア
  7. SSPBUFレジスタに送りたいデータを入れる
  8. データが順番に送られる
  9. SSP1IF(割り込みフラグ)が1になるまで待機
  10. SSP1IFフラグをクリア
  11. 7~10を繰り返す
  12. PENを1にしてI2Cストップ
  13. PENが0になるまで待機
SSP1IFは割り込みフラグですが、特に必要がなければ割り込みを不許可にして
while文のループで待機させたほうが楽です。

このLCDのスレーブアドレスは0x3eです。
/************************************
2015.8.9追記
このLCDのアドレスは0x3eですが
実際に使うときはアドレスのビットにR/Wビットがつくので、
 011 1110が
0111 1100←R/Wビット(書き込みなので0)
となってプログラムでは0x7cとなっています
追記おわり
***************************************/
LCDでのコマンド送信(初期化など)ではデータを0x80→「コマンド」の順で送り、
文字を表示させたいときはデータを0xc0→「文字データ」の順で送ります
これを関数にすると
(2015/11/18 gistで見やすいように変更) のようになります(一例)
文字を送るごとにカーソルが動くので、順番に文字データを送るだけで文字列が表示されます。
また、コマンドで0xc0を送ると2行目にジャンプします。

LCDが使えればいろんなデバッグが捗りますね。

参考サイト
null:秋月 小型I2C液晶 AQM0802A-RN-GBW  駆動方法
http://kingyonull.blogspot.jp/2013/06/i2caqm0802a-rn-gbw.html

PIC16F1455/9:MSSP I2Cモード
http://sky.geocities.jp/home_iwamoto/P16F145x/P16_K14.htm

0 件のコメント:

コメントを投稿