にほんブログ村 その他趣味ブログ 電子工作へ

2009年03月13日

Ticolla CDE の隠し関数

TiCollaLib にはいくつかの隠し関数が入っています。
これらはマニュアルには書かれていませんし、私もまだテストしてませんので仕様もよく分かりません。このため以下は憶測でしかありません。でも、特に I2C 関連は I2C センサ の接続に使える可能性があり有用のように思います。これらの関数は TicollaLib.h ではプロトタイプ宣言されてませんので、自分でプロトタイプ宣言が必要です。


void GET_CAPTUR(byte _side, word *Value)

タイマーカウンタの値(TCH0かTCH1?)を Value に返す。_side はPWM_SIDE_CN11かPWM_SIDE_CN6を指定して TCH0 か TCH1 を選択するようです。
byte EI2C1_SendSelectSlave(byte SlaveAddr, byte _Mode)
byte EI2C1_SendAddress(word Address)
byte EI2C1_SendData(byte Chr)
byte EI2C1_SendStop(void)

I2C のハンドリング関数群のようです。I2Cメモリ関数(I2C_READとか) から呼ばれていますが、I2C 通信の全ての機能を使えるものかどうかは良く分かりません。I2C センサつけてみて検証したいと思います。
 

JAPAN ROBOTECH さんが、vectors.h や TiCollaLib.c のソースコード公開してくれれば、もっと色々出来そうなんですが... なんとかなりませんかね ?

2010.9.3  更新

結局はつないでみた I2C デバイスは皆問題なく動作しました。30kbps 程度と遅いクロックが幸いするのか、Arduino 等だとディレーが必要なデバイスもディレーがなくても大丈夫です。
ただしそれは反面レスポンスが悪いということなので、ロボデザイナで I2C デバイスを複数接続すると、高度な RCJ サッカーロボットではボトルネックとなる遅延が発生します。
ちなみに TiCollaLib のソースコードは PC に大きな負荷をかけた状態でコンパイルをして、プロジェクトの内容を捕捉すると get 出来ます。あまり詳細を書くとライセンス条項にひっかかりそうなので、以下自粛。
posted by モッパー at 21:29| Comment(1) | TrackBack(0) | ロボデザイナー
この記事へのコメント
I2C ハンドリング用関数群の解析がほぼ終わりました。I2C センサがないのでマスターへの受信はテスト出来てませんが送信は出来ることは確認してあります。(誰か I2C センサ持っている人テストしてくれないかな...)

クロックは 100Kbps なのか 400Kbps なのかどっちかなと思って測ってみると、どうも 30Kbps くらいのようです。こんなことで良いんだろうか ? マスタ側だから良いのかな ?

以下に I2C 通信に使用するコネクタの情報を書いておきました。
http://moparlab.sblo.jp/article/22584761.html
また、以下の情報あたりを見て I2C 通信自体をある程度理解しておかないと使えないと思います。
http://www.picfun.com/c15.html
以下、I2C ハンドリング関数の仕様とプロトタイプ定義です。(そのままコピペすればヘッダファイルに使えます)

// byte EI2C1_SendSelectSlave(byte SlaveAddr, byte _Mode)
// I2C スタートシーケンスを実行し、スレーブに対して I2C アドレス と 送信/受信の区別を指示する。
// SlaveAddr は I2C アドレス (上7bitがアドレス , 下 1bit が 0)
// _Mode は 送信なら 0 , 受信なら 1
// 返り値は 1 が正常終了 , それ以外は異常
extern byte EI2C1_SendSelectSlave(byte SlaveAddr, byte _Mode);

//byte EI2C1_SendData(byte Chr)
//スレーブに 1 バイトのデータを送信して ACK を待ち、STOP シーケンスを実行 ※ 1バイトの送信にしか対応出来ていない
//Chr は送信データ
// 返り値は 1 が正常終了 , それ以外は異常
extern byte EI2C1_SendData(byte Chr);

//byte EI2C1_SendStop(void)
//I2C ストップシーケンスを実行する。
// 返り値は 1 が正常終了 , それ以外は異常
extern byte EI2C1_SendStop(void);

//void Write(byte Data)
//スレーブに 1 バイトのデータを送信する。ACKシーケンスは実行しない。
// Data は送信するデータ
// 複数バイト送信するならこんな感じ
// byte Data[10];
// byte i;
// for ( i = 0 ; i < 10 ; i++){
// Write(Data[i]);
// if (GetAck()) {
// return FALSE;
// }
// SetAck(FALSE);
// }
// EI2C1_SendStop();

extern void Write(byte Data);

// byte Read(void)
// スレーブから1バイトのデータを受信する。ACKシーケンスは実行しない。
// 返り値は受信データ
// ACK シーケンスまで実行するなら以下のような感じ
// data = Read();
// SetAck(true);
// EI2C1_SendStop();
extern byte Read(void);

//void SetAck(bool Ack)
// ACK を送信する。
// Ack = true の場合 SDA を入力にする。(ACKを待つわけではない)
// Ack = false の場合 SDA を出力にして LOW (ACKを出力する)
extern void SetAck(bool Ack);

//bool GetAck(void)
// スレーブの出力するACK を待つ
// 返り値が true ならエラー、false なら正常
extern bool GetAck(void);
Posted by モッパー at 2009年05月16日 13:04
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/27568268
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
にほんブログ村 その他趣味ブログ 電子工作へ