ようやっとここまで来たという感じです。かれこれ1カ月くらいかかっているでしょうか。まぁこればっかりやているわけにもいかんので、その他のことも同時並行で進めていってますので、なかなかARMマイコンのことばかり手を付けてばかりでいられません。
回路図は、ルーレットの回路図を一部変更しました。P1_5はプログラム中の何かの動作確認に使えるかと思い残してあります。その他は参考書の通りスピ―カーを同じピンに配置しました。
ちなみに、ルーレットのプログラムのままスピーカーを挿入したら、スピーカー~わずかに音が出ているのが聞こえます。この時何も聞こえなかったら何かおかしい可能性があります。
基本的には参考書の通りに行えばできます。MRTの初期化については、特段良いかと思います。55~57行目はマニュアルに書いてある通りの処理をしております。
今回は、MRTの割込みが発生した場合の処理、つまりMRT_IRQHandler部分で少し悩みました。
MRTのステータスレジスタのビット0が割込みが発生したかを知るフラグのビットになっております。このレジスタのBit0が1であれば割込みが発生しているということを調べられます。問題は、MRTは4チャンネルあり、全てのチャンネルにおいてベクタテーブルのアドレスが同じだということが分かりにくくしている点です。
本来、このHandler関数が呼び出されている時点で、割込みが発生していることは分かっていることなのですが、どのチャネルで割込みが発生してもこの割込み関数が呼ばれてしまうため、ステータスレジスタのチャンネル0のビット0が1かどうかを見る必要が出てきてしまうということです。今回は、チャンネル0しか使用していないため、この関数は無駄といえば無駄でif文によるビット0の調査はいりません。
もう一つ分かりにくい点があります。
通常一般的にマイコンは、割込みが入ると、割込みを示すフラグなりを表すビットが1になる、つまりはビットが立ちます。これにより、他の割り込みが入らなくなるようにしたりするマイコンもあります。このフラグをクリアするには通常0(ゼロ)を書き込んで割込みのフラグをクリアすることが当たりま絵なのですが、ARMマイコン特有の機能かわかりませんが、ステータスレジスタのBit0に1を書き込むとフラグがクリアされるというところです。う~んなんか気持ち悪い。割込みがあれば1を示すビットに対して、さらに1を書き込むと割込み要求がクリアされる仕組みです。やっぱり気持ち悪い。ルネサス系のマイコンでは0にクリアすることが一般的なはずです。(69行目で1を書き込んでおります。)
PIO0_5は直接動作には関係ない、プログラムデバッグように単にLEDを点灯させるためのものです。