I2C Slave mode for PIC12F1822


 I2C Slave Mode って 

 以前PIC16F88を使って[I2CのSlave動作]をさせた事があります。最近もう一度動作実験をしたいと思い、手元の新しいPIC12F1822を試した所、動作しませんでした。
 理由は不明、動作を理解して作ったSoftではありません、いわば物まねのBlack Boxで、少し変わるとお手上げです。

 色々と調べると、1800/1900番台のPICは以前のICと別の様でかなり大胆な変更がありました。今回完全では無いのですがどうにか動き出したのでここに公開しておきます。
 タイマーだけなら8Pinでも動きそうで、小形に作れそうです。
 …実は「自分が見て再利用している」のです…


 動作を確認します! 

 ここで使ったプログラムはRTC(時計)コントロール用の物です、R2(秒)とR3(分)を読みだす物を参考にしました。
 タイマーも入っていますが[Timer1]を使って1秒を作り、カウントアップさせレジスターに保存しています。

マスター方向 スレーブ参 考
 I2Cバス使用開始
I2Cアドレス+W アドレスが合っているアドレスは不要なので空読み
  A:アクノリッジ 
レジスターアドレス レジスターの何番目レジスター番号の受け取り
サンプルでは[2]
  A:アクノリッ ジ
 再スタート
I2Cアドレス+R アドレスが合っているアドレスは不要なので空読み
  A:アクノリッジ 
DATAの受け取り1回目 Register[2]dataをバッファーに入れる
A:アクノリッジ   
DATAの受け取り2回目 Register[3]dataをバッファーに入れると自動送信
NA:ノー・アクノリッジ 終了なので何もしない  
 I2Cバス開放

[A]はアクノリッジ:受け取ったと知らせる信号でハード的に作られ自動的に送信される、考える必要ない。
[W]はマスターがスレーブのレジスターに書き込みをする。
[R]はマスターがスレーブのレジスターから読み出しをする。
[→]などは信号の方向


 I2C Slave動作(のタイマー) 

 Register[0]とRegister[1]は未使用、Register[2]は59秒、Register[3]は59分用、マスター側はここを読みだしてからそのDATAを利用(表示)します。本来のRTCはレジスター[0]と[1]はコントロール用に使っています(ここでは何も使っていません)。
 LEDが3桁なのでMax9分59秒表示を使っています。

 コントロールはMaster動作でする物です。動かすにはMasterとSlaveの2個のICがないと作動は確認出来ません。当然両方正常に動作しなければだめです。
 結構動作するまで時間が掛かりました。
 従って、今回Masterは以前作った物を利用してSlave動作に集中しました。当初は以前のプログラムを修正しながら始めたのですが、結局だめでした。良く見るとレジスターの名前も微妙に変わっています、動作も少し変わって、コントロールもしかりです。1週間程度動くまで回り道をしながらなんとか作動するようになりました、まだ無駄な所が含まれていると思われますが気が付き次第直します。

 私が使った、Mastr動作はLED3桁表示でコントロールがリング式になっている特殊な表示方式です。ただI2CのMasterはライブリーを使っているので普通の方式と同じです。LEDの表示だけが異なっています。

 3桁表示で誤差は2ケタまで、3桁はクロックに水晶を入れないと無理かも…?

 少しタイミングのコントロールが必要で、その辺は[サンプルプログラム]をご覧下さい。

作成 [2012/4/15] 


 クロックの変更など) 

 Master側(Soft Control System)のクロックを何時もの4MHzに設定したので[SDA信号]を調べると4mSecも時間が掛かっています。
 あれ、少し時間が掛かっているなーと思い、クロックをMaster側だけですが16MHzまで上げて見ました。すると今度は1mSec近くまで下がりました。
 どうもクロックを上げた分低下したようです。念の為I2CのSlave側からもちんと信号は読み出しに対応しています。

 [SCL信号]の方も、クロックが時折狂って来ます。86uSec位あって…なんか遅くて納得出来ません。
 まあ、動けば良いんですが。



 Master  Slave  参 考 
16Mhz動作16MHz動作動作した。
同じ4MHz動作動作した。
同じ1MHz動作動作した。
同じ0.5MHz動作処理が間に合わず不作動
Masterの処理を少なくすると作動する。
4MHz動作16MHz動作動作した。
4MHz動作1MHz動作動作した。
4MHz動作0.5MHz動作動作した。

 その後、0.5MHzから0.25MHzまで下げて実験をすると動きました(マスター側のアクセスが1秒間に55回ほどあり、これを1/10にした)。これでも不安定なので結局[1MHz]に戻して使うことにしました。

 4MHzでも良いのですが周波数を下げると少し省エネになります。(2012/4/20)



 動 作 

 動作周波数を変更して見ました。どうもコントロールが遅い感じなので気になっていました。
 Masterクロック16Mhzの動作は、Softコントロールの為か「1回のアクセスで1mSec程度で処理が終わった」、これに対し「従来のクロック4MHzは処理に4mSecほど掛かった」。単純にクロック周波数に影響されています。

 慌てているわけではありませんが、少し気になり変更しながら動作を見ると、0.5MHzクロック(実働125KHz)では処理が間に合わないのか、作動しませんでした。
 それでもMasterを4MHzに変更すると作動しました。
 I2Cの性質が少しわかりました、多少誤差があっても動く仕組みになっていました。



 全 体 

 基板は以前の物を利用しています(基板は特殊な結線をしています)PIC12F1822は8Pinなので使うと小形に作れそうです。複雑な物は別ですが「ちょこっと使う」のに便利かも!
 しかも価格も安く手に入いるし…、ハードコントロールするとSoft負担も少なく面白いです。
 今回Masterはソフトでやったのは、後でAVRに移植する為の予備実験も兼ねています。

 今回は分と秒の表示と思って作りました、今後は時間もカウントしていきたいと思います(大した手間ではありませんので…ハイ…!)。

 誤差は30分程度動作させ2秒程度進みました。3桁表示させると1つ進むという結果で、まあまあです。数字的には1/700ぐらいです、これ以上は水晶の導入などが考えられますがコスト高になり、買った方が安くて正確ですから、出番は少ないかも。
 誤差があっても「この程度なら利用出来る何かがあるかも!」しれませんねー。



 Slave mode 

 今回作成したのは「簡単Slave動作」です。単純なタイマーですが参考にして下さい。上記のように色々と実験し、結局この程度の物はメインクロックは[1MHz]程度で良いことが分かりました。少し細かいコントロールをすると処理が間に合わないかもしれませんが、その時はクロックアップさせ処理して下さい。
 手書きのメモ仕様です。端子があまっていたのでLEDの1秒点滅を追加しました。後端子が2個あるのでA/D変換かI/O端子(出力)に使おうかなー。ひまを見てトライします。
 精度は取れませんので、使う方は無いと思いますが…メインでこの位は簡単に作れますけど…遊んで下さい。プログラム[ICのHex Data]はこれです。(2012/4/21 追加)



作成 [2012/4/17] 



     [MAIN MENU へ戻る]

inserted by FC2 system