/********************************************************** 割り込みを用いて1秒ごとのLEDのON-OFFを行う **********************************************************/ /* メモ CPU割り込みマスククリアE_INT()と割り込みマスクセットD_INT()の表現 #pragma asm ANDC.B #B'01111111,CCR ;E_ENT() #pragma endasm #pragma asm ORC.B #B'10000000,CCR ;D_ENT() #pragma endasm */ #include <3048f.h> #include "h8_3048.h" #define clearTimer1Flag() (ITU1.TSR.BIT.IMFA=0) main() { P5.DDR=3; /* LED INITIALIZATION */ initTimer1Int(10000); /*時間割り込み10msec ch1使用*/ #pragma asm ANDC.B #B'01111111,CCR ;E_INT() #pragma endasm startTimer1(); /*時間割り込みタイマスタートch1*/ while(1); /*なにもしないループ*/ } int tick=0; int loop=0; /*割り込みベクタの設定は次の形式で書く .SECTION MYVEC, DATA, LOCATE=ここにベクタを書き込むアドレス .ORG ここにベクタを書き込むアドレス .DATA.L ここに割り込み関数のアドレス(通常は関数名) .SECTION P,CODE,ALIGN=2 ;これを忘れてはいけない 複数の場所に分けて複数の割り込みベクタを書く場合は「MYVEC」のところを 「MYVEC1」,「MYVEC2」,...とすればよい */ #pragma asm .SECTION MYVEC, DATA, LOCATE=H'000070 .ORG H'000070 ;IMIA1 .DATA.L _TimerIntFunc .SECTION P,CODE,ALIGN=2 ;これを忘れてはいけない #pragma endasm #pragma interrupt (TimerIntFunc) void TimerIntFunc() /*タイマ割り込みルーチン*/ { clearTimer1Flag(); /*タイマステータスフラグのクリア 忘れないこと*/ if (tick==1) { P5.DR.BYTE=1; } else { P5.DR.BYTE=2; } if (++loop==50) { tick=1-tick; loop=0; } }