コンペア・マッチ・タイマを割り込みで使うテスト cmt_int 編(み) yamaguchi@cqpub.co.jp ● このプログラムは  Interface 2006年6月号SH-2基板を使ってコンペア・マッチ・タイマ(以下CMT) を使うテスト・プログラムです.CMTはポーリングでも割り込みでも使えるので すが,今回は割り込みを使ってみます.  単体で何かの役に立つわけではありません. ● 使い方  FDTでcmt_int.motを書き込みます.ジャンパを外した後にリセットして起動し ます.1s周期でLEDが点滅すればOKです. ● コンパイル方法  開発環境としてInterface 2006年7月号特集第4章掲載のGCCが必要です.イン ストールは該当記事を参照してください.また,/usr/local/sh-tools/binにパ スを通してください(p.80に方法がある).パスを通さない場合はMakefileを修正 してください.  makeするとダウンロード用バイナリ・ファイルcmt_int.motが生成されます.  ソース・ファイルの文字コードはEUCになっているので,編集をする場合は注 意してください. ● プログラムについて  CMTを使ってみるテストです. ▼モジュール・スタンバイ・コントロール・レジスタ  CMTを使う前にモジュール・スタンバイ・コントロール・レジスタでCMTのス タンバイ・モードを解除する必要があります. ▼CMT0割り込みの処理アドレス  CMT0のベクタ番号は144なので,これを4倍して16進数にすると0x240になるの で,0x00000240にCMT0割り込みの処理アドレスを入れています.  CMT0割り込みが発生すると,startup.sの_cmt_cmt0へ分岐し,そこからcmt_in t.c内の_cmt_cmt0_funcへ分岐しています. ▼CMTの各レジスタの設定値  キーとなるのはCMCORの設定でしょう.今回の基板ではPφ=24MHzなので,この 値で計算します.今回は求める周期が1sですが,計算式はCMTをポーリングで使う プログラムcmt_pollのドキュメントcmt_poll.txtを参照してください. ▼割り込みマスクの値  SRレジスタのI3〜I0=0b0000=0にして,すべての優先順位の割り込みを受け付 けるようにしておきます.電源投入直後はI3〜I0=0b1111=15なので,NMI以外の 割り込みが掛かりません.  HEWの場合,組み込み関数set_imask(0);でC言語から同じことが行えますが,G CCの場合は同等の関数がないので,startup.sの中で行っています. ▼CMT0割り込みの優先度  SH7144FはCMT割り込みが発生したときの優先順位を0〜15の間で選べます(0だ と割り込みマスク).ここでは優先順位15に設定することにしておきます.  これをどこで設定するかですが,SH7144Fのマニュアル「6.3.4インタラプトプ ライオリティレジスタA〜J(IPRA〜IPRJ)」を見ると,さらに「各割り込み要因と IPRの対応については『表6.2 割り込み要因とベクタアドレスおよび割り込み優 先順位一覧』を参照してください」とあります.  で,表6.2を見ると「CMT 名称CMI0 ベクタ番号144 (中略) IPR IPRG7〜IPRG4 」とあります.さらにIPRGが何番地なのか調べてみると,「25.1レジスタアドレ ス一覧」にIPRGが0xffff8354との記載があります.このアドレスは16ビット・レ ジスタのようなので,この7ビット目〜4ビット目に0xfを入れればいいことがわ かります. ▼その他 ・本プログラムを作成するにあたり,みすみロボット研究所さんの5/12のtest2. cが参考になりました.ありがとうございます.下記URLからたどれます. http://misumi.sakura.ne.jp/blog/archives/2006/05/ledinterface.html ・Interface 2006年7月号掲載の山際伸一氏作成のpractice2を参考に(というか ベースに)しました.ありがとうございます. ・make時に/usr/local/sh-tools/bin/sh-elf-gcc〜と長々と表示されるのが気に なったので,パス名部分を取ってしまいました. ・make cleanでバックアップ・ファイルも削除するようにしました. ・Makefile中で-Wall(警告をすべて表示)を指定するようにしました. ● 保証事項  本ソフトウェアは無保証とさせていただきます.