2016年11月5日土曜日

Nucleo F401RE(mbed)でMCP23S17経由でキーパッド(4×4)を使えるようにする。

Classのコンストラクタでハードウェアに結びついているオブジェクトをポインタ渡しに変更した。

他のクラスと一緒にキーパッドが使えなかった原因は、クラスの内部で使っている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

拡大