他のクラスと一緒にキーパッドが使えなかった原因は、クラスの内部で使っているTicker(タイマー)が原因だったようだ。キーパッド用のクラスではMCP23S17とのSPI通信を普通のメンバ関数で行っていたが、他のクラスはチャタリング対策としてTickerの割込み処理ハンドラ内で行っていた。
キーパッド用のクラスのメンバ関数内でSPI通信を行っている途中で、他のクラスからタイマー割り込みがかかってSPI通信がおかしくなっていたのかも?
また、Tickerのスタートのタイミングを初期化後にまとめて行えるように変更した。内部PullUpの指定等(これもSPI経由で行う)を行う前に、Tickerがスタートしてしまうと動作がおかしくなる。
ちょこちょこ直して、ひとまず、DebouncerIn(DigitalInのチャタリング対策)、PinDetect(ピンの状態の変化検出)、RotaryEncoder、Keypad4x4をMCP23S17経由で同時に動かすことができた。
ベースマシンのシーケンサー本体はRTOS::Timerでタイミングをとっているので、コンフリクトした場合はUI系のタイマーもTickerではなくRTOS::Timerを使うように修正した方がいいかもしれない。(参考:「mbedのRtosTimerをClassの中で使う。」)なんか自信ないなあ(@@;
mbed repogitory:
https://developer.mbed.org/users/ryood/code/ExioController_Test/ Revision:15
SPI通信のようす
ch1:MOSI ch2:SCK
拡大
0 件のコメント:
コメントを投稿