I2C-LCDに表示させるだけで、1日がかりになってしまった。I2Cを扱うのは、初めてだったが、ドキュメントをあれこれ見て、概ね制御方法を理解し、PICの設定、データ送信制御のプログラムを書いてみた。。。が、ぜんぜん動かず。そもそも、なにも表示されないので、どこが悪いかも分からず。試行錯誤に突入。。。。。
オシロでI2C通信で使うSDA(RC1)とSCL(RC0)を確認すると、何らかの信号は出ている。クロック周期を確認すると、11μs程度で、設定している100kHzと概ね合致している。LCDのデータシートを確認すると、通信クロックは100kHzとなっているので、大丈夫そうだ。となると、PICのレジスタの設定は正しそうだ。
こうなると、タイミングというやっかいな問題が疑われる。液晶のドライバチップは、適正なWaitを入れなければ、機嫌良く動いてくれない代物。そして、PICのMSSPモジュールには、複雑怪奇なレジスタがたくさんある。
私が利用しているのは、PIC16F1823という比較的新しい種類のCPUであり、I2C機能も最新版が搭載されている。しかし、新しいと言うことは、ネット上のノウハウも少ないと言うこと。色々検索してみた。古いチップのMSSP機能の設定情報はいくつか検索できた。しかし、レジスタ構成が微妙に異なっており、そのままではやはり動かない。
仕方ないので、マイクロチップのデータシートのI2Cのところを熟読することに。データシートと言っても436ページもあるりっぱな本で、I2Cパートだけでも40ページもある。日本語版が提供されたのだが、直訳本によくありがちな変な日本語で何が書いてあるさっぱりわからない。結局、それらしいレジスタを一つ一つ設定を変えながら動作の確認をするという地道な作業に。
それにしても、レジスタ名が以前と微妙に変わっていて、SSPBUFだったものがSSP1BUFと変化している。しかも、SSPBUFでコンパイルしても、エラーが出ない。当然、動かない。。。。また、データシートのレジスタ名が間違えているところまである。PC上のシステムファイルを確認してようやく分かったもの。やっかいだ。
そんな苦労の末、何とか、動く設定に巡り会えた。パラメータを完全に理解している訳ではないので、もしかしたら、適切ではない可能性もあり、もう少し、検証して整理する必要はあるが、とりあえず、動いたバージョンの情報を以下に記しておく。
// I2Cモード初期設定
void i2cInit(void)
{
// SSPCON1
SSP1CON1 = 0b00101000; // I2Cマスターモード指定 clock= Fosc/(4*(SSP1ADD+1))
// SSPEN = 1; // Enables Serial Port Mode
// SSPM0 = 1; // I2C Master Mode clock= Fosc/(4*(SSP1ADD+1))
// SSPM1 = 0; // I2C Master Mode clock= Fosc/(4*(SSP1ADD+1))
// SSPM2 = 0; // I2C Master Mode clock= Fosc/(4*(SSP1ADD+1))
// SSPM3 = 0; // I2C Master Mode clock= Fosc/(4*(SSP1ADD+1))
// SSPCON2
SSP1CON2 = 0x00; // アイドル
// SSPCON3
SSP1CON3 = 0x00; // 標準設定、割込み無し
// SSP1STAT
SSP1STAT = 0b11000000; // I2C STATUSの設定
// SSP1STAT = 0b01000000; // I2C STATUSの設定
// SMP = 1; // 100kbps
// CKE = 1; // SMBus Specific Inputs Enabled
// SSP1ADD
// SSP1ADD = 0xF0; // ~31kHz
// SSP1ADD = 0x9F; // ~50kHz
SSP1ADD = 0x6F; // ~71kHz(動作はここまで)
// SSP1ADD = 0x5F; // ~83kHz(動作せず)
// SSP1ADD = 0x4F; // ~100kHz
//SSP1ADD = 0x19; // ~308kHz
//SSP1ADD = 0x13; // ~400kHz
SSP1IF = 0 ; // SSP(I2C)割り込みフラグをクリアする
// BCL1IF = 0 ; // MSSP(I2C)バス衝突割り込みフラグをクリアする
}
この中で、特にやっかいさったのは、SSP1ADDの設定値。LCDのデータシートには100kHzで動くようなことが書いてあるので、データシートに記載されている値を試してみると、うんともすんとも言わない。徐々に設置値を下げ、70kHzでようやく動くようになった。なんてこったい!!せめて、仕様通りの範囲では動いてくれよぅ~~~。。。
更に、SSP1STATの設定も何かくせがあり、今ひとつ現状で動いている理由がよくわからない。これは、近日中(忘れない内)に、正確に理解しておかねばなるまい。
とりあえず、きちんと表示されている証拠写真を掲載しておく。検証中なので、数字列しか表示しておらず、色気がなく申し訳ないが・・・・この苦労を分かち合ってくれる人は、、、なかなかいないか。。。。