Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

PIC12F675 + I2C + AT24C256B

PIC12F675にI2C接続のEEPROM AT24C256Bをつないでデータを書き込む試行錯誤。

PIC12F675にはI2Cの機能は搭載されていないので、プログラムだけで何とかする。
何とかできるらしいってことを知ったのは日本語のサイトだったのだが、どうもそこのコードはしっくり来なくて、うまく書き換えできず、PIC12F675への移植に手間取っていたんだが、それがどうやら解決できそうなめどがついたので書いている。
もちろん、悪びれもせず人様のコードを利用させていただくのだが、今回参考にさせていただいたのはPIC12F675 i2c (bit banging) code + Proteus simulationというサイトの記事だ。
まずはもらったコードのうち出力ピンの設定だけを自前の回路に合わせて変更してから書き込んで試してみる。
何も書き込まれない。
当たり前だ、肝心の部分のコードは以下の通り。

I2C_Start();
I2C_Write_Byte(0xA0);
RxByte = I2C_Read_Byte();
I2C_Send_ACK();
I2C_Stop();

そりゃ無理だわな、EEPROMに書き込む仕様になってないもの。
上のサイトはI2Cの先に何を接続するかは問題にしていなくて、単にI2Cの仕組みをBit Bangingで実現する方法を書いてあるだけだから。
I2Cの仕様書とEEPROMのデータ・シートを斜めに読んでから、
pic16f88_12f675_08
pic16f88_12f675_07
以下のように書き直して実行してみる。

I2C_Start();
I2C_Write_Byte(0xA0);
I2C_Write_Byte(0x00);
I2C_Write_Byte(0x00);
I2C_Write_Byte(0x33);
I2C_Stop();
I2C_Start();
I2C_Write_Byte(0xA0);
I2C_Write_Byte(0x00);
I2C_Write_Byte(0x02);
I2C_Write_Byte(0x44);
I2C_Stop();
I2C_Start();
I2C_Write_Byte(0xA0);
I2C_Write_Byte(0x00);
I2C_Write_Byte(0x05);
I2C_Write_Byte(0x55);
I2C_Stop();

あらかじめ0x22で埋めておいたEEPROMの、0x0000番地に0x33、0x0002番地に0x44、0x0005番地に0x55を書き込んだつもりのコードだが、Tera Termで読み込んで値を表示させてみると以下のようになる。
pic12f675_i2c_01
2番目の書き込みができていない。
このときの信号の様子をロジック・アナライザーで見てみると以下の通り。
pic16f88_12f675_02
1番目と3番目の時にはAcknowledgeがちゃんと返って来ているのに、2番目の時にはAcknowledgeが返って来ていない。
ああ、これは前にもあった、処理が間に合っていない状況(「EEPROMの書き込みサイクルと回数」)だなと思われたので、適当なDelayをはさんで、今度は0x0000番地に0xAA、0x0002番地に0xBB、0x0005番地に0xCCを書き込んだら以下のようにちゃんと書き込めた。
pic16f88_12f675_03
もちろんすべてちゃんとACKが返ってきている。
意外と簡単に出来てしまった。
もちろん、人様のコードにおんぶにだっこの状況なんだが。

これは部品箱の肥やしになりそうだったPIC12F675の活用範囲が一気に広がる感がある。
90円そこそこの外付けEEPROMを追加することでEEPROM容量だけは一気にトップ・クラスのPICも及ばない性能ということに出来るわけだ。
ちなみに秋月で入手できるPICの中で最も容量の大きいものはdsPIC30F6014Aの8kバイトで、お値段800円也、なわけだが、この4倍の容量になるのだ、EEPROM容量だけは…。
データ・ロガーに使おっと。

PIC12F675 + I2C + AT24C256B ACK待ち」に続く

このエントリーをはてなブックマークに追加

Posted under: I2C, MPLAB X, PIC12F675


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.