BT通信 速度改善について - t.o
2016/04/25 (Mon) 10:25:39
SBDBTの加速度センサ用ファームウェアを元にして別の加速度センサから取得したデータをSBDBTからPC(Teraterm)に向けて
BTで115.2kbpsで送信させているのですが、通信の間に割込みのようなものが入っており、ビット単位でみると115.2kなのですが実行速度で見るとかなり遅くなってしまっています。
具体的には、8msほど送信を続けたのち20msほど通信が停止し、再度8msほど送信を行うという繰り返しになっています。
I2Cでのデータ取得とBT送信をタイマ割込みにしてみたのですが、別の処理(USB割込み?)がタイマ割り込みに優先しているようで20msの停止が入ってしまいます。
そこでUSB割込みの優先度を下げると今度はそもそもまともに動作しなくなってしまいました。
20msの停止時間を無くすか短くする、またはタイマ割込みの優先度を上げても動作が異常を起こさなくなる方法など、何か良い手があれば教えていただけると助かります。
Re: BT通信 速度改善について - ランエレ
2016/05/07 (Sat) 13:07:37
t.o様
SBDBTをご利用いただきまして誠にありがとうございます。
SBDBTではSPPプロファイルで100kbps程度のスループットが出ることを確認しています。
「加速度センサMMA8451Qの値をSPPで送信するサンプルプログラム」では、MMA8451QにI2Cでアクセスしますが、SBDBTではI2CペリフェラルのSCLピンが外部に出ていないためソフトウェアのI2Cで加速度センサにアクセスしています。
t.o様のプログラムで、もしI2Cの処理がボトルネックになっているようでしたら、PIC24FJ64GB004が持つI2Cのペリフェラルを使用されるとスループットが改善するかもしれません。
ただし前述したようにSBDBTではSCLピンが外部に出ていないため、SBXBTをご使用いただけると良いのではないかと思います。
ご検討宜しくお願いいたします。
Re: BT通信 速度改善について - t.o
2016/05/11 (Wed) 18:31:33
回答ありがとうございます。
加速度センサとのI2Cはボトルネックにはなっていませんでした。
全体の速度はだいぶ改善したのですが、それは__DEBUGを0にしてデバッグを切ったことによるところが大きかったです。
ここで新たに3点ほど質問があります。
まず、目的を説明すると、
1.加速度センサからI2Cで1msごとにデータを取得する
2.取得したデータを230400bpsでPCにBT送信する
という2点です。
現在の実装は、
加速度センサ用プログラムのmma8451q.cを現在使用しているセンサ用に書き直し、
取得間隔制御のためにタイマ割込みでフラグを切替えフラグ有効時以外はmain.cのsendChar関数を冒頭でreturnさせている以外はおおよそ元のままです。
そして現在の問題点は、
1.等間隔でのデータ採取ができていない
2.I2Cが1回200us、BT送信が計算上1回700us(21byte分)なので、
1ms間隔という速度自体に無理がありそうである
という2点です。
そのうえで質問としては、
1.等間隔でのデータ採取について、
1ms間隔に設定すると取得・送信の間隔が大きくぶれてしまいます。
取得・送信が他の処理によって後ろに押しのけられているものと想像します。
割込み間隔をを4ms程度まで伸ばすとだいぶ安定するのですが、1.2s程度に一度、何らかの処理によって数msから20ms程度データ取得が妨げられてしまいます。
これは割込みをさらに遅くしても変わりません。
この妨げの原因や対処法についてご存知でしたら教えて頂きたいです。
また、安定動作できる速度を上げるために変更・削除可能な処理があれば該当箇所を教えて頂けると助かります。
2.このSBDBT用加速度センサプログラムを、現在のPICではなく更に早いPIC32で動かした場合、BT制御部分含む全体が高速化されますか?
プログラム実行速度自体は当然早くなりますが、BTドングルの性能に左右されることもあるのではないかと思いまして。
3.SBDBTは3.3V駆動であり、3.3Vでも動作するBTドングルについてはマニュアルに記載がありますが、これは動作速度まで保証しているものですか?
つまり、動作はしているが100%の処理速度は出ていないということは考えられますか?
TeraTermの設定を230400bpsにした状態で受信内容を表示できているので、おそらく大丈夫だとは思うのですが、BT通信は有線のようにオシロで波形を確認できないため、もし確認済みであれば教えて頂きたいです。
ちなみに、使用しているBTドングルはPLANEXのBT-Micro4です。
質問が多くなり恐縮ですが、ご回答いただければ幸いです。
Re: BT通信 速度改善について - ランエレ
2016/05/13 (Fri) 19:59:32
t.o様
既存のSPP処理を行いながらの等間隔での追加処理は、割り込みを使わない限り不可能と思います。
また、SBDBTのサンプルプログラムではソフトウェアでのI2C処理となりますので、割り込み処理内で行う事は現実的ではありません。
そのため、BluetoothやUSBの処理を行いながらの等間隔でのデータ採取処理は、マイコン内蔵ペリフェラルのI2Cを割り込み処理で駆動することで実現可能と思います。
マイコン内蔵のペリフェラルのI2Cは、SBXBTやSBDBT32で使用可能です。(ピンがピンヘッダに出ているため)
以下ご質問に回答致します。
1. 上記の理由から、USBやBluetoothの決して軽くない既存の処理がありますので、割り込みを使わない限り等間隔でのデータ採取はできません。
2. 高速化はされますが、どんなに早くても既存の処理があるので等間隔でのデータ採取はできません。
3. BluetoothアダプタのメーカーはUSBの規格である5Vでの動作を保証しいるだけですので、3.3Vでの動作は保証されていません。
ただしアダプタ内で使用しているCSR社製のチップは仕様上3.3Vからの動作が可能となっています。
また、SBDBT5V等で5Vで駆動した時と比べても、スループットに変化はありません。
そのため、3.3Vでの動作だと処理が遅くなるということはないと考えています。
以上です。
何卒よろしくお願い申し上げます。
Re: BT通信 速度改善について - t.o
2016/05/16 (Mon) 10:17:54
ご回答ありがとうございます。
回答を受けてもう1点だけ質問させてください。
ペリフェラルのI2Cを割込み処理で用いる場合、USBやBluetooth処理の途中にも割込むこととなると思います。
USBやBTの処理は他の処理が途中に割込んでも問題なく動作するものでしょうか?
データ送信中に割込みが発生する場合などに不具合の可能性があるのではないかと懸念するのですが・・
以上、よろしくお願いいたします。
Re: BT通信 速度改善について - ランエレ
2016/05/16 (Mon) 22:21:20
t.o 様
ご連絡ありがとうございます。
SBDBTのファームウェアでは、細かいタイミング制御が必要な部分は割り込みで処理しています。
メインループから呼び出される処理は、比較的タイミングには寛容な処理となっていますので、一度に数マイクロ秒程度の処理を割り込ませる分には問題ないと思います。
ただし、割り込み処理からは可能な限り早く復帰するようにしてください。
ソフトウェアi2c処理では相手装置の処理を動作をループで待つ必要があり時間がかかりますので、割り込みで処理させるのは現実的ではありません。
何卒よろしくお願い申し上げます。
Re: BT通信 速度改善について - t.o
2016/05/20 (Fri) 17:08:28
ご回答どうもありがとうございます。
返事が遅くなりすみません。
アドバイスを元にI2C処理を割込みにしたところ、等間隔かつ安定したデータ取得ができるようになりました。
その後BT送信側が追い付かない問題が起きたりもしたのですが、取得データをいったんバッファ用の配列に入れてBT送信時にそこからまとめて取り出すかたちにすることで性能をだいぶ向上させることができました。
お力添えをいただきどうもありがとうございました。
Re: BT通信 速度改善について - ランエレ
2016/05/24 (Tue) 00:04:34
t.o 様
ご連絡ありがとうございました。
目的のことがうまくできたようで何よりです。
今後ともどうぞよろしくお願いいたします。