ロボット工作研究室Wiki - SH-Tiny テクニック/タイマ割り込み
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(); }