2021年12月10日(金) 21:29
なぜ、受信機 dsPIC の動作が怪しくなったのか?
メインループの構造を変えたことが、影響していると思われる。
元は受信を最優先させ、ループ先頭で受信ポーリング。受信が完了してからそのループの処理を続行させていた。一定時間内に受信ポーリングが成立しなかった場合は、タイムアウト処理へ。これが、まっとうに機能していた。
しかしこの処理の流れだと、受信ポーリング待ちの間は他の dsPIC にSPI送信できない。最大0.3秒のタイムアウトなので、ラジコン戦車という性質からするとそれほど問題にならなかった。だが、傾斜センサーの値まで送信させようとすると、送信頻度が落ち過ぎる。
そこで処理の流れを変更。ループ先頭では傾斜センサーを読み、続いて受信。その受信ではポーリングするが、頻度はループごとに1回だけ。タイムアウトまでは同じく0.3秒ぐらいになるよう調整したのだが、なぜかタイムアウトが頻発。
タイムアウトをタイマー割り込みで判定するよう変更してみたが、やはり常時タイムアウトに近い状態だ。
そもそも0.3秒ではほぼタイムアウトしなかったのに、なぜ逆にタイムアウトしまくるようになったのか?これはもう、処理の流れの変更が犯人としか考えられない。
受信ポーリングは、高頻度で受信バッファーの完全性を確認することが前提になっているようだ。
受信バッファーの完全性を確認する頻度が下がると、受信できていても次のデーターで受信バッファーが壊され、受信完了を検出できなくなっているのではないか?
傾斜センサーを高頻度で読んでSPI送信しつつ、受信バッファーも正確に読み取れるプログラム。それを実現させなばならない。
幸いにして現在、I2CもSPI送信もソフトウェア方式になっている。そして、割り込みも利用していない。つまり、割り込み処理中でi2CやSPI送信可能。
以前のように受信ポーリングを回した上で、傾斜センサーの読み取り&SPI送信を割り込みで行うようにする。30ミリ秒ごとに割り込みを発生させ、その中で実行。
結果として、少しキーレスポンス悪いかな、程度で実装できた。受信はほぼ正常にできている。確認のため液晶ディスプレイ表示を行うとI2Cバス干渉が発生するが、LCD表示を止めれば Jetson Nano とも問題なく共存できる。
これなら、ソフトウェア的な若干の工夫と強化で、本番投入できそうだ。

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
Generated by MySketch GE 1.4.1
Remodelling origin is MySketch 2.7.4