SH-Tiny テクニック
割り込みはマイコンでは必須の機能といっていいでしょう。
ものすごく大雑把に説明すると、
割り込みの設定をする → タイマなどの周辺モジュールが割り込みフラグを立てる → 対応した割り込みハンドラが呼び出される
という流れになります。
割り込みハンドラは、HEWによって自動生成されたintprg.cというファイルに用意されています。
※更新が滞っているため、先にサンプルだけ置いておきます。動作未検証。
#include <machine.h>
#include "iodefine.h"
volatile unsigned int timecount = 0; //時間のカウント
//タイマー割り込みハンドラからこの関数を呼び出し、処理を行う
void timer_call(void){
CMT0.CMCSR.BIT.CMF &= 0; //割り込みフラグのクリア
timecount++; //時間のカウントをインクリメント
}
//タイマー割り込みを利用してウェイト
void timer_wait(unsigned int ms){
unsigned int startcount;
volatile int i;
startcount = timecount;
while(timecount - startcount < ms){
for(i=0;i<50;i++) ;
}
}
void main(void)
{
CPG.FRQCR.WORD = 0x16db; // Iφ=PLL/2,Bφ=PLL/4,Pφ=PLL/4,MPφ=PLL/4
// Iφ=48MHz,Bφ=24MHz,Pφ=24MHz,MPφ=24MHz
STB.CR4.BIT._CMT = 0; //CMT モジュールスタンバイ解除
PFC.PECRL1.BIT.PE1MD=0x00; //IO端子に設定
PFC.PEIORL.BIT.B0 = 1; //出力端子に設定
INTC.IPRJ.BIT._CMT0 = 0x0F; // 割り込み優先度設定
set_imask(0); //全体の割り込み許可
CMT0.CMCSR.BIT.CMIE = 1; //CMTの割り込み許可
CMT0.CMCSR.BIT.CKS = 0; //φ/8 = 3MHz
CMT0.CMCOR = 3000; //1ms周期で割り込み
CMT.CMSTR.BIT.STR0 = 1; //CMTカウントスタート
//1秒周期でLED点滅
while(1){
timer_wait(500); //500ミリ秒待機
PE.DRL.BIT.B0 ^= 1; //出力を反転
}
}
#include <machine.h>
#include "vect.h"
void timer_call(); //この関数宣言を追加
.....
void INT_CMT0_CMI0(void){ timer_call(); }