ITG-3200breakoutとPIC16F877Aを使用しています。

2つをSDA、SCL、INTで繋いでいます。

#use I2C(master, sda=PIN_C4, scl=PIN_C3, FORCE_HW, FAST)
main(){
i2c_start();
i2c_write(0xD2);//ITG-3200 breakout アドレス
printf(lcd_data,"test");//LCDに出力
}

上記プログラムを書いたのですが、testが表示されません。i2c_start直後にprintfを挿入すると表示されました。これはうまくwrite出来ていないことが原因だと思うのですが、理由が分かりません。対処法を教えてください。

またINTの機能がいまいち分かりません。こちらも教えていただけると助かります。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/11/27 23:37:47
  • 終了:2010/12/02 11:09:10

回答(2件)

id:pyopyopyo No.1

pyopyopyo回答回数340ベストアンサー獲得回数822010/11/28 18:07:25

ポイント35pt

i2c_stop()を使ってないから、だとおもいます。

i2c_start();
i2c_write(0xD2);
i2c_stop();
printf(lcd_data,"test");

とすると、うまくいきませんか?



INTは割り込みの信号線です。I2Cの線は設定&データ読み書き用で、INTの線はセンサからPICへのイベント通知専用、ということになります。

もうすこし詳しい説明は、ITG-3200のデータシート

http://www.sparkfun.com/datasheets/Sensors/Gyro/PS-ITG-3200-00-0...

をご覧ください。引用すると

5.7 Interrupts

Interrupt functionality is configured via the Interrupt Configuration register. Items that are configurable include the INT pin configuration, the interrupt latching and clearing method, and triggers for the interrupt. Items that can trigger an interrupt are (1) Clock generator locked to new reference oscillator (used when switching clock sources); and (2) new data is available to be read from the Data registers. The interrupt status can be read from the Interrupt Status register.

ということです。上記データシートの、5.1 Block Diagramの図も参考になるかとおもいます。


割り込みの具体的な使い方としては、たとえば振動を感知して警報をならす防犯用センサとかだと、

  • 1. 省エネのため、PICはスリープ状態にしておく
  • 2. 振動があったらその加速度を感知して、ITG-3200が割り込み信号を生成
  • 3. 割り込みを受けてPICが動作を再開
  • 4. 警報をならす
  • 5. 1,に戻る

という使い方ができるかとおもいます。

id:after_333sec

INTについての詳しい解説ありがとうございます。理解できました。

本題のほうですが、i2c_stopを入れても動きませんでした。

ほかに動かない理由は分かりますか?もしかしたらすでにITG-3200breakoutが壊れてしまっているのでしょうか。

2010/11/29 14:43:35
id:karuishi No.2

ニャンざぶろう回答回数764ベストアンサー獲得回数1282010/12/01 02:09:47

ポイント35pt

コメント欄が開いてなかったので、コメント欄から失礼します。

CCS C について詳しく無いので、かなりあてずっぽうです。

 

i2c_writeで応答が無いのは、

ステータスや割り込み関係でロックしてしまっているのだとは思いますが、

slaveからのACKが届いていない可能性もあります

(1)i2c_write()の戻り値が0かをチェック

(2)配線間違いや配線が長すぎないか、プルアップ抵抗を付け忘れていないか確かめる。

も行ってみてください。

 

まずは、"FORCE_HW, FAST"オプションを指定しないで、

ソフトウェア実装のI2Cでちゃんと動くか試して見る。というが速いと思います。

 

CCS-Cのフォーラムでサーチをかけると似たような事例は沢山引っかかってきますが

 http://www.ccsinfo.com/forum/search.php?

完全には一致していないようです。

id:after_333sec

プルアップ抵抗を変えたらうごくようになりました。抵抗が壊れていたのかもしれません。ありがとうございました

2010/12/02 11:08:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません