ごちゃごちゃで、きっと1週間で何やってるかわからなくなる、と書いていたら本当に分からなくなった。
一応、以前の状態をおさらいしながら言い訳。
以下のようにタイマー・モジュールを使っていた。
TMR1 : 8kHz(125us周期)のタイマー割り込みでblinksound();を呼ぶ。
blinksound();
クリック音のデータを順にCCP1RBに読み込む。
1通り読み終えたらTMR1を止める。
MCCP1 : 62.5kHz周期、CCP1RBに読み込まれたデータ
による可変デューティー比のPWMで音を鳴らす。
SCCP2 : 2Hzの周期の割り込みでblink();とblinksoundstart();を呼ぶ。
blink();
LEDを点滅する。
blinksoundstart();
クリック音データのカウンタを初期化し、TMR1をスタートさせる。
SCCP3 : 8kHzの周期の割り込みで、hornsound1();~hornsound3();
をフラグに応じて呼ぶ。
hornsound1();
1つめの警笛データを順にCCP1RBに読む。
1通り読み終えたらフラグに加算する。
hornsound2();
2つめの警笛データを順にCCP1RBに読む。
1通り読み終えたらSW押下をチェックする。
押してなければフラグに加算、押してれば繰り返す。
hornsound3();
3つめの警笛データを順にCCP1RBに読む。
1通り読み終えたらフラグを初期化、SCCP2の割り込みを止める。
直したい点は、音の出力がクリック音と警笛音で共有されていることだった。
そこで、以下の解決策を考えた。
SCCP2の使い方が贅沢すぎるので16bit×2つにしてSCCP3を空ける。
で、空いたSCCP3で音を鳴らすことで、音源の重複を解消する。
ところが、SCCP3でPWMをやろうとしたところで不具合が出て止まった。
「PIC32MM0064GPL028でMCCPのPWMは動くのにSCCPのPWMが動かなかった件」で解決したのだが、その間に上に書いた経緯をきれいさっぱり忘れてしまったのでこの記事を書いている。
で、現状。
TMR1 : 8kHz(125us周期)のタイマー割り込みでblinksound();を呼ぶ。
blinksound();
クリック音のデータを順にCCP1RBに読み込む。
1通り読み終えたらTMR1を止める。
MCCP1 : 62.5kHz周期、CCP1RBに読み込まれたデータ
による可変デューティー比のPWMで音を鳴らす。
SCCP2
Primary : 2Hzの周期の割り込みでblink();とblinksoundstart();を呼ぶ。
blink();
LEDを点滅する。
blinksoundstart();
クリック音データのカウンタを初期化し、TMR1をスタートさせる。
Secondary : 8kHzの周期の割り込みで、hornsound1();~hornsound3();
をフラグに応じて呼ぶ。
hornsound1();
1つめの警笛データを順にCCP1RBに読む。
1通り読み終えたらフラグに加算する。
hornsound2();
2つめの警笛データを順にCCP1RBに読む。
1通り読み終えたらSW押下をチェックする。
押してなければフラグに加算、押してれば繰り返す。
hornsound3();
3つめの警笛データを順にCCP1RBに読む。
1通り読み終えたらフラグを初期化、SCCP2の割り込みを止める。
SCCP3 : 未使用
とりあえず同じ機能を維持したままSCCP3が空いた。
そもそも、2Hz周期の割り込み発生に32bitのタイマー使うとかだったから…。
追記
結局、SCCP3を別のスピーカーに割り当てて、警笛と点滅音を別々に鳴らすようにして完成。