2016年10月7日金曜日

ベースマシン NucleoシーケンサーからUI制御を分離 (コマンド+データの形式でSlaveに送信)

SPIの通信速度を約2.6MHz、データサイズを16bitにしてプログラミングしてみた。

基本的に1回に送る16bitのうちHiバイトをコマンド、Loバイトをデータとして扱うことにした。

テータ形式



CmdがHiバイトの数値、ValueがLoバイトの取りうる値。シーケンスのデータは構造体の配列になるので別扱い。Note(0x51)で16bit、Pitch(0x52)で16bit使って2 Wordでステップ1つ分のデータになる。変更するシーケンスのステップ番号はNoteのLoバイトの上位4bitに格納することにした。

配線図


4x4のキーパッドをつなげた状態で実験。つないでいるだけでキーパッドを利用するプログラムはまだしていない。

ファームウェア

Master側
https://developer.mbed.org/users/ryood/code/BaseMachine_UI_Controller/ Revision:46

Slave側(テスト用)
https://developer.mbed.org/users/ryood/code/Nucleo_rtos_SPISlave_Test/ Revision:5

メモ:

Slave(PB_1)->Master(PC_7)の割り込み線にオシロのプローブを当てておかないとSlave側のUARTで「0x0155」が表示される。Master側で割り込みを受けたときにこのコマンドを送信しているので、割り込みの誤判定っぽい。→もう少し考えて信号線をPullUpかPullDownするのも試してみる。

POTの読み取り値は7bit、32回分で移動平均をとっているがまだふらつく(分解能を6bitまで下げるのはさすがにつらい)。Master側のプログラムの「void dumpToLCD01()」でThred::wait(10)として、10ミリ秒間隔をあけてPOTの値を読み取ってLCDに表示しているが、こちらはふらつかない。なので、Slaveに送る値も多少間隔をあけてサンプリングしてみる?→POT読み取りだけスレッドを分けてみる?

LCDのバックライトの明るさを調整するのにPWM出力で電圧を調整していたが、なぜだかLCDの表示が崩れてしまうのでVDDに直結することにした。

UI Controller(SPI Master)とSequencer本体(SPI Slave)で共有する定義ファイルを作る?